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", "flowVersion": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", "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" } ], "flowVersion": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" } ], "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>", "asked": true, "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}
Conversations
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.
POST
/
conversations
Create conversation
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", "flowVersion": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08", "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" } ], "flowVersion": "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08" } ], "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>", "asked": true, "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.
Creates a conversation — one AI-run call to one contact, by phone or on the web. You can point at contacts and agents you already have, or define them inline in the same request.
A conversation is created either to run immediately or at a scheduleTime 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.
Contacts, agents and jobs that do not exist yet can be defined inline as objects on the request. Nothing has to be created first.
The inline contact body is 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.
Complete inline workflow: when you send 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 afterwards
Job specification options: you can name the job in several ways: - Create inline: use
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.
The inline agent 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" } ] } }}
Inline creation mints a permanent agent per conversation. That is fine for a one-off,
but calling a list of 50 people this way leaves 50 near-identical custom agents behind.
When the same flow will call more than one person, create the agent once via
POST /agents and pass agentId.
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
A job-optional focus ignores the contact’s assignments entirely. You do not need to
pick one with 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.
Custom agents are always jobless. An agent created with a 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()}
Validation: The API will return a 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 GENERIC or a custom agent
You attach a job to a custom agent’s conversation
Note that a 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.
Inline job behaviour: when you provide 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.
Creating a conversation consumes call minutes from your company’s billing plan. Make sure
enough are available before scheduling in bulk — the API returns 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.
With no 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.
A 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.
Note: a contactId must already exist. For an inline contact, every required field
(firstName, lastName, email or phoneNumber, gdprExpiryDate) must be present.
When using an existing contactId, you can optionally name a jobId to record which job the conversation is for. This matters when the contact is associated with several jobs.
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}
When the contact is associated with several jobs, you must name the jobId:
{ "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()}
Multiple job assignments: if the contact holds several and you send no 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.
Job association: the 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.
Job selection rules: 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.
Every resource involved (contact, agent, job) must belong to the same company as your API key. The API validates ownership and returns 403 Forbidden when they do not.
Scenario 3: Conversation for a Contact with Multiple Jobs
// 1. The contact is associated with several jobsconst 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-uuidconsole.log(`Conversation created for job: ${conversation.jobId}`);
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.
Billing bypass: all billing checks are skipped — no minutes are consumed
Immediate completion: the conversation is created with COMPLETED status straight away
Mock analysis: realistic analysis data is generated and stored
Webhook events: both conversation.completed and analysis.completed fire
Default duration: 5 minutes
The event names above are the default 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.
Webhooks: fires conversation.completed and analysis.completed
Billing: no minutes consumed, no billing checks performed
Test conversations carry isTest: true. They appear in listings and can be queried like any other, but they do not affect billing or production metrics.
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.
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.
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.
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.
Deprecated alias of contactId, always identical to it. Kept for the life of v1 so existing integrations keep working; new callers should read contactId.
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.
Identity of the agent configuration (flow, guardrails and context, as compiled) that the most recent call in this conversation was placed with. A content hash: two calls that ran the same configuration carry the same value, and any edit that changes what the agent says produces a new one. Each entry in callAttempts carries its own, since a retry placed after an edit runs the edited configuration. null for agents without a designed flow and for calls placed before 2026-09-23.
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.
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.
Example:
false
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"InstaView API","colors":{"primary":"#2741F9","light":"#4D5FFF","dark":"#1D34C4"},"logo":{"light":"https://mintcdn.com/instaview/srYC_WLR3UAwt0PY/logo/light.svg?fit=max\u0026auto=format\u0026n=srYC_WLR3UAwt0PY\u0026q=85\u0026s=a941bc948e20b3503a55e49b4438bfd8","dark":"https://mintcdn.com/instaview/srYC_WLR3UAwt0PY/logo/dark.svg?fit=max\u0026auto=format\u0026n=srYC_WLR3UAwt0PY\u0026q=85\u0026s=fbf32075feea3b5f404b1aef04c449ea"},"favicon":"https://mintcdn.com/instaview/srYC_WLR3UAwt0PY/favicon.svg?fit=max\u0026auto=format\u0026n=srYC_WLR3UAwt0PY\u0026q=85\u0026s=1499b591dcea46419afceafb5b77004e","api":{"playground":{}},"navbar":{"links":[{"href":"https://support.instaview.sk","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://app.instaview.sk"}},"footer":{"socials":{"github":"https://github.com/StarIC-s-r-o","linkedin":"https://www.linkedin.com/company/instaviewai"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"instaview","hasAudioNarration":false,"actualSubdomain":"instaview","customDomains":["docs.instaview.sk"],"gitSource":{"type":"github","owner":"staric-s-r-o","repo":"instaview","deployBranch":"main","contentDirectory":"apps/docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adb630a25769d6ebcdc21d7","collectionId":"9e3238e9-e795-4633-9eb1-2fa50fb2b100","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adb630a25769d6ebcdc21d7"},"entitlements":{},"buildId":"6adb630a25769d6ebcdc21d7","clientVersion":"0.0.3965","searchFilterCounts":[{"language":"default","tag":"API Reference","count":75},{"language":"default","tag":"Documentation","count":20},{"language":"default","tag":"Changelog","count":13},{"language":"default","tag":"Runs","count":10},{"language":"default","tag":"2026","count":10},{"language":"default","tag":"Resources","count":9},{"language":"default","tag":"Agents","count":8},{"language":"default","tag":"Conversations","count":8},{"language":"default","tag":"Sourcing","count":8},{"language":"default","tag":"Webhooks","count":7}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/conversations/create-conversation","slug":"/api-reference/conversations/create-conversation","pageMetadata":{"title":"Create Conversation","openapi":"POST /conversations","description":"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.","href":"/api-reference/conversations/create-conversation"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"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.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Card,CardGroup,CodeBlock,Heading,Info,Table,Warning}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`POST /interviews`}),` is a permanent alias of this endpoint and keeps working unchanged, with the same scopes and the same response. See `,_jsx(_components.a,{href:`/api-reference/introduction#resource-names`,children:`Resource names`}),`.`]})}),`\n`,_jsx(_components.p,{children:`Creates a conversation — one AI-run call to one contact, by phone or on the web. You can point at contacts and agents you already have, or define them inline in the same request.`}),`\n`,_jsx(Heading,{level:`2`,id:`overview`,children:`Overview`}),`\n`,_jsxs(_components.p,{children:[`A conversation is created either to run immediately or at a `,_jsx(_components.code,{children:`scheduleTime`}),` you name. Everything it needs can come from ids you already hold (`,_jsx(_components.code,{children:`contactId`}),`, `,_jsx(_components.code,{children:`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.`]}),`\n`,_jsx(Heading,{level:`2`,id:`use-cases`,children:`Use Cases`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Scheduled calls`}),`: Run the conversation at a specific date and time`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Immediate calls`}),`: Start as soon as the agent’s calling hours allow`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Inline resources`}),`: Create a conversation without pre-creating the contact or the agent`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Bulk outreach`}),`: Automate one conversation per contact across a list`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`inline-contact-agent-and-job-support`,children:`Inline Contact, Agent, and Job Support`}),`\n`,_jsx(_components.p,{children:`Contacts, agents and jobs that do not exist yet can be defined inline as objects on the request. Nothing has to be created first.`}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`The inline contact body is `,_jsx(_components.code,{children:`contact`}),`. `,_jsx(_components.code,{children:`candidate`}),` is its permanent legacy alias and takes the\nsame fields; send one or the other, not both. The same holds for `,_jsx(_components.code,{children:`contactId`}),` and `,_jsx(_components.code,{children:`candidateId`}),`.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`inline-contact-with-job-association`,children:`Inline Contact with Job Association`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`23`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`23`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"contact\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"jobId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"job-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"firstName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Jane\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"lastName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Doe\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"email\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"jane@example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"phoneNumber\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"+1234567890\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"gdprExpiryDate\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"2026-11-16\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"workHistory\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"companyName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Tech Corp\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"candidatePosition\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Software Engineer\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"referenceName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Jane Smith\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"referencePhone\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"+1234567890\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"startDate\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"2020-01-01\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"endDate\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"2022-12-31\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agentId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"existing-agent-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"scheduleTime\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toISOString`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`inline-contact-with-inline-job`,children:`Inline Contact with Inline Job`}),`\n`,_jsx(_components.p,{children:`Create both the contact and the job inline for a completely self-contained request:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`20`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`20`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"contact\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"firstName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Jane\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"lastName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Doe\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"email\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"jane@example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"phoneNumber\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"+1234567890\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"gdprExpiryDate\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"2026-11-16\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"job\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"jobTitle\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Senior Backend Engineer\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"jobDescription\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"We are looking for a senior engineer...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"requiredSkills\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"TypeScript\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"NestJS\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"PostgreSQL\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"niceToHaveSkills\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Redis\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"AWS\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"languages\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"EN\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"experience\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"SENIOR\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"contractType\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"FULL_TIME\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agentId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"existing-agent-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"scheduleTime\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toISOString`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Complete inline workflow`}),`: when you send `,_jsx(_components.code,{children:`contact`}),` together with `,_jsx(_components.code,{children:`job`}),`: - a new `,_jsx(_components.strong,{children:`Job`}),` is\ncreated for your company - a new `,_jsx(_components.strong,{children:`Contact`}),` is created and automatically associated with that\njob - the `,_jsx(_components.strong,{children:`Conversation`}),` is linked to both - all three become permanent resources you can\nfetch and manage afterwards`]})}),`\n`,_jsx(Heading,{level:`3`,id:`inline-contact-without-job-association`,children:`Inline Contact without Job Association`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`11`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"contact\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"firstName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Jane\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"lastName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Doe\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"email\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"jane@example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"phoneNumber\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"+1234567890\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"gdprExpiryDate\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"2026-11-16\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agentId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"existing-agent-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"scheduleTime\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toISOString`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Job specification options`}),`: you can name the job in several ways: - `,_jsx(_components.strong,{children:`Create inline`}),`: use\n`,_jsx(_components.code,{children:`job`}),` at the top level to create a new job - `,_jsx(_components.strong,{children:`Reference existing`}),`: use `,_jsx(_components.code,{children:`jobId`}),` at the top\nlevel to link an existing job - `,_jsx(_components.strong,{children:`Within the inline contact`}),`: use `,_jsx(_components.code,{children:`jobId`}),` inside `,_jsx(_components.code,{children:`contact`}),`\nfor a more compact request when creating the contact and the association together - `,_jsx(_components.strong,{children:`No\njob`}),`: omit every job field. A job is optional on a conversation, and most callers outside\nhiring never send one; the contact can still be assigned to jobs later via the `,_jsx(_components.a,{href:`/api-reference/contacts/update-contact`,children:`update\ncontact endpoint`}),`. `,_jsx(_components.strong,{children:`Priority`}),`: when several job\nsources are provided, `,_jsx(_components.code,{children:`job`}),` wins over top-level `,_jsx(_components.code,{children:`jobId`}),`, which wins over `,_jsx(_components.code,{children:`contact.jobId`}),`.\n`,_jsx(_components.strong,{children:`XOR validation`}),`: `,_jsx(_components.code,{children:`contact.jobId`}),` cannot be combined with a top-level `,_jsx(_components.code,{children:`jobId`}),` or `,_jsx(_components.code,{children:`job`}),`,\nsince that would be ambiguous. Pick one per request.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`inline-custom-agent`,children:`Inline Custom Agent`}),`\n`,_jsxs(_components.p,{children:[`The inline `,_jsx(_components.code,{children:`agent`}),` accepts the same custom-agent fields as `,_jsx(_components.a,{href:`/api-reference/agents/create-agent#custom-agents`,children:`Create Agent`}),`: send a `,_jsx(_components.code,{children:`flow`}),` (optionally with `,_jsx(_components.code,{children:`guardrails`}),`, `,_jsx(_components.code,{children:`contextConfig`}),` and `,_jsx(_components.code,{children:`analyticsConfig`}),`) and the agent is created as a custom agent, running the conversation you designed instead of a template. As there, `,_jsx(_components.code,{children:`focus`}),` must be omitted when a `,_jsx(_components.code,{children:`flow`}),` is present, ids and `,_jsx(_components.code,{children:`schemaVersion`}),` are assigned by InstaView, and an invalid flow is rejected with a `,_jsx(_components.code,{children:`422`}),` carrying `,_jsxs(_components.a,{href:`/api-reference/agents/create-agent#flow-validation-errors`,children:[`the same `,_jsx(_components.code,{children:`errors`}),` array`]}),` — every problem found, each with the `,_jsx(_components.code,{children:`path`}),` of the block it is on. No conversation is created when that happens.`]}),`\n`,_jsxs(_components.p,{children:[`Sending `,_jsx(_components.code,{children:`analyticsConfig`}),` here is how a one-off call returns structured data rather than just a transcript — the results come back as `,_jsx(_components.a,{href:`/api-reference/conversations/get-conversation#custom-agent-analytics`,children:_jsx(_components.code,{children:`analytics`})}),` on this conversation and on its `,_jsx(_components.code,{children:`analysis.completed`}),` webhook.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`28`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`28`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"contact\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"firstName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Jana\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"lastName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Novák\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"phoneNumber\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"+421900123456\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"gdprExpiryDate\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"2027-08-02\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agent\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"name\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Renewal check-in\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"PHONE\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"language\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"EN\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"duration\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 10`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"companyPhoneNumberId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"123e4567-e89b-12d3-a456-426614174000\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"flow\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"firstMessage\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"first_message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"text\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Hi {{contact.first_name}}, quick question about your renewal.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"sections\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [{ `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"sequential\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"prompt\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Ask whether they intend to renew, and note any blockers.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"lastMessage\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"last_message\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"text\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Thanks — we'll follow up by email.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"analyticsConfig\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"extractionTargets\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"key\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"intends_to_renew\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"label\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Intends to renew\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"bool\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ],`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"outcomes\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"label\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Renewal confirmed\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"description\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"The contact committed to renewing\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ]`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Inline creation mints a permanent agent per conversation.`}),` That is fine for a one-off,\nbut calling a list of 50 people this way leaves 50 near-identical custom agents behind.\nWhen the same flow will call more than one person, create the agent once via\n`,_jsx(_components.a,{href:`/api-reference/agents/create-agent`,children:`POST /agents`}),` and pass `,_jsx(_components.code,{children:`agentId`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`job-optional-focuses`,children:`Job-Optional Focuses`}),`\n`,_jsxs(_components.p,{children:[`Two kinds of agent are `,_jsx(_components.strong,{children:`job-optional`}),` — they can call someone without associating the\nconversation with a job: `,_jsx(_components.code,{children:`GENERIC`}),`, and any custom agent (one created with a `,_jsx(_components.code,{children:`flow`}),`). Every other\nfocus requires a job. The two are not identical, and the difference is worth knowing:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{}),_jsx(_components.th,{children:_jsx(_components.code,{children:`GENERIC`})}),_jsx(_components.th,{children:`Custom (flow-based)`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Conversation without a job`}),_jsx(_components.td,{children:`Yes, always`}),_jsx(_components.td,{children:`Yes, always`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Contact may hold job assignments`}),_jsx(_components.td,{children:`Yes, any number`}),_jsx(_components.td,{children:`Yes, any number`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`jobId`}),` needed for a multi-job contact`]}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:`No`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`May you attach a job anyway`}),_jsx(_components.td,{children:`Yes, optional`}),_jsx(_components.td,{children:_jsxs(_components.strong,{children:[`No — `,_jsx(_components.code,{children:`400`})]})})]})]})]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`A job-optional focus ignores the contact’s assignments entirely.`}),` You do not need to\npick one with `,_jsx(_components.code,{children:`jobId`}),`, and a contact assigned to five jobs is called exactly like one\nassigned to none. The “specify a `,_jsx(_components.code,{children:`jobId`}),`” error described under `,_jsx(_components.a,{href:`#contact-with-multiple-jobs`,children:`Contact with Multiple\nJobs`}),` applies only to job-requiring focuses.`]})}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Custom agents are always jobless.`}),` An agent created with a `,_jsx(_components.code,{children:`flow`}),` is job-agnostic by\ndesign: its prompt comes entirely from the flow, so a job would never be read. This is\nstricter than `,_jsx(_components.code,{children:`GENERIC`}),`, which merely makes a job optional — sending `,_jsx(_components.code,{children:`job`}),`, `,_jsx(_components.code,{children:`jobId`}),` or\n`,_jsx(_components.code,{children:`contact.jobId`}),` for a custom agent is a `,_jsx(_components.code,{children:`400`}),` rather than a silently ignored field.`]})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`GENERIC`}),` agents exist for conversations that are not about a job at all. That covers most\nnon-hiring work, and in hiring it covers:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Talent pool building`}),`: calling people about future openings rather than a specific role`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`General outreach`}),`: reaching contacts in your database who hold no job assignment`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Pre-screening`}),`: an initial conversation before anyone is matched to a position`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`creating-a-jobless-conversation-with-generic-focus`,children:`Creating a Jobless Conversation with GENERIC Focus`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`12`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`12`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"contact\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"firstName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Jane\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"lastName\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Doe\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"email\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"jane@example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"phoneNumber\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"+1234567890\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"gdprExpiryDate\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"2026-11-16\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // No jobId - a GENERIC conversation does not need one`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agentId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"generic-agent-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Agent with focus: \"GENERIC\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"scheduleTime\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toISOString`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(Info,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Validation`}),`: The API will return a `,_jsx(_components.code,{children:`400 Bad Request`}),` error if:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`You try to create a jobless conversation (no job specified) with an agent whose focus\nrequires a job — that is, anything other than `,_jsx(_components.code,{children:`GENERIC`}),` or a custom agent`]}),`\n`,_jsx(_components.li,{children:`You attach a job to a custom agent’s conversation`}),`\n`]}),_jsxs(_components.p,{children:[`Note that a `,_jsx(_components.code,{children:`GENERIC`}),` conversation is `,_jsx(_components.strong,{children:`not`}),` rejected for a contact who has job assignments:\nthe assignments are simply not used.`]}),_jsxs(_components.p,{children:[`For more detail on how a `,_jsx(_components.code,{children:`GENERIC`}),` conversation is analysed, see the `,_jsx(_components.a,{href:`/guides/resources/conversations#conversation-types--analysis`,children:`Conversations Resource Guide`}),`.`]})]}),`\n`,_jsx(Heading,{level:`3`,id:`existing-contact-with-inline-job`,children:`Existing Contact with Inline Job`}),`\n`,_jsxs(_components.p,{children:[`You can also define the job inline using `,_jsx(_components.code,{children:`job`}),` when you already have the contact but don’t want to create a separate job resource first.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`39`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`39`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"contactId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"contact-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"job\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"jobTitle\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Senior Backend Engineer\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"jobDescription\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"We are looking for a senior engineer...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"jobUrl\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://company.com/jobs/123\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"benefits\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Health insurance, remote work\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"requiredSkills\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"TypeScript\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"NestJS\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"PostgreSQL\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"niceToHaveSkills\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Redis\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"AWS\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"languages\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"EN\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"languageRequirements\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"language\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"EN\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"proficiency\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"C1\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ],`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"education\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"BACHELORS\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"experience\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"SENIOR\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"otherRequirements\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Comfortable with async communication\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"contractType\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"FULL_TIME\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"location\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"workMode\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"REMOTE\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"street\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Main Street 1\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"city\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Bratislava\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"postalCode\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"81101\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"countryCode\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"SK\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"salary\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"min\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 4000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"max\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 5500`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"currency\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"EUR\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"period\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"MONTHLY\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"humanRecruiter\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"John Doe\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"metadata\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"externalJobId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"JOB-12345\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"department\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Engineering\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agentId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"existing-agent-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"scheduleTime\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toISOString`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Inline job behaviour`}),`: when you provide `,_jsx(_components.code,{children:`job`}),` together with an existing `,_jsx(_components.code,{children:`contactId`}),`, the\nAPI: - creates a full `,_jsx(_components.strong,{children:`Job`}),` for your company from the inline fields - associates the contact\nwith that job if they were not already linked - links the conversation to the new job.\n`,_jsx(_components.code,{children:`jobId`}),` and `,_jsx(_components.code,{children:`job`}),` are `,_jsx(_components.strong,{children:`mutually exclusive (XOR)`}),`: use either `,_jsx(_components.code,{children:`jobId`}),` (an existing job) or\n`,_jsx(_components.code,{children:`job`}),` (an inline definition), never both.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`billing-and-limits`,children:`Billing and Limits`}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[`Creating a conversation consumes call minutes from your company’s billing plan. Make sure\nenough are available before scheduling in bulk — the API returns `,_jsx(_components.code,{children:`402 Payment Required`}),` once\nbilling limits are exceeded, with a `,_jsx(_components.code,{children:`billing`}),` object naming what the request needed and what\nwas left. See `,_jsx(_components.a,{href:`/guides/error-handling#billing-errors`,children:`Billing errors`}),`.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Exception:`}),` test conversations (created with `,_jsx(_components.code,{children:`isTest: true`}),`) consume no minutes and bypass all billing checks.`]})]}),`\n`,_jsx(Heading,{level:`2`,id:`scheduling-options`,children:`Scheduling Options`}),`\n`,_jsx(Heading,{level:`3`,id:`immediate-conversation`,children:`Immediate Conversation`}),`\n`,_jsxs(_components.p,{children:[`Omit `,_jsx(_components.code,{children:`scheduleTime`}),` to start the conversation as soon as possible:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"contactId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"contact-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agentId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"agent-uuid\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`With no `,_jsx(_components.code,{children:`scheduleTime`}),`, the time is ours to pick, so the agent’s `,_jsx(_components.a,{href:`/api-reference/agents/create-agent#retries-and-calling-hours`,children:`calling window`}),` applies: a conversation created outside those hours goes out when they next open, in the contact’s own timezone.`]}),`\n`,_jsx(Heading,{level:`3`,id:`scheduled-conversation`,children:`Scheduled Conversation`}),`\n`,_jsxs(_components.p,{children:[`Provide a future `,_jsx(_components.code,{children:`scheduleTime`}),` timestamp (max 30 days in the future):`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"contactId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"contact-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agentId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"agent-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"scheduleTime\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toISOString`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(Info,{children:[_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`A `,_jsx(_components.code,{children:`scheduleTime`}),` you send is used exactly as given`]}),`, including when it falls outside the\nagent’s calling window. You know things the window does not, such as an appointment the contact\nagreed to, so naming a time overrides the hours rather than being moved into them. The window\nstill governs everything we schedule ourselves: conversations created without a `,_jsx(_components.code,{children:`scheduleTime`}),`,\nand every retry after a call that did not connect.`]}),_jsxs(_components.p,{children:[`The future and 30-day limits above still apply, and are the only bounds on the value. Within\nthem the offset only pins the moment: `,_jsx(_components.code,{children:`14:00:00Z`}),` and `,_jsx(_components.code,{children:`16:00:00+02:00`}),` are the same instant and\nare treated identically.`]})]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Note`}),`: a `,_jsx(_components.code,{children:`contactId`}),` must already exist. For an inline `,_jsx(_components.code,{children:`contact`}),`, every required field\n(`,_jsx(_components.code,{children:`firstName`}),`, `,_jsx(_components.code,{children:`lastName`}),`, `,_jsx(_components.code,{children:`email`}),` or `,_jsx(_components.code,{children:`phoneNumber`}),`, `,_jsx(_components.code,{children:`gdprExpiryDate`}),`) must be present.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`job-selection-for-existing-contacts`,children:`Job Selection for Existing Contacts`}),`\n`,_jsxs(_components.p,{children:[`When using an existing `,_jsx(_components.code,{children:`contactId`}),`, you can optionally name a `,_jsx(_components.code,{children:`jobId`}),` to record which job the conversation is for. This matters when the contact is associated with several jobs.`]}),`\n`,_jsx(Heading,{level:`3`,id:`contact-with-single-job`,children:`Contact with Single Job`}),`\n`,_jsxs(_components.p,{children:[`If the contact has one job or none, `,_jsx(_components.code,{children:`jobId`}),` is optional — the contact’s first job is used if there is one:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"contactId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"contact-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agentId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"agent-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"scheduleTime\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toISOString`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` // jobId is optional - the contact's first job is used`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`contact-with-multiple-jobs`,children:`Contact with Multiple Jobs`}),`\n`,_jsxs(_components.p,{children:[`When the contact is associated with several jobs, you `,_jsx(_components.strong,{children:`must`}),` name the `,_jsx(_components.code,{children:`jobId`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`6`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`6`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"contactId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"contact-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"jobId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"job-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Required when the contact has multiple job assignments`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agentId\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"agent-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"scheduleTime\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toISOString`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`()`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Multiple job assignments`}),`: if the contact holds several and you send no `,_jsx(_components.code,{children:`jobId`}),`, the API\nreturns `,_jsx(_components.code,{children:`400 Bad Request`}),` with the message `,_jsx(_components.em,{children:`“This candidate is assigned to multiple jobs.\nPlease specify a ‘jobId’ to associate with this interview.”`}),` — quoted as it is actually sent.\nError strings are matched on by integrations, so they keep their original wording; only the\nresource names in this documentation changed.`]}),_jsxs(_components.p,{children:[`This applies only to job-requiring focuses. `,_jsx(_components.code,{children:`GENERIC`}),` and custom (flow-based) agents are\njob-optional, so they call a multi-job contact without a `,_jsx(_components.code,{children:`jobId`}),` — and a custom agent\nrejects one outright.`]})]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Job association`}),`: the `,_jsx(_components.code,{children:`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.`]})}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Job selection rules`}),`: `,_jsx(_components.code,{children:`jobId`}),` and `,_jsx(_components.code,{children:`job`}),` are XOR (mutually exclusive) — provide `,_jsx(_components.code,{children:`jobId`}),` and\nomit `,_jsx(_components.code,{children:`job`}),`, or provide `,_jsx(_components.code,{children:`job`}),` and omit `,_jsx(_components.code,{children:`jobId`}),`. When `,_jsx(_components.code,{children:`job`}),` is used: a new job is created for\nyour company, that job becomes the conversation’s `,_jsx(_components.code,{children:`jobId`}),`, and the contact is associated with\nit before the conversation is created.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`company-isolation`,children:`Company Isolation`}),`\n`,_jsxs(_components.p,{children:[`Every resource involved (contact, agent, job) must belong to the same company as your API key. The API validates ownership and returns `,_jsx(_components.code,{children:`403 Forbidden`}),` when they do not.`]}),`\n`,_jsx(Heading,{level:`2`,id:`complete-workflow-examples`,children:`Complete Workflow Examples`}),`\n`,_jsx(Heading,{level:`3`,id:`scenario-1-conversation-with-job-association`,children:`Scenario 1: Conversation with Job Association`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`23`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`23`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 1. Create a job (if not exists)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` job`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` createJob`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` title:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Senior Software Engineer\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` status:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"OPEN\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 2. Create the conversation with an inline contact linked to that job`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` conversation`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` createConversation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` contact:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` jobId:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` job`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` firstName:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Jane\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` lastName:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Doe\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` email:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"jane@example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` phoneNumber:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"+1234567890\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` gdprExpiryDate:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"2026-11-16\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` agentId:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agent-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` scheduleTime:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 24`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toISOString`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(), `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Tomorrow`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 3. Monitor its status`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` status`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` getConversation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`conversation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`Conversation status: \"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`status`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`status`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`scenario-2-conversation-without-job-association`,children:`Scenario 2: Conversation without Job Association`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`18`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`18`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 1. Create a conversation for a contact who holds no job assignment`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` conversation`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` createConversation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` contact:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` firstName:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"John\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` lastName:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Smith\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` email:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"john@example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` phoneNumber:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"+1234567890\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` gdprExpiryDate:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"2026-11-16\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` agentId:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agent-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` scheduleTime:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 24`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toISOString`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 2. Later, assign the contact to jobs if you need to`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` contactId`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` conversation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`contactId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`await`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` updateContact`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`contactId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` jobIds:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"job-uuid-1\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"job-uuid-2\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`scenario-3-conversation-for-a-contact-with-multiple-jobs`,children:`Scenario 3: Conversation for a Contact with Multiple Jobs`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`14`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`14`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 1. The contact is associated with several jobs`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` contact`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` getContact`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"contact-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// contact.jobIds = [\"job-1-uuid\", \"job-2-uuid\", \"job-3-uuid\"]`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 2. Create the conversation for one of them (jobId is required here)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` conversation`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` createConversation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` contactId:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"contact-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` jobId:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"job-2-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Must specify which job`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` agentId:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agent-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` scheduleTime:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toISOString`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 3. The conversation is now associated with job-2-uuid`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`Conversation created for job: \"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`conversation`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`jobId`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`scenario-4-existing-contact-with-inline-job`,children:`Scenario 4: Existing Contact with Inline Job`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`22`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`22`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 1. The contact already exists in your system`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` contactId`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"contact-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 2. Create the conversation and define the job inline`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` conversation`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` createConversation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` contactId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` job:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` jobTitle:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Senior Backend Engineer\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` jobDescription:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"We are looking for a senior engineer...\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` requiredSkills:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"TypeScript\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"NestJS\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"PostgreSQL\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` niceToHaveSkills:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Redis\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"AWS\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` languages:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"EN\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` experience:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"SENIOR\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` contractType:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"FULL_TIME\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` location:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`workMode:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"REMOTE\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`countryCode:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"SK\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` metadata:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`externalJobId:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"JOB-12345\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` agentId:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agent-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` scheduleTime:`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` new`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`Date`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`now`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`() `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 24`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 60`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` *`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 1000`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`toISOString`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(),`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`Conversation jobId: \"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`conversation`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`jobId`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`]})})}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`The inline job is saved as a regular `,_jsx(_components.strong,{children:`Job`}),`. You can fetch and manage it afterwards through\nthe Jobs API using the `,_jsx(_components.code,{children:`jobId`}),` returned on the conversation.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`test-mode`,children:`Test Mode`}),`\n`,_jsx(_components.p,{children:`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.`}),`\n`,_jsx(Heading,{level:`3`,id:`when-to-use-test-mode`,children:`When to Use Test Mode`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Testing webhook handlers`}),`: check that your endpoint handles `,_jsx(_components.code,{children:`conversation.completed`}),` and `,_jsx(_components.code,{children:`analysis.completed`}),` correctly`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Integration testing`}),`: exercise your processing logic without waiting for a real call`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Development`}),`: build against completed conversations on demand`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Demos`}),`: create sample conversations to show`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`how-test-mode-works`,children:`How Test Mode Works`}),`\n`,_jsxs(_components.p,{children:[`When you set `,_jsx(_components.code,{children:`isTest: true`}),`:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Billing bypass`}),`: all billing checks are skipped — no minutes are consumed`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Immediate completion`}),`: the conversation is created with `,_jsx(_components.code,{children:`COMPLETED`}),` status straight away`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Mock analysis`}),`: realistic analysis data is generated and stored`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Webhook events`}),`: both `,_jsx(_components.code,{children:`conversation.completed`}),` and `,_jsx(_components.code,{children:`analysis.completed`}),` fire`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Default duration`}),`: 5 minutes`]}),`\n`]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`The event names above are the default `,_jsx(_components.code,{children:`NEUTRAL`}),` vocabulary. A webhook registered before that\noption existed is on `,_jsx(_components.code,{children:`LEGACY`}),` and receives `,_jsx(_components.code,{children:`interview.completed`}),` instead — same payload, same\ntrigger. See `,_jsx(_components.a,{href:`/guides/webhooks#event-name-vocabulary`,children:`Event name vocabulary`}),`.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`example-creating-a-test-conversation`,children:`Example: Creating a Test Conversation`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`15`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`15`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`const`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:` testConversation`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` createConversation`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`({`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` contact:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` firstName:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Jane\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` lastName:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Doe\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` email:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"jane@example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` phoneNumber:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"+1234567890\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` gdprExpiryDate:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"2026-11-16\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` agentId:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"agent-uuid\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` isTest:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// Enable test mode`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`});`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`Test conversation created: \"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`testConversation`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`id`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`Status: \"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`testConversation`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`status`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`); `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// \"COMPLETED\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`Duration: \"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`testConversation`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`durationMinutes`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\" minutes`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`); `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 5`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`test-conversation-characteristics`,children:`Test Conversation Characteristics`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Status`}),`: always `,_jsx(_components.code,{children:`COMPLETED`}),` immediately`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Duration`}),`: 5 minutes (300 seconds)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Analysis`}),`: mock analysis, including:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`conversation check results (`,_jsx(_components.code,{children:`candidateInterest: true`}),`, `,_jsx(_components.code,{children:`conversationCompleted: true`}),`)`]}),`\n`,_jsx(_components.li,{children:`analysis scores and recommendations`}),`\n`,_jsx(_components.li,{children:`mock transcript segments`}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Webhooks`}),`: fires `,_jsx(_components.code,{children:`conversation.completed`}),` and `,_jsx(_components.code,{children:`analysis.completed`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Billing`}),`: no minutes consumed, no billing checks performed`]}),`\n`]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`Test conversations carry `,_jsx(_components.code,{children:`isTest: true`}),`. They appear in listings and can be queried like any other, but they do not affect billing or production metrics.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`related-resources`,children:`Related Resources`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Conversations Resource Guide`,icon:`microphone`,href:`/guides/resources/conversations`,children:_jsx(_components.p,{children:`Learn how conversations are run and analysed`})}),_jsx(Card,{title:`Agents Resource Guide`,icon:`robot`,href:`/guides/resources/agents`,children:_jsx(_components.p,{children:`Configure the agents that run them`})}),_jsx(Card,{title:`Contacts Resource Guide`,icon:`user`,href:`/guides/resources/contacts`,children:_jsx(_components.p,{children:`Manage the people you call`})}),_jsx(Card,{title:`Billing Guide`,icon:`credit-card`,href:`/guides/resources/billing`,children:_jsx(_components.p,{children:`Understand call costs and limits`})}),_jsx(Card,{title:`Webhooks Guide`,icon:`webhook`,href:`/guides/webhooks`,children:_jsx(_components.p,{children:`Learn about webhook events and testing`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Create Conversation","openapi":"POST /conversations","description":"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.","href":"/api-reference/conversations/create-conversation"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Overview","slug":"overview","depth":2,"children":[]},{"title":"Use Cases","slug":"use-cases","depth":2,"children":[]},{"title":"Inline Contact, Agent, and Job Support","slug":"inline-contact-agent-and-job-support","depth":2,"children":[{"title":"Inline Contact with Job Association","slug":"inline-contact-with-job-association","depth":3,"children":[]},{"title":"Inline Contact with Inline Job","slug":"inline-contact-with-inline-job","depth":3,"children":[]},{"title":"Inline Contact without Job Association","slug":"inline-contact-without-job-association","depth":3,"children":[]},{"title":"Inline Custom Agent","slug":"inline-custom-agent","depth":3,"children":[]}]},{"title":"Job-Optional Focuses","slug":"job-optional-focuses","depth":2,"children":[{"title":"Creating a Jobless Conversation with GENERIC Focus","slug":"creating-a-jobless-conversation-with-generic-focus","depth":3,"children":[]},{"title":"Existing Contact with Inline Job","slug":"existing-contact-with-inline-job","depth":3,"children":[]}]},{"title":"Billing and Limits","slug":"billing-and-limits","depth":2,"children":[]},{"title":"Scheduling Options","slug":"scheduling-options","depth":2,"children":[{"title":"Immediate Conversation","slug":"immediate-conversation","depth":3,"children":[]},{"title":"Scheduled Conversation","slug":"scheduled-conversation","depth":3,"children":[]}]},{"title":"Job Selection for Existing Contacts","slug":"job-selection-for-existing-contacts","depth":2,"children":[{"title":"Contact with Single Job","slug":"contact-with-single-job","depth":3,"children":[]},{"title":"Contact with Multiple Jobs","slug":"contact-with-multiple-jobs","depth":3,"children":[]}]},{"title":"Company Isolation","slug":"company-isolation","depth":2,"children":[]},{"title":"Complete Workflow Examples","slug":"complete-workflow-examples","depth":2,"children":[{"title":"Scenario 1: Conversation with Job Association","slug":"scenario-1-conversation-with-job-association","depth":3,"children":[]},{"title":"Scenario 2: Conversation without Job Association","slug":"scenario-2-conversation-without-job-association","depth":3,"children":[]},{"title":"Scenario 3: Conversation for a Contact with Multiple Jobs","slug":"scenario-3-conversation-for-a-contact-with-multiple-jobs","depth":3,"children":[]},{"title":"Scenario 4: Existing Contact with Inline Job","slug":"scenario-4-existing-contact-with-inline-job","depth":3,"children":[]}]},{"title":"Test Mode","slug":"test-mode","depth":2,"children":[{"title":"When to Use Test Mode","slug":"when-to-use-test-mode","depth":3,"children":[]},{"title":"How Test Mode Works","slug":"how-test-mode-works","depth":3,"children":[]},{"title":"Example: Creating a Test Conversation","slug":"example-creating-a-test-conversation","depth":3,"children":[]},{"title":"Test Conversation Characteristics","slug":"test-conversation-characteristics","depth":3,"children":[]}]},{"title":"Related Resources","slug":"related-resources","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"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.","operationId":"PublicInterviewsController_createInterview_v1","parameters":["d7027c48-5998-4e38-bee4-d899caf86511"],"requestBody":"70ae0204-f10a-4549-820c-2d68515043fd","responses":{"200":"6a13554f-1c81-4aa8-9fb6-c12482f23a69","201":"c03cc7f7-592b-479e-b28c-e06e8bb8f35a","400":"8e377c84-bf9b-4e37-a0ba-ee540819b857","401":"c15eaedc-f1e8-440d-af51-d84ad9e127c1","402":"35f40284-c747-4a03-8193-eac0f25d6984","403":"6bee66f9-b444-46fd-bb80-fe1fa4b2f849","404":"a12c919c-9651-4d71-8c39-d49cea628238","422":"c922b6cf-f5ba-445a-a4b2-ece973d9076a","429":"31cd6bc6-c44a-4e5f-8d54-246858cb8c48"},"security":["d381dc5d-ea46-4dbd-a0ca-165aa3101979"],"summary":"Create conversation","tags":["Conversations"],"method":"post","type":"path","servers":["fefe9da2-a252-4644-8424-0eaff357a7a8"],"path":"/conversations","baseUrlOptions":["https://api.instaview.sk"],"title":"Create conversation","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"d7027c48-5998-4e38-bee4-d899caf86511":{"name":"companyId","required":false,"in":"query","description":"Required for ATS API keys to specify which company to access. Ignored for standard company API keys.","schema":{"type":"string","isRequired":false,"description":"Required for ATS API keys to specify which company to access. Ignored for standard company API keys.","uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["jobId","agentId","contactId"],"properties":{"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.0.contactId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","isRequired":true,"uniqueKey":"oneOf.0.jobId","typeLabel":"string\u003cuuid>"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.0.agentId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.0.candidateId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.0.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.0.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.0.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.0.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.0.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.0.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.0.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.0.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.0.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.0.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.0.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.0.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.0.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.0.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.0.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.0.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.0.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.0.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.0.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.0.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.0.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.0.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.0.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.0.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.0.job","typeLabel":"object"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.0.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.0.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.0.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.0.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.0.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.0.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.0.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.0.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.0.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.0.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.0.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.0.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.0.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.0.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.0.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.0.contact","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.0.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.0.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.0.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.0.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.0.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.0.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.0.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.0.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.0.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.0.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.0.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.0.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.0.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.0.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.0.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.0.candidate","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.0.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.0.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.0.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.0.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.0.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.0.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.0.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.0.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.0.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.0.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.0.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.0.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.0.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.0.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.0.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.0.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.0.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.0.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.0.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.0.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.0.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.0.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.0.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.0.agent.oneOf.0.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.0.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.0.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.0.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.0.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.0.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.0.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.0.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.0.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.0.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.0.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.0.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.0.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.0.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.0.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.0.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.0.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.0.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.0.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.0.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.0.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.0.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.0.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.0.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.0.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.0.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.0.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.0.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.0.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.0.agent.oneOf.1.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.0.agent.oneOf.1","typeLabel":"object"}],"uniqueKey":"oneOf.0.agent","typeLabel":"object"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.0.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.0.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.0.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.0","typeLabel":"object"},{"type":"object","required":["job","agentId","contactId"],"properties":{"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.1.contactId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.1.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.1.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.1.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.1.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.1.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.1.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.1.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.1.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.1.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.1.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.1.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.1.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.1.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.1.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.1.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.1.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.1.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.1.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.1.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.1.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.1.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.1.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.1.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.1.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.1.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.1.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.1.job.metadata","typeLabel":"object"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.1.job","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.1.agentId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.1.candidateId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.1.jobId","typeLabel":"string\u003cuuid>"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.1.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.1.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.1.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.1.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.1.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.1.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.1.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.1.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.1.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.1.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.1.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.1.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.1.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.1.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.1.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.1.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.1.contact","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.1.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.1.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.1.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.1.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.1.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.1.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.1.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.1.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.1.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.1.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.1.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.1.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.1.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.1.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.1.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.1.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.1.candidate","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.1.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.1.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.1.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.1.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.1.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.1.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.1.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.1.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.1.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.1.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.1.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.1.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.1.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.1.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.1.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.1.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.1.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.1.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.1.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.1.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.1.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.1.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.1.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.1.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.1.agent.oneOf.0.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.1.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.1.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.1.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.1.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.1.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.1.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.1.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.1.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.1.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.1.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.1.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.1.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.1.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.1.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.1.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.1.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.1.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.1.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.1.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.1.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.1.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.1.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.1.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.1.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.1.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.1.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.1.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.1.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.1.agent.oneOf.1.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.1.agent.oneOf.1","typeLabel":"object"}],"uniqueKey":"oneOf.1.agent","typeLabel":"object"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.1.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.1.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.1.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.1","typeLabel":"object"},{"type":"object","required":["agentId","contactId"],"properties":{"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.2.contactId","typeLabel":"string\u003cuuid>"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.2.agentId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.2.candidateId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.2.jobId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.2.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.2.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.2.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.2.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.2.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.2.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.2.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.2.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.2.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.2.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.2.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.2.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.2.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.2.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.2.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.2.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.2.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.2.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.2.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.2.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.2.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.2.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.2.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.2.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.2.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.2.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.2.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.2.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.2.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.2.job","typeLabel":"object"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.2.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.2.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.2.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.2.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.2.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.2.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.2.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.2.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.2.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.2.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.2.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.2.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.2.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.2.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.2.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.2.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.2.contact","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.2.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.2.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.2.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.2.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.2.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.2.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.2.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.2.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.2.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.2.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.2.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.2.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.2.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.2.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.2.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.2.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.2.candidate","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.2.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.2.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.2.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.2.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.2.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.2.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.2.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.2.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.2.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.2.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.2.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.2.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.2.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.2.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.2.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.2.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.2.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.2.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.2.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.2.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.2.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.2.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.2.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.2.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.2.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.2.agent.oneOf.0.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.2.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.2.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.2.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.2.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.2.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.2.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.2.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.2.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.2.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.2.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.2.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.2.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.2.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.2.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.2.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.2.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.2.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.2.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.2.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.2.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.2.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.2.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.2.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.2.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.2.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.2.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.2.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.2.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.2.agent.oneOf.1.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.2.agent.oneOf.1","typeLabel":"object"}],"uniqueKey":"oneOf.2.agent","typeLabel":"object"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.2.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.2.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.2.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.2","typeLabel":"object"},{"type":"object","required":["jobId","agent","contactId"],"properties":{"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.3.contactId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","isRequired":true,"uniqueKey":"oneOf.3.jobId","typeLabel":"string\u003cuuid>"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.3.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.3.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.3.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.3.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.3.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.3.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.3.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.3.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.3.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.3.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.3.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.3.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.3.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.3.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.3.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.3.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.3.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.3.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.3.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.3.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.3.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.3.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.3.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.3.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.3.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.3.agent.oneOf.0.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.3.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.3.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.3.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.3.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.3.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.3.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.3.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.3.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.3.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.3.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.3.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.3.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.3.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.3.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.3.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.3.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.3.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.3.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.3.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.3.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.3.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.3.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.3.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.3.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.3.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.3.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.3.agent.oneOf.1.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.3.agent.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.3.agent","typeLabel":"object"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.3.candidateId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.3.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.3.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.3.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.3.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.3.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.3.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.3.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.3.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.3.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.3.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.3.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.3.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.3.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.3.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.3.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.3.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.3.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.3.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.3.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.3.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.3.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.3.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.3.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.3.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.3.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.3.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.3.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.3.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.3.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.3.job","typeLabel":"object"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.3.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.3.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.3.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.3.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.3.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.3.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.3.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.3.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.3.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.3.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.3.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.3.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.3.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.3.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.3.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.3.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.3.contact","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.3.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.3.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.3.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.3.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.3.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.3.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.3.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.3.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.3.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.3.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.3.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.3.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.3.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.3.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.3.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.3.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.3.candidate","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","uniqueKey":"oneOf.3.agentId","typeLabel":"string\u003cuuid>"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.3.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.3.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.3.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.3","typeLabel":"object"},{"type":"object","required":["job","agent","contactId"],"properties":{"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.4.contactId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.4.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.4.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.4.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.4.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.4.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.4.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.4.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.4.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.4.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.4.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.4.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.4.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.4.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.4.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.4.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.4.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.4.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.4.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.4.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.4.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.4.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.4.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.4.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.4.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.4.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.4.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.4.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.4.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.4.job.metadata","typeLabel":"object"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.4.job","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.4.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.4.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.4.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.4.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.4.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.4.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.4.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.4.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.4.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.4.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.4.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.4.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.4.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.4.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.4.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.4.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.4.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.4.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.4.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.4.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.4.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.4.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.4.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.4.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.4.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.4.agent.oneOf.0.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.4.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.4.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.4.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.4.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.4.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.4.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.4.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.4.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.4.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.4.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.4.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.4.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.4.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.4.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.4.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.4.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.4.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.4.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.4.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.4.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.4.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.4.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.4.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.4.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.4.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.4.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.4.agent.oneOf.1.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.4.agent.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.4.agent","typeLabel":"object"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.4.candidateId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.4.jobId","typeLabel":"string\u003cuuid>"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.4.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.4.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.4.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.4.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.4.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.4.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.4.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.4.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.4.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.4.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.4.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.4.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.4.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.4.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.4.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.4.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.4.contact","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.4.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.4.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.4.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.4.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.4.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.4.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.4.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.4.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.4.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.4.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.4.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.4.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.4.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.4.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.4.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.4.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.4.candidate","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","uniqueKey":"oneOf.4.agentId","typeLabel":"string\u003cuuid>"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.4.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.4.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.4.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.4","typeLabel":"object"},{"type":"object","required":["agent","contactId"],"properties":{"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.5.contactId","typeLabel":"string\u003cuuid>"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.5.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.5.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.5.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.5.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.5.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.5.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.5.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.5.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.5.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.5.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.5.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.5.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.5.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.5.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.5.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.5.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.5.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.5.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.5.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.5.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.5.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.5.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.5.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.5.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.5.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.5.agent.oneOf.0.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.5.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.5.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.5.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.5.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.5.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.5.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.5.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.5.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.5.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.5.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.5.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.5.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.5.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.5.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.5.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.5.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.5.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.5.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.5.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.5.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.5.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.5.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.5.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.5.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.5.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.5.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.5.agent.oneOf.1.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.5.agent.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.5.agent","typeLabel":"object"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.5.candidateId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.5.jobId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.5.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.5.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.5.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.5.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.5.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.5.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.5.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.5.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.5.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.5.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.5.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.5.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.5.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.5.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.5.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.5.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.5.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.5.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.5.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.5.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.5.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.5.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.5.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.5.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.5.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.5.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.5.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.5.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.5.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.5.job","typeLabel":"object"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.5.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.5.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.5.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.5.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.5.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.5.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.5.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.5.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.5.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.5.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.5.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.5.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.5.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.5.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.5.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.5.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.5.contact","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.5.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.5.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.5.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.5.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.5.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.5.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.5.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.5.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.5.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.5.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.5.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.5.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.5.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.5.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.5.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.5.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.5.candidate","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","uniqueKey":"oneOf.5.agentId","typeLabel":"string\u003cuuid>"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.5.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.5.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.5.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.5","typeLabel":"object"},{"type":"object","required":["jobId","agentId","candidateId"],"properties":{"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"isRequired":true,"uniqueKey":"oneOf.6.candidateId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","isRequired":true,"uniqueKey":"oneOf.6.jobId","typeLabel":"string\u003cuuid>"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.6.agentId","typeLabel":"string\u003cuuid>"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.6.contactId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.6.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.6.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.6.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.6.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.6.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.6.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.6.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.6.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.6.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.6.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.6.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.6.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.6.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.6.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.6.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.6.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.6.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.6.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.6.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.6.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.6.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.6.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.6.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.6.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.6.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.6.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.6.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.6.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.6.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.6.job","typeLabel":"object"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.6.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.6.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.6.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.6.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.6.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.6.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.6.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.6.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.6.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.6.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.6.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.6.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.6.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.6.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.6.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.6.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.6.contact","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.6.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.6.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.6.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.6.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.6.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.6.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.6.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.6.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.6.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.6.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.6.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.6.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.6.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.6.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.6.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.6.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.6.candidate","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.6.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.6.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.6.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.6.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.6.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.6.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.6.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.6.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.6.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.6.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.6.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.6.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.6.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.6.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.6.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.6.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.6.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.6.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.6.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.6.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.6.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.6.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.6.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.6.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.6.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.6.agent.oneOf.0.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.6.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.6.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.6.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.6.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.6.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.6.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.6.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.6.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.6.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.6.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.6.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.6.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.6.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.6.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.6.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.6.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.6.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.6.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.6.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.6.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.6.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.6.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.6.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.6.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.6.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.6.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.6.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.6.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.6.agent.oneOf.1.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.6.agent.oneOf.1","typeLabel":"object"}],"uniqueKey":"oneOf.6.agent","typeLabel":"object"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.6.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.6.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.6.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.6","typeLabel":"object"},{"type":"object","required":["job","agentId","candidateId"],"properties":{"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"isRequired":true,"uniqueKey":"oneOf.7.candidateId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.7.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.7.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.7.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.7.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.7.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.7.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.7.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.7.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.7.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.7.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.7.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.7.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.7.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.7.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.7.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.7.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.7.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.7.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.7.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.7.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.7.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.7.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.7.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.7.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.7.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.7.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.7.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.7.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.7.job.metadata","typeLabel":"object"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.7.job","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.7.agentId","typeLabel":"string\u003cuuid>"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.7.contactId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.7.jobId","typeLabel":"string\u003cuuid>"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.7.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.7.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.7.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.7.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.7.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.7.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.7.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.7.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.7.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.7.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.7.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.7.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.7.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.7.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.7.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.7.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.7.contact","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.7.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.7.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.7.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.7.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.7.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.7.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.7.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.7.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.7.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.7.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.7.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.7.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.7.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.7.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.7.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.7.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.7.candidate","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.7.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.7.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.7.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.7.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.7.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.7.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.7.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.7.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.7.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.7.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.7.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.7.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.7.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.7.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.7.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.7.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.7.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.7.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.7.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.7.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.7.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.7.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.7.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.7.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.7.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.7.agent.oneOf.0.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.7.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.7.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.7.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.7.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.7.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.7.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.7.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.7.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.7.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.7.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.7.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.7.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.7.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.7.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.7.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.7.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.7.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.7.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.7.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.7.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.7.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.7.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.7.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.7.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.7.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.7.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.7.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.7.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.7.agent.oneOf.1.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.7.agent.oneOf.1","typeLabel":"object"}],"uniqueKey":"oneOf.7.agent","typeLabel":"object"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.7.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.7.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.7.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.7","typeLabel":"object"},{"type":"object","required":["agentId","candidateId"],"properties":{"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"isRequired":true,"uniqueKey":"oneOf.8.candidateId","typeLabel":"string\u003cuuid>"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.8.agentId","typeLabel":"string\u003cuuid>"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.8.contactId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.8.jobId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.8.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.8.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.8.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.8.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.8.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.8.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.8.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.8.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.8.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.8.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.8.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.8.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.8.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.8.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.8.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.8.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.8.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.8.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.8.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.8.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.8.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.8.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.8.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.8.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.8.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.8.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.8.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.8.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.8.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.8.job","typeLabel":"object"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.8.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.8.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.8.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.8.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.8.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.8.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.8.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.8.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.8.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.8.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.8.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.8.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.8.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.8.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.8.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.8.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.8.contact","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.8.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.8.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.8.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.8.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.8.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.8.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.8.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.8.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.8.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.8.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.8.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.8.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.8.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.8.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.8.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.8.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.8.candidate","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.8.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.8.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.8.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.8.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.8.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.8.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.8.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.8.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.8.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.8.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.8.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.8.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.8.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.8.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.8.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.8.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.8.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.8.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.8.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.8.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.8.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.8.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.8.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.8.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.8.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.8.agent.oneOf.0.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.8.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.8.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.8.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.8.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.8.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.8.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.8.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.8.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.8.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.8.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.8.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.8.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.8.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.8.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.8.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.8.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.8.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.8.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.8.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.8.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.8.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.8.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.8.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.8.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.8.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.8.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.8.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.8.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.8.agent.oneOf.1.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.8.agent.oneOf.1","typeLabel":"object"}],"uniqueKey":"oneOf.8.agent","typeLabel":"object"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.8.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.8.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.8.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.8","typeLabel":"object"},{"type":"object","required":["jobId","agent","candidateId"],"properties":{"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"isRequired":true,"uniqueKey":"oneOf.9.candidateId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","isRequired":true,"uniqueKey":"oneOf.9.jobId","typeLabel":"string\u003cuuid>"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.9.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.9.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.9.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.9.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.9.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.9.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.9.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.9.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.9.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.9.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.9.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.9.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.9.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.9.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.9.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.9.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.9.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.9.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.9.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.9.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.9.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.9.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.9.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.9.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.9.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.9.agent.oneOf.0.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.9.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.9.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.9.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.9.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.9.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.9.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.9.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.9.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.9.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.9.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.9.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.9.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.9.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.9.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.9.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.9.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.9.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.9.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.9.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.9.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.9.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.9.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.9.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.9.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.9.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.9.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.9.agent.oneOf.1.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.9.agent.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.9.agent","typeLabel":"object"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.9.contactId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.9.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.9.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.9.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.9.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.9.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.9.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.9.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.9.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.9.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.9.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.9.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.9.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.9.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.9.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.9.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.9.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.9.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.9.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.9.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.9.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.9.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.9.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.9.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.9.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.9.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.9.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.9.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.9.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.9.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.9.job","typeLabel":"object"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.9.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.9.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.9.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.9.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.9.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.9.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.9.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.9.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.9.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.9.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.9.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.9.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.9.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.9.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.9.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.9.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.9.contact","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.9.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.9.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.9.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.9.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.9.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.9.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.9.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.9.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.9.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.9.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.9.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.9.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.9.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.9.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.9.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.9.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.9.candidate","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","uniqueKey":"oneOf.9.agentId","typeLabel":"string\u003cuuid>"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.9.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.9.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.9.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.9","typeLabel":"object"},{"type":"object","required":["job","agent","candidateId"],"properties":{"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"isRequired":true,"uniqueKey":"oneOf.10.candidateId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.10.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.10.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.10.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.10.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.10.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.10.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.10.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.10.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.10.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.10.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.10.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.10.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.10.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.10.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.10.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.10.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.10.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.10.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.10.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.10.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.10.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.10.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.10.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.10.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.10.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.10.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.10.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.10.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.10.job.metadata","typeLabel":"object"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.10.job","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.10.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.10.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.10.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.10.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.10.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.10.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.10.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.10.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.10.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.10.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.10.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.10.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.10.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.10.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.10.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.10.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.10.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.10.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.10.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.10.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.10.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.10.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.10.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.10.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.10.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.10.agent.oneOf.0.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.10.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.10.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.10.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.10.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.10.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.10.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.10.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.10.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.10.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.10.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.10.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.10.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.10.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.10.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.10.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.10.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.10.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.10.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.10.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.10.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.10.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.10.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.10.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.10.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.10.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.10.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.10.agent.oneOf.1.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.10.agent.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.10.agent","typeLabel":"object"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.10.contactId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.10.jobId","typeLabel":"string\u003cuuid>"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.10.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.10.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.10.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.10.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.10.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.10.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.10.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.10.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.10.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.10.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.10.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.10.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.10.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.10.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.10.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.10.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.10.contact","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.10.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.10.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.10.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.10.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.10.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.10.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.10.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.10.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.10.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.10.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.10.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.10.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.10.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.10.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.10.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.10.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.10.candidate","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","uniqueKey":"oneOf.10.agentId","typeLabel":"string\u003cuuid>"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.10.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.10.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.10.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.10","typeLabel":"object"},{"type":"object","required":["agent","candidateId"],"properties":{"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"isRequired":true,"uniqueKey":"oneOf.11.candidateId","typeLabel":"string\u003cuuid>"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.11.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.11.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.11.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.11.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.11.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.11.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.11.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.11.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.11.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.11.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.11.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.11.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.11.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.11.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.11.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.11.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.11.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.11.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.11.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.11.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.11.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.11.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.11.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.11.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.11.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.11.agent.oneOf.0.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.11.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.11.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.11.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.11.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.11.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.11.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.11.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.11.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.11.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.11.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.11.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.11.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.11.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.11.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.11.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.11.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.11.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.11.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.11.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.11.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.11.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.11.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.11.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.11.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.11.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.11.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.11.agent.oneOf.1.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.11.agent.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.11.agent","typeLabel":"object"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.11.contactId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.11.jobId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.11.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.11.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.11.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.11.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.11.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.11.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.11.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.11.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.11.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.11.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.11.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.11.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.11.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.11.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.11.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.11.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.11.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.11.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.11.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.11.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.11.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.11.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.11.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.11.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.11.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.11.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.11.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.11.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.11.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.11.job","typeLabel":"object"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.11.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.11.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.11.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.11.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.11.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.11.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.11.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.11.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.11.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.11.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.11.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.11.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.11.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.11.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.11.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.11.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.11.contact","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.11.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.11.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.11.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.11.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.11.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.11.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.11.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.11.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.11.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.11.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.11.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.11.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.11.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.11.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.11.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.11.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.11.candidate","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","uniqueKey":"oneOf.11.agentId","typeLabel":"string\u003cuuid>"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.11.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.11.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.11.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.11","typeLabel":"object"},{"type":"object","required":["jobId","agentId","contact"],"properties":{"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","isRequired":true,"uniqueKey":"oneOf.12.jobId","typeLabel":"string\u003cuuid>"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.12.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.12.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.12.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.12.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.12.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.12.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.12.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.12.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.12.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.12.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.12.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.12.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.12.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.12.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.12.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.12.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.12.contact","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.12.agentId","typeLabel":"string\u003cuuid>"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.12.contactId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.12.candidateId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.12.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.12.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.12.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.12.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.12.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.12.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.12.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.12.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.12.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.12.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.12.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.12.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.12.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.12.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.12.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.12.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.12.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.12.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.12.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.12.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.12.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.12.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.12.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.12.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.12.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.12.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.12.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.12.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.12.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.12.job","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.12.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.12.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.12.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.12.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.12.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.12.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.12.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.12.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.12.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.12.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.12.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.12.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.12.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.12.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.12.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.12.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.12.candidate","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.12.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.12.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.12.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.12.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.12.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.12.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.12.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.12.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.12.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.12.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.12.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.12.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.12.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.12.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.12.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.12.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.12.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.12.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.12.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.12.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.12.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.12.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.12.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.12.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.12.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.12.agent.oneOf.0.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.12.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.12.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.12.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.12.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.12.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.12.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.12.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.12.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.12.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.12.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.12.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.12.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.12.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.12.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.12.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.12.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.12.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.12.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.12.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.12.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.12.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.12.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.12.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.12.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.12.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.12.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.12.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.12.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.12.agent.oneOf.1.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.12.agent.oneOf.1","typeLabel":"object"}],"uniqueKey":"oneOf.12.agent","typeLabel":"object"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.12.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.12.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.12.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.12","typeLabel":"object"},{"type":"object","required":["job","agentId","contact"],"properties":{"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.13.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.13.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.13.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.13.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.13.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.13.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.13.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.13.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.13.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.13.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.13.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.13.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.13.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.13.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.13.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.13.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.13.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.13.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.13.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.13.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.13.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.13.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.13.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.13.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.13.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.13.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.13.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.13.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.13.job.metadata","typeLabel":"object"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.13.job","typeLabel":"object"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.13.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.13.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.13.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.13.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.13.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.13.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.13.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.13.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.13.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.13.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.13.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.13.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.13.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.13.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.13.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.13.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.13.contact","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.13.agentId","typeLabel":"string\u003cuuid>"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.13.contactId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.13.candidateId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.13.jobId","typeLabel":"string\u003cuuid>"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.13.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.13.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.13.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.13.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.13.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.13.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.13.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.13.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.13.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.13.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.13.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.13.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.13.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.13.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.13.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.13.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.13.candidate","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.13.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.13.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.13.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.13.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.13.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.13.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.13.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.13.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.13.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.13.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.13.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.13.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.13.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.13.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.13.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.13.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.13.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.13.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.13.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.13.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.13.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.13.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.13.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.13.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.13.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.13.agent.oneOf.0.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.13.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.13.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.13.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.13.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.13.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.13.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.13.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.13.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.13.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.13.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.13.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.13.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.13.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.13.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.13.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.13.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.13.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.13.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.13.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.13.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.13.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.13.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.13.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.13.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.13.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.13.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.13.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.13.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.13.agent.oneOf.1.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.13.agent.oneOf.1","typeLabel":"object"}],"uniqueKey":"oneOf.13.agent","typeLabel":"object"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.13.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.13.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.13.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.13","typeLabel":"object"},{"type":"object","required":["agentId","contact"],"properties":{"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.14.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.14.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.14.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.14.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.14.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.14.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.14.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.14.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.14.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.14.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.14.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.14.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.14.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.14.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.14.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.14.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.14.contact","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.14.agentId","typeLabel":"string\u003cuuid>"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.14.contactId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.14.candidateId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.14.jobId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.14.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.14.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.14.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.14.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.14.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.14.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.14.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.14.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.14.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.14.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.14.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.14.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.14.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.14.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.14.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.14.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.14.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.14.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.14.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.14.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.14.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.14.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.14.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.14.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.14.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.14.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.14.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.14.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.14.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.14.job","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.14.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.14.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.14.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.14.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.14.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.14.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.14.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.14.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.14.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.14.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.14.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.14.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.14.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.14.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.14.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.14.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.14.candidate","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.14.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.14.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.14.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.14.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.14.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.14.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.14.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.14.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.14.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.14.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.14.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.14.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.14.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.14.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.14.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.14.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.14.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.14.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.14.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.14.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.14.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.14.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.14.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.14.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.14.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.14.agent.oneOf.0.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.14.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.14.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.14.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.14.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.14.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.14.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.14.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.14.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.14.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.14.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.14.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.14.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.14.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.14.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.14.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.14.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.14.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.14.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.14.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.14.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.14.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.14.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.14.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.14.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.14.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.14.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.14.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.14.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.14.agent.oneOf.1.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.14.agent.oneOf.1","typeLabel":"object"}],"uniqueKey":"oneOf.14.agent","typeLabel":"object"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.14.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.14.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.14.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.14","typeLabel":"object"},{"type":"object","required":["jobId","agent","contact"],"properties":{"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","isRequired":true,"uniqueKey":"oneOf.15.jobId","typeLabel":"string\u003cuuid>"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.15.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.15.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.15.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.15.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.15.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.15.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.15.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.15.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.15.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.15.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.15.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.15.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.15.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.15.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.15.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.15.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.15.contact","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.15.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.15.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.15.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.15.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.15.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.15.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.15.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.15.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.15.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.15.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.15.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.15.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.15.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.15.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.15.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.15.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.15.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.15.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.15.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.15.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.15.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.15.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.15.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.15.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.15.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.15.agent.oneOf.0.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.15.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.15.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.15.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.15.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.15.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.15.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.15.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.15.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.15.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.15.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.15.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.15.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.15.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.15.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.15.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.15.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.15.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.15.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.15.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.15.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.15.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.15.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.15.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.15.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.15.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.15.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.15.agent.oneOf.1.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.15.agent.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.15.agent","typeLabel":"object"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.15.contactId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.15.candidateId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.15.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.15.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.15.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.15.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.15.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.15.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.15.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.15.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.15.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.15.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.15.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.15.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.15.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.15.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.15.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.15.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.15.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.15.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.15.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.15.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.15.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.15.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.15.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.15.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.15.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.15.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.15.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.15.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.15.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.15.job","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.15.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.15.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.15.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.15.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.15.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.15.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.15.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.15.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.15.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.15.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.15.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.15.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.15.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.15.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.15.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.15.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.15.candidate","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","uniqueKey":"oneOf.15.agentId","typeLabel":"string\u003cuuid>"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.15.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.15.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.15.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.15","typeLabel":"object"},{"type":"object","required":["job","agent","contact"],"properties":{"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.16.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.16.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.16.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.16.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.16.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.16.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.16.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.16.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.16.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.16.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.16.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.16.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.16.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.16.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.16.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.16.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.16.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.16.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.16.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.16.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.16.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.16.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.16.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.16.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.16.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.16.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.16.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.16.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.16.job.metadata","typeLabel":"object"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.16.job","typeLabel":"object"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.16.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.16.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.16.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.16.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.16.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.16.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.16.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.16.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.16.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.16.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.16.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.16.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.16.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.16.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.16.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.16.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.16.contact","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.16.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.16.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.16.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.16.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.16.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.16.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.16.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.16.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.16.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.16.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.16.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.16.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.16.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.16.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.16.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.16.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.16.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.16.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.16.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.16.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.16.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.16.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.16.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.16.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.16.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.16.agent.oneOf.0.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.16.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.16.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.16.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.16.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.16.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.16.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.16.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.16.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.16.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.16.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.16.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.16.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.16.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.16.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.16.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.16.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.16.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.16.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.16.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.16.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.16.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.16.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.16.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.16.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.16.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.16.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.16.agent.oneOf.1.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.16.agent.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.16.agent","typeLabel":"object"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.16.contactId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.16.candidateId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.16.jobId","typeLabel":"string\u003cuuid>"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.16.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.16.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.16.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.16.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.16.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.16.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.16.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.16.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.16.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.16.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.16.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.16.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.16.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.16.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.16.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.16.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.16.candidate","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","uniqueKey":"oneOf.16.agentId","typeLabel":"string\u003cuuid>"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.16.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.16.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.16.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.16","typeLabel":"object"},{"type":"object","required":["agent","contact"],"properties":{"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.17.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.17.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.17.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.17.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.17.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.17.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.17.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.17.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.17.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.17.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.17.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.17.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.17.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.17.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.17.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.17.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.17.contact","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.17.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.17.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.17.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.17.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.17.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.17.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.17.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.17.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.17.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.17.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.17.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.17.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.17.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.17.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.17.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.17.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.17.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.17.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.17.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.17.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.17.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.17.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.17.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.17.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.17.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.17.agent.oneOf.0.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.17.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.17.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.17.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.17.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.17.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.17.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.17.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.17.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.17.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.17.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.17.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.17.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.17.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.17.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.17.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.17.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.17.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.17.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.17.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.17.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.17.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.17.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.17.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.17.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.17.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.17.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.17.agent.oneOf.1.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.17.agent.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.17.agent","typeLabel":"object"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.17.contactId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.17.candidateId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.17.jobId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.17.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.17.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.17.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.17.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.17.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.17.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.17.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.17.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.17.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.17.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.17.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.17.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.17.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.17.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.17.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.17.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.17.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.17.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.17.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.17.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.17.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.17.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.17.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.17.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.17.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.17.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.17.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.17.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.17.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.17.job","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.17.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.17.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.17.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.17.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.17.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.17.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.17.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.17.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.17.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.17.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.17.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.17.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.17.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.17.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.17.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.17.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.17.candidate","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","uniqueKey":"oneOf.17.agentId","typeLabel":"string\u003cuuid>"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.17.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.17.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.17.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.17","typeLabel":"object"},{"type":"object","required":["jobId","agentId","candidate"],"properties":{"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","isRequired":true,"uniqueKey":"oneOf.18.jobId","typeLabel":"string\u003cuuid>"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.18.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.18.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.18.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.18.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.18.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.18.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.18.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.18.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.18.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.18.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.18.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.18.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.18.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.18.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.18.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.18.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.18.candidate","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.18.agentId","typeLabel":"string\u003cuuid>"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.18.contactId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.18.candidateId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.18.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.18.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.18.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.18.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.18.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.18.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.18.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.18.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.18.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.18.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.18.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.18.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.18.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.18.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.18.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.18.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.18.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.18.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.18.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.18.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.18.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.18.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.18.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.18.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.18.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.18.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.18.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.18.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.18.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.18.job","typeLabel":"object"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.18.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.18.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.18.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.18.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.18.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.18.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.18.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.18.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.18.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.18.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.18.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.18.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.18.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.18.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.18.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.18.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.18.contact","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.18.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.18.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.18.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.18.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.18.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.18.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.18.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.18.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.18.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.18.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.18.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.18.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.18.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.18.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.18.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.18.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.18.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.18.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.18.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.18.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.18.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.18.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.18.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.18.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.18.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.18.agent.oneOf.0.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.18.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.18.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.18.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.18.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.18.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.18.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.18.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.18.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.18.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.18.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.18.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.18.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.18.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.18.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.18.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.18.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.18.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.18.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.18.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.18.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.18.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.18.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.18.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.18.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.18.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.18.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.18.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.18.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.18.agent.oneOf.1.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.18.agent.oneOf.1","typeLabel":"object"}],"uniqueKey":"oneOf.18.agent","typeLabel":"object"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.18.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.18.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.18.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.18","typeLabel":"object"},{"type":"object","required":["job","agentId","candidate"],"properties":{"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.19.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.19.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.19.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.19.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.19.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.19.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.19.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.19.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.19.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.19.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.19.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.19.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.19.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.19.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.19.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.19.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.19.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.19.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.19.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.19.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.19.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.19.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.19.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.19.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.19.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.19.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.19.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.19.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.19.job.metadata","typeLabel":"object"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.19.job","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.19.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.19.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.19.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.19.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.19.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.19.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.19.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.19.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.19.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.19.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.19.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.19.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.19.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.19.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.19.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.19.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.19.candidate","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.19.agentId","typeLabel":"string\u003cuuid>"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.19.contactId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.19.candidateId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.19.jobId","typeLabel":"string\u003cuuid>"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.19.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.19.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.19.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.19.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.19.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.19.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.19.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.19.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.19.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.19.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.19.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.19.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.19.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.19.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.19.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.19.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.19.contact","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.19.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.19.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.19.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.19.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.19.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.19.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.19.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.19.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.19.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.19.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.19.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.19.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.19.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.19.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.19.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.19.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.19.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.19.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.19.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.19.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.19.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.19.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.19.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.19.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.19.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.19.agent.oneOf.0.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.19.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.19.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.19.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.19.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.19.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.19.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.19.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.19.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.19.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.19.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.19.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.19.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.19.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.19.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.19.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.19.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.19.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.19.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.19.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.19.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.19.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.19.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.19.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.19.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.19.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.19.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.19.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.19.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.19.agent.oneOf.1.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.19.agent.oneOf.1","typeLabel":"object"}],"uniqueKey":"oneOf.19.agent","typeLabel":"object"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.19.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.19.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.19.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.19","typeLabel":"object"},{"type":"object","required":["agentId","candidate"],"properties":{"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.20.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.20.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.20.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.20.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.20.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.20.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.20.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.20.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.20.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.20.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.20.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.20.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.20.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.20.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.20.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.20.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.20.candidate","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.20.agentId","typeLabel":"string\u003cuuid>"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.20.contactId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.20.candidateId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.20.jobId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.20.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.20.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.20.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.20.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.20.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.20.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.20.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.20.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.20.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.20.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.20.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.20.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.20.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.20.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.20.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.20.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.20.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.20.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.20.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.20.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.20.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.20.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.20.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.20.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.20.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.20.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.20.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.20.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.20.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.20.job","typeLabel":"object"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.20.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.20.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.20.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.20.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.20.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.20.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.20.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.20.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.20.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.20.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.20.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.20.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.20.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.20.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.20.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.20.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.20.contact","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.20.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.20.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.20.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.20.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.20.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.20.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.20.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.20.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.20.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.20.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.20.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.20.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.20.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.20.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.20.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.20.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.20.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.20.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.20.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.20.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.20.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.20.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.20.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.20.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.20.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.20.agent.oneOf.0.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.20.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.20.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.20.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.20.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.20.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.20.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.20.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.20.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.20.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.20.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.20.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.20.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.20.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.20.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.20.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.20.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.20.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.20.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.20.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.20.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.20.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.20.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.20.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.20.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.20.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.20.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.20.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.20.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.20.agent.oneOf.1.overrides","typeLabel":"object"}},"uniqueKey":"oneOf.20.agent.oneOf.1","typeLabel":"object"}],"uniqueKey":"oneOf.20.agent","typeLabel":"object"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.20.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.20.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.20.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.20","typeLabel":"object"},{"type":"object","required":["jobId","agent","candidate"],"properties":{"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","isRequired":true,"uniqueKey":"oneOf.21.jobId","typeLabel":"string\u003cuuid>"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.21.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.21.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.21.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.21.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.21.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.21.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.21.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.21.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.21.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.21.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.21.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.21.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.21.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.21.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.21.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.21.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.21.candidate","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.21.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.21.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.21.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.21.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.21.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.21.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.21.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.21.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.21.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.21.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.21.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.21.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.21.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.21.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.21.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.21.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.21.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.21.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.21.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.21.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.21.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.21.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.21.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.21.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.21.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.21.agent.oneOf.0.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.21.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.21.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.21.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.21.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.21.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.21.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.21.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.21.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.21.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.21.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.21.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.21.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.21.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.21.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.21.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.21.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.21.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.21.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.21.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.21.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.21.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.21.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.21.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.21.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.21.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.21.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.21.agent.oneOf.1.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.21.agent.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.21.agent","typeLabel":"object"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.21.contactId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.21.candidateId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.21.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.21.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.21.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.21.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.21.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.21.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.21.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.21.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.21.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.21.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.21.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.21.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.21.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.21.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.21.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.21.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.21.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.21.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.21.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.21.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.21.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.21.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.21.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.21.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.21.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.21.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.21.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.21.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.21.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.21.job","typeLabel":"object"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.21.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.21.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.21.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.21.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.21.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.21.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.21.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.21.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.21.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.21.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.21.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.21.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.21.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.21.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.21.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.21.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.21.contact","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","uniqueKey":"oneOf.21.agentId","typeLabel":"string\u003cuuid>"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.21.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.21.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.21.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.21","typeLabel":"object"},{"type":"object","required":["job","agent","candidate"],"properties":{"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.22.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.22.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.22.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.22.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.22.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.22.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.22.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.22.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.22.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.22.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.22.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.22.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.22.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.22.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.22.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.22.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.22.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.22.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.22.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.22.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.22.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.22.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.22.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.22.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.22.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.22.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.22.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.22.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.22.job.metadata","typeLabel":"object"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.22.job","typeLabel":"object"},"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.22.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.22.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.22.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.22.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.22.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.22.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.22.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.22.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.22.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.22.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.22.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.22.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.22.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.22.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.22.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.22.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.22.candidate","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.22.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.22.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.22.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.22.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.22.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.22.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.22.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.22.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.22.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.22.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.22.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.22.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.22.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.22.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.22.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.22.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.22.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.22.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.22.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.22.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.22.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.22.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.22.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.22.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.22.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.22.agent.oneOf.0.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.22.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.22.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.22.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.22.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.22.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.22.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.22.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.22.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.22.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.22.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.22.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.22.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.22.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.22.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.22.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.22.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.22.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.22.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.22.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.22.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.22.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.22.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.22.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.22.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.22.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.22.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.22.agent.oneOf.1.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.22.agent.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.22.agent","typeLabel":"object"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.22.contactId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.22.candidateId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.22.jobId","typeLabel":"string\u003cuuid>"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.22.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.22.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.22.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.22.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.22.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.22.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.22.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.22.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.22.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.22.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.22.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.22.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.22.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.22.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.22.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.22.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.22.contact","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","uniqueKey":"oneOf.22.agentId","typeLabel":"string\u003cuuid>"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.22.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.22.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.22.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.22","typeLabel":"object"},{"type":"object","required":["agent","candidate"],"properties":{"candidate":{"type":"object","description":"Deprecated alias of `contact`, kept for the life of v1. Send one inline body, not both.","required":["firstName","lastName","gdprExpiryDate"],"deprecated":true,"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.23.candidate.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.23.candidate.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.23.candidate.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.23.candidate.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.23.candidate.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.23.candidate.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.23.candidate.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.23.candidate.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.23.candidate.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.23.candidate.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.23.candidate.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.23.candidate.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.23.candidate.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.23.candidate.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.23.candidate.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.23.candidate.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"oneOf.23.candidate","typeLabel":"object"},"agent":{"oneOf":[{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration","companyPhoneNumberId"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.duration","typeLabel":"number"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.23.agent.oneOf.0.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.23.agent.oneOf.0.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.23.agent.oneOf.0.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.23.agent.oneOf.0.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.23.agent.oneOf.0.voiceId","typeLabel":"enum\u003cstring>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.23.agent.oneOf.0.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.23.agent.oneOf.0.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.23.agent.oneOf.0.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.23.agent.oneOf.0.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.23.agent.oneOf.0.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.23.agent.oneOf.0.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.23.agent.oneOf.0.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.23.agent.oneOf.0.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.23.agent.oneOf.0.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.23.agent.oneOf.0.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.23.agent.oneOf.0.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.23.agent.oneOf.0.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.23.agent.oneOf.0.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.23.agent.oneOf.0.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.23.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.23.agent.oneOf.0.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.23.agent.oneOf.0.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.23.agent.oneOf.0.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.23.agent.oneOf.0.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.23.agent.oneOf.0.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.23.agent.oneOf.0.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.0","typeLabel":"object"},{"type":"object","description":"Agent for inline creation (XOR with agentId)","required":["name","type","language","duration"],"properties":{"type":{"type":"string","description":"Type of the agent","enum":["UNDEFINED","ONLINE","PHONE"],"example":"ONLINE","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.type","typeLabel":"enum\u003cstring>"},"name":{"type":"string","description":"Agent name","example":"Senior Developer Interview","minLength":2,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.name","typeLabel":"string"},"language":{"type":"string","description":"Language of the conversation","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.language","typeLabel":"enum\u003cstring>"},"duration":{"type":"number","description":"Duration of the conversation in minutes","example":30,"minimum":1,"maximum":180,"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.duration","typeLabel":"number"},"focus":{"type":"string","description":"Focus of the agent. GENERIC: job-optional, for a conversation that is not about a particular job. SCREENING: a hiring screen against a job's requirements. OUTREACH: a first call to gauge interest. LANGUAGE_TEST: language proficiency. Required unless a conversation `flow` is provided: an agent with a flow is a custom agent, whose focus is derived rather than selected. Sending both is rejected.","enum":["GENERIC","SCREENING","OUTREACH","LANGUAGE_TEST"],"example":"SCREENING","uniqueKey":"oneOf.23.agent.oneOf.1.focus","typeLabel":"enum\u003cstring>"},"questions":{"description":"List of questions for the conversation","example":["What is your experience with React?","Tell me about a challenging project you worked on"],"type":"array","items":{"type":"string","uniqueKey":"oneOf.23.agent.oneOf.1.questions.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.23.agent.oneOf.1.questions","typeLabel":"string[]"},"instructions":{"type":"string","description":"Additional instructions for the conversation. Compiled into the agent's prompt as its own reference section, for a CUSTOM (flow) agent as well as a template one, so this is where reference material the agent must state accurately belongs: prices, stock, lead times, opening hours, policy.","example":"Focus on technical skills and previous project experience","uniqueKey":"oneOf.23.agent.oneOf.1.instructions","typeLabel":"string"},"voiceId":{"type":"string","description":"Voice ID the agent speaks with","enum":["ALEX","PETER","MIRIAM","SUE","VIERA","CASANDRA","SILVIA","MICHAEL","LUKE","EMMA","SARAH","EVA"],"uniqueKey":"oneOf.23.agent.oneOf.1.voiceId","typeLabel":"enum\u003cstring>"},"companyPhoneNumberId":{"type":"string","description":"ID of the company phone number assignment to use for calls from this agent (CompanyPhoneNumber.id). Required when type=PHONE.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.23.agent.oneOf.1.companyPhoneNumberId","typeLabel":"string\u003cuuid>"},"cefrLevel":{"type":"string","description":"CEFR level for language test agents","enum":["A1","A2","B1","B2","C1","C2"],"example":"B1","uniqueKey":"oneOf.23.agent.oneOf.1.cefrLevel","typeLabel":"enum\u003cstring>"},"flow":{"type":"object","description":"Conversation flow graph. Providing it makes this inline agent a custom agent, so `focus` must be omitted. Inline creation mints a permanent agent per conversation — when the same flow will call more than one person, create it once via POST /agents and pass `agentId` instead.","required":["firstMessage","sections","lastMessage"],"properties":{"firstMessage":{"type":"object","description":"What the agent says first. Supports `{{contact.*}}` variables, injected per call.","required":["type","text"],"properties":{"type":{"type":"string","enum":["first_message"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.firstMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The opening line.","example":"Hi {{contact.firstName}}, do you have two minutes?","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.firstMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.23.agent.oneOf.1.flow.firstMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.firstMessage","typeLabel":"object"},"sections":{"type":"array","description":"The body of the conversation, worked through in order. At least one section is required.","minItems":1,"maxItems":100,"items":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.type","typeLabel":"enum\u003cstring>"},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.prompt","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0.label","typeLabel":"string"}},"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].question","typeLabel":"string"},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool","uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].idealAnswer","typeLabel":"string"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].weight","typeLabel":"number"},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX].importance","typeLabel":"enum\u003cstring>"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow.","uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.questions","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1.label","typeLabel":"string"}},"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.type","typeLabel":"enum\u003cstring>"},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].label","typeLabel":"string"},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.type","typeLabel":"enum\u003cstring>"},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0.description","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.0","typeLabel":"object"},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.type","typeLabel":"enum\u003cstring>"},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.field","typeLabel":"string"},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.operator","typeLabel":"enum\u003cstring>"},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.value","typeLabel":"any"},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"],"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1.logicalOperator","typeLabel":"enum\u003cstring>"}},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].condition","typeLabel":"object"},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX].blocks","typeLabel":"array"}},"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.branches","typeLabel":"object[]"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.label","typeLabel":"string"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now","uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2.defaultBranch","typeLabel":"string"}},"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.type","typeLabel":"enum\u003cstring>"},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.phoneNumber","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales","uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.label","typeLabel":"string"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment.","uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3.message","typeLabel":"string"}},"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX].oneOf.3","typeLabel":"object"}],"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.sections","typeLabel":"object[]"},"lastMessage":{"type":"object","description":"What the agent says before hanging up.","required":["type","text"],"properties":{"type":{"type":"string","enum":["last_message"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.lastMessage.type","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"The closing line.","example":"Thanks for your time — have a great day!","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.lastMessage.text","typeLabel":"string"},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget","uniqueKey":"oneOf.23.agent.oneOf.1.flow.lastMessage.label","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.flow.lastMessage","typeLabel":"object"}},"uniqueKey":"oneOf.23.agent.oneOf.1.flow","typeLabel":"object"},"guardrails":{"type":"object","description":"Rules the agent must obey during the call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","required":["rules"],"properties":{"rules":{"type":"array","description":"Stated to the agent verbatim as instructions. Replaces the stored rules; an empty array removes them all.","maxItems":50,"items":{"type":"string","minLength":1,"maxLength":500,"uniqueKey":"oneOf.23.agent.oneOf.1.guardrails.rules.items.[INDEX]","typeLabel":"string"},"example":["Never quote a price","Never promise a delivery date"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.guardrails.rules","typeLabel":"string[]"}},"uniqueKey":"oneOf.23.agent.oneOf.1.guardrails","typeLabel":"object"},"contextConfig":{"type":"object","description":"Who the agent is and what the call is about. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected.","properties":{"role":{"type":"string","description":"Who the agent should present itself as.","maxLength":500,"example":"an account executive for Acme","uniqueKey":"oneOf.23.agent.oneOf.1.contextConfig.role","typeLabel":"string"},"communicationStyle":{"type":"string","description":"How the agent speaks. The same list the visual builder offers, so an agent created over the API stays editable there.","enum":["professional","friendly","warm and empathetic","assertive","concise and direct","enthusiastic","casual"],"example":"concise and direct","uniqueKey":"oneOf.23.agent.oneOf.1.contextConfig.communicationStyle","typeLabel":"enum\u003cstring>"},"callToAction":{"type":"string","description":"What the call is trying to achieve.","maxLength":500,"example":"book a 30-minute demo","uniqueKey":"oneOf.23.agent.oneOf.1.contextConfig.callToAction","typeLabel":"string"},"useContactContext":{"type":"boolean","description":"Give the agent what is known about the person it is calling. A short platform-decided set of fields goes into its prompt; everything else the contact has a value for, plus their documents, becomes a knowledge base it can query mid-call. The agent may refer to any of it, must not volunteer where it came from, and is told not to read a document out word for word. Off unless set. Fields marked `isPii` are excluded from both halves unless `allowPiiInContext` is set on that field, or the field is one the platform lists in `inEssentialPromptSet` — see `GET /contact-fields`.","default":false,"example":true,"uniqueKey":"oneOf.23.agent.oneOf.1.contextConfig.useContactContext","typeLabel":"boolean"}},"uniqueKey":"oneOf.23.agent.oneOf.1.contextConfig","typeLabel":"object"},"analyticsConfig":{"type":"object","description":"What to extract, score, decide and label after every call. Accepted only alongside a `flow` — sending it for an agent that will not be custom is rejected. Per-question scoring is set inline on the flow's looping questions, not here.","properties":{"extractionTargets":{"type":"array","description":"The values to pull out of every call. A target with an `ideal` also counts toward the match score.","maxItems":50,"items":{"type":"object","description":"One value to pull out of every call.","required":["label","type"],"properties":{"label":{"type":"string","description":"What to extract, in your own words. Also the default source of `key`.","maxLength":200,"example":"Budget confirmed","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","description":"The value's type. The extracted value is coerced to it, or returned as `null`.","enum":["string","number","bool","enum"],"example":"bool","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"budget_confirmed","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].key","typeLabel":"string"},"enumValues":{"type":"array","description":"The allowed values. Required when `type` is `enum`.","maxItems":50,"items":{"type":"string","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues.items.[INDEX]","typeLabel":"string"},"example":["hot","warm","cold"],"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].enumValues","typeLabel":"string[]"},"ideal":{"type":"string","description":"What a good value looks like. Its PRESENCE is what makes this field count toward the match score — a field with no `ideal` is extracted but not scored.","maxLength":500,"example":"A confirmed budget of at least 10k","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].ideal","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.extractionTargets.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.extractionTargets","typeLabel":"object[]"},"scoringCriteria":{"type":"array","description":"Holistic judgements over the whole call that are not a single field or question, e.g. “handled objections”.","maxItems":25,"items":{"type":"object","description":"A holistic judgement over the whole call.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the judgement.","maxLength":200,"example":"Handled objections","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"What a good call looks like for this criterion — what the score is judged against.","maxLength":1000,"example":"Acknowledged the objection and answered it with a concrete example","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"handled_objections","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].key","typeLabel":"string"},"importance":{"type":"string","description":"How much a miss matters. `REQUIRED` gates the score; `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"weight":{"type":"number","description":"Relative contribution to the match score. Weights are relative to each other, not a budget that must total 100.","minimum":0,"maximum":100,"example":40,"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX].weight","typeLabel":"number"}},"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.scoringCriteria.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.scoringCriteria","typeLabel":"object[]"},"outcomes":{"type":"array","description":"Did the call achieve what it was for? Each outcome is decided met / not met per call.","maxItems":25,"items":{"type":"object","description":"Something the call was for, decided met / not met afterwards.","required":["label","description"],"properties":{"label":{"type":"string","description":"Name of the outcome.","maxLength":200,"example":"Meeting booked","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].label","typeLabel":"string"},"description":{"type":"string","description":"When this counts as achieved, in plain language.","maxLength":1000,"example":"The contact agreed to a specific date and time","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].description","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"meeting_booked","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX].key","typeLabel":"string"}},"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.outcomes","typeLabel":"object[]"},"outputTags":{"type":"array","description":"Labels the AI may assign to a call.","maxItems":25,"items":{"type":"object","description":"A label the AI may assign to a call.","required":["label"],"properties":{"label":{"type":"string","description":"The tag itself.","maxLength":200,"example":"Needs follow-up","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].label","typeLabel":"string"},"key":{"type":"string","description":"Stable name this item's results come back under. Optional — omit it and InstaView derives a slug of `label` (`Budget confirmed` → `budget_confirmed`). Set it when your integration reads the results by name: a key you choose survives a later `label` change, a derived one does not. If two derived keys collide, the later one gets a numeric suffix (`budget`, `budget_2`). Must be unique within its list — a duplicate you sent is rejected with `400`, never renamed. Reserved names (`__proto__`, `constructor`, `prototype`) are rejected. Editing the agent in the visual builder re-derives the key from the label.","maxLength":64,"pattern":"^[A-Za-z0-9_]{1,64}$","example":"needs_followup","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].key","typeLabel":"string"},"description":{"type":"string","description":"When to apply it.","maxLength":1000,"example":"The contact asked to be called back","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX].description","typeLabel":"string"}},"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.outputTags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.outputTags","typeLabel":"object[]"},"capture":{"type":"object","description":"Which qualitative artefacts to produce. Every flag defaults to `true`, so an omitted `capture` is not “capture nothing”.","properties":{"recording":{"type":"boolean","default":true,"description":"Keep the call recording.","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.capture.recording","typeLabel":"boolean"},"transcript":{"type":"boolean","default":true,"description":"Keep the transcript.","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.capture.transcript","typeLabel":"boolean"},"summary":{"type":"boolean","default":true,"description":"Produce a call summary.","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.capture.summary","typeLabel":"boolean"},"qa":{"type":"boolean","default":true,"description":"Answer the flow's looping questions from the transcript.","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.capture.qa","typeLabel":"boolean"},"evaluation":{"type":"boolean","default":true,"description":"Produce the strengths / concerns evaluation.","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.capture.evaluation","typeLabel":"boolean"},"sentiment":{"type":"boolean","default":true,"description":"Produce a sentiment read.","uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.capture.sentiment","typeLabel":"boolean"}},"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig.capture","typeLabel":"object"}},"uniqueKey":"oneOf.23.agent.oneOf.1.analyticsConfig","typeLabel":"object"},"callConfig":{"type":"object","description":"How persistently and when the agent calls (custom agents only). Omitted, the agent calls Mon–Fri 09:00–18:00 in each contact's own timezone.","properties":{"retryPolicy":{"type":"object","description":"How many times a contact who does not answer is called. Replaced when sent, kept when omitted.","required":["maxAttempts"],"properties":{"maxAttempts":{"type":"number","description":"Attempts per contact, counting the first. Reschedules the contact asks for come out of this budget; a transient network failure that never reached them does not.","minimum":1,"maximum":5,"example":3,"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.callConfig.retryPolicy.maxAttempts","typeLabel":"number"}},"uniqueKey":"oneOf.23.agent.oneOf.1.callConfig.retryPolicy","typeLabel":"object"},"callWindow":{"type":"object","description":"The days, local hours and timezone the agent may dial in. Replaced whole when sent, kept when omitted.","required":["days","start","end","timezoneAnchor"],"properties":{"days":{"type":"array","description":"Days the agent may call on.","items":{"type":"string","enum":["mon","tue","wed","thu","fri","sat","sun"],"uniqueKey":"oneOf.23.agent.oneOf.1.callConfig.callWindow.days.items.[INDEX]","typeLabel":"enum\u003cstring>"},"example":["mon","tue","wed","thu","fri"],"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.callConfig.callWindow.days","typeLabel":"enum\u003cstring>[]"},"start":{"type":"string","description":"Earliest local time the agent may call, `\"HH:mm\"` on a 24-hour clock.","example":"09:00","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.callConfig.callWindow.start","typeLabel":"string"},"end":{"type":"string","description":"Local time the window closes, `\"HH:mm\"` on a 24-hour clock, exclusive. Must be later in the day than `start`; a window that wraps past midnight is rejected rather than reinterpreted.","example":"18:00","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.callConfig.callWindow.end","typeLabel":"string"},"timezoneAnchor":{"type":"object","description":"Whose clock `start` and `end` are on.","required":["mode"],"properties":{"mode":{"type":"string","enum":["contact","fixed"],"description":"`contact` detects the contact's timezone from their phone number, down to the area code: on one list a `+1 212` number is called at 09:00 in New York and a `+1 310` number at 09:00 in Los Angeles. Where a prefix covers more than one zone (an Australian `+61 8` number could be Adelaide or Perth) the window is narrowed to the part valid in every contact's zone, so nobody is called too early. `fixed` puts every contact on one named zone instead. Because every candidate zone has to allow the time, a narrow window over a wide prefix can have no valid moment at all (`09:00`–`10:00` is never true in both Adelaide and Perth at once); such a contact is called anyway rather than left uncalled, and the call is recorded as having gone out outside the window.","example":"contact","isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.mode","typeLabel":"enum\u003cstring>"},"timezone":{"type":"string","description":"IANA timezone. Required when `mode` is `fixed`, ignored otherwise. Validated against the runtime's own timezone database, so a nonexistent zone is a `422` here rather than a schedule that never fires.","example":"Europe/Bratislava","uniqueKey":"oneOf.23.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.timezone","typeLabel":"string"},"fallbackTimezone":{"type":"string","description":"IANA timezone used when `mode` is `contact` and the contact's number cannot be resolved to one. Defaults to `Europe/Bratislava`.","example":"Europe/Bratislava","uniqueKey":"oneOf.23.agent.oneOf.1.callConfig.callWindow.timezoneAnchor.fallbackTimezone","typeLabel":"string"}},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1.callConfig.callWindow.timezoneAnchor","typeLabel":"object"}},"uniqueKey":"oneOf.23.agent.oneOf.1.callConfig.callWindow","typeLabel":"object"}},"uniqueKey":"oneOf.23.agent.oneOf.1.callConfig","typeLabel":"object"},"overrides":{"type":"object","description":"Who this agent says it is on the call. By default it introduces itself as the company your API key belongs to; send this to have it speak for one of your own customers instead.","properties":{"companyName":{"type":"string","description":"Company name the agent introduces itself with. Omit to use your own company's name.","minLength":1,"maxLength":100,"example":"Acme Manufacturing","uniqueKey":"oneOf.23.agent.oneOf.1.overrides.companyName","typeLabel":"string"},"companyDescription":{"type":"string","description":"Company description the agent may draw on. Falls back to your own company's description independently of `companyName`, so send it alongside a name override — otherwise the agent introduces itself as one company and describes another.","minLength":1,"maxLength":1000,"example":"Acme makes industrial fasteners and employs 400 people across Slovakia.","uniqueKey":"oneOf.23.agent.oneOf.1.overrides.companyDescription","typeLabel":"string"}},"uniqueKey":"oneOf.23.agent.oneOf.1.overrides","typeLabel":"object"}},"isRequired":true,"uniqueKey":"oneOf.23.agent.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"oneOf.23.agent","typeLabel":"object"},"contactId":{"type":"string","description":"Existing contact ID (XOR with contact). Must exist and belong to the same company as the API key; both are validated server-side.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.23.contactId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","description":"Deprecated alias of `contactId`, kept for the life of v1. Sending both is allowed only when they hold the same value.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","deprecated":true,"uniqueKey":"oneOf.23.candidateId","typeLabel":"string\u003cuuid>"},"jobId":{"type":"string","description":"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.","example":"123e4567-e89b-12d3-a456-426614174000","format":"uuid","uniqueKey":"oneOf.23.jobId","typeLabel":"string\u003cuuid>"},"job":{"type":"object","description":"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.","required":["title"],"properties":{"title":{"type":"string","description":"Job title","example":"Senior TypeScript Developer","minLength":5,"maxLength":200,"isRequired":true,"uniqueKey":"oneOf.23.job.title","typeLabel":"string"},"description":{"type":"string","description":"Job description","example":"We are looking for an experienced TypeScript developer...","minLength":10,"maxLength":5000,"uniqueKey":"oneOf.23.job.description","typeLabel":"string"},"jobUrl":{"type":"string","description":"Job URL","example":"https://company.com/careers/senior-typescript-dev","uniqueKey":"oneOf.23.job.jobUrl","typeLabel":"string"},"benefits":{"type":"string","description":"Benefits","example":"Health insurance, remote work, flexible hours","uniqueKey":"oneOf.23.job.benefits","typeLabel":"string"},"requiredSkills":{"description":"Required skills","example":["TypeScript","React","Node.js"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.23.job.requiredSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.23.job.requiredSkills","typeLabel":"string[]"},"niceToHaveSkills":{"description":"Nice-to-have skills","example":["Docker","AWS","GraphQL"],"maxItems":10,"type":"array","items":{"type":"string","uniqueKey":"oneOf.23.job.niceToHaveSkills.items.[INDEX]","typeLabel":"string"},"uniqueKey":"oneOf.23.job.niceToHaveSkills","typeLabel":"string[]"},"languageRequirements":{"description":"Language requirements with proficiency levels","example":[{"language":"EN","proficiency":"B2"},{"language":"SK","proficiency":"C1"}],"maxItems":5,"type":"array","items":{"type":"object","properties":{"language":{"type":"string","description":"Language","enum":["UNDEFINED","EN","JA","ZH","DE","HI","FR","KO","PT","IT","ES","ID","NL","TR","FIL","PL","SV","BG","RO","AR","CS","EL","FI","HR","MS","SK","DA","TA","UK","RU","HU","NO","VI"],"example":"EN","isRequired":true,"uniqueKey":"oneOf.23.job.languageRequirements.items.[INDEX].language","typeLabel":"enum\u003cstring>"},"proficiency":{"type":"string","description":"Proficiency level (CEFR)","enum":["UNDEFINED","A1","A2","B1","B2","C1","C2"],"example":"B2","isRequired":true,"uniqueKey":"oneOf.23.job.languageRequirements.items.[INDEX].proficiency","typeLabel":"enum\u003cstring>"}},"required":["language","proficiency"],"uniqueKey":"oneOf.23.job.languageRequirements.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.23.job.languageRequirements","typeLabel":"object[]"},"education":{"type":"array","description":"Education requirements","example":["BACHELOR_LEVEL","MASTER_LEVEL"],"items":{"type":"string","enum":["UNDEFINED","PRIMARY_EDUCATION","SECONDARY_SCHOOL_STUDENT","SECONDARY_WITHOUT_DIPLOMA","SECONDARY_WITH_DIPLOMA","POST_SECONDARY_VOCATIONAL","UNIVERSITY_STUDENT","BACHELOR_LEVEL","MASTER_LEVEL","POSTGRADUATE"],"uniqueKey":"oneOf.23.job.education.items.[INDEX]","typeLabel":"enum\u003cstring>"},"uniqueKey":"oneOf.23.job.education","typeLabel":"enum\u003cstring>[]"},"experience":{"type":"string","description":"Experience level required","enum":["UNDEFINED","NO_EXPERIENCE","LESS_THAN_1_YEAR","ONE_TO_3_YEARS","THREE_TO_5_YEARS","FIVE_TO_10_YEARS","TEN_TO_15_YEARS","MORE_THAN_15_YEARS"],"example":"FIVE_TO_10_YEARS","uniqueKey":"oneOf.23.job.experience","typeLabel":"enum\u003cstring>"},"contractType":{"type":"string","description":"Contract type","enum":["UNDEFINED","FULL_TIME","PART_TIME","FREELANCE_CONTRACT","TRADE_LICENSE","INTERNSHIP"],"example":"FULL_TIME","uniqueKey":"oneOf.23.job.contractType","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Job status","enum":["UNDEFINED","OPEN","CLOSED"],"example":"OPEN","default":"OPEN","uniqueKey":"oneOf.23.job.status","typeLabel":"enum\u003cstring>"},"location":{"type":"object","description":"Job location","properties":{"workMode":{"type":"string","description":"Work mode","enum":["UNDEFINED","ONSITE","REMOTE","HYBRID"],"example":"REMOTE","uniqueKey":"oneOf.23.job.location.workMode","typeLabel":"enum\u003cstring>"},"street":{"type":"string","description":"Street address","example":"Hlavná 123","minLength":2,"maxLength":200,"uniqueKey":"oneOf.23.job.location.street","typeLabel":"string"},"city":{"type":"string","description":"City","example":"Bratislava","minLength":2,"maxLength":100,"uniqueKey":"oneOf.23.job.location.city","typeLabel":"string"},"postalCode":{"type":"string","description":"Postal code","example":"81101","minLength":2,"maxLength":20,"uniqueKey":"oneOf.23.job.location.postalCode","typeLabel":"string"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","enum":["XX","AF","AL","DZ","AS","AD","AO","AI","AQ","AG","AR","AM","AW","AU","AT","AZ","BS","BH","BD","BB","BY","BE","BZ","BJ","BM","BT","BO","BA","BW","BR","IO","BN","BG","BF","BI","KH","CM","CA","CV","KY","CF","TD","CL","CN","CX","CC","CO","KM","CG","CD","CK","CR","CI","HR","CU","CY","CZ","DK","DJ","DM","DO","EC","EG","SV","GQ","ER","EE","SZ","ET","FK","FO","FJ","FI","FR","GF","PF","TF","GA","GM","GE","DE","GH","GI","GR","GL","GD","GP","GU","GT","GG","GN","GW","GY","HT","HM","VA","HN","HK","HU","IS","IN","ID","IR","IQ","IE","IM","IL","IT","JM","JP","JE","JO","KZ","KE","KI","KP","KR","KW","KG","LA","LV","LB","LS","LR","LY","LI","LT","LU","MO","MG","MW","MY","MV","ML","MT","MH","MQ","MR","MU","YT","MX","FM","MD","MC","MN","ME","MS","MA","MZ","MM","NA","NR","NP","NL","NC","NZ","NI","NE","NG","NU","NF","MK","MP","NO","OM","PK","PW","PS","PA","PG","PY","PE","PH","PN","PL","PT","PR","QA","RE","RO","RU","RW","BL","SH","KN","LC","MF","PM","VC","WS","SM","ST","SA","SN","RS","SC","SL","SG","SX","SK","SI","SB","SO","ZA","GS","SS","ES","LK","SD","SR","SJ","SE","CH","SY","TW","TJ","TZ","TH","TL","TG","TK","TO","TT","TN","TR","TM","TC","TV","UG","UA","AE","GB","US","UM","UY","UZ","VU","VE","VN","VG","VI","WF","EH","YE","ZM","ZW"],"example":"SK","uniqueKey":"oneOf.23.job.location.countryCode","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.23.job.location","typeLabel":"object"},"salary":{"type":"object","description":"Salary range with comprehensive validation: min and max must be >= 0, min \u003c max, currency and period are required if min or max is provided, at least one of min or max must be provided if any salary field is present","example":{"min":50000,"max":80000,"currency":"USD","period":"YEARLY"},"properties":{"min":{"type":"number","description":"Minimum salary (must be greater than or equal to 0)","example":50000,"minimum":0,"uniqueKey":"oneOf.23.job.salary.min","typeLabel":"number"},"max":{"type":"number","description":"Maximum salary (must be greater than or equal to 0)","example":80000,"minimum":0,"uniqueKey":"oneOf.23.job.salary.max","typeLabel":"number"},"currency":{"type":"string","description":"Currency (ISO 4217 alpha-3)","pattern":"^[A-Z]{3}$","example":"USD","uniqueKey":"oneOf.23.job.salary.currency","typeLabel":"string"},"period":{"type":"string","description":"Salary period","enum":["UNDEFINED","HOURLY","DAILY","MONTHLY","YEARLY"],"example":"YEARLY","uniqueKey":"oneOf.23.job.salary.period","typeLabel":"enum\u003cstring>"}},"uniqueKey":"oneOf.23.job.salary","typeLabel":"object"},"metadata":{"type":"object","description":"Custom metadata for extensibility (max 10KB, 5 levels deep, 50 keys)","example":{"externalJobId":"JOB-12345","department":"Engineering","hiringManager":"Jane Doe"},"uniqueKey":"oneOf.23.job.metadata","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"oneOf.23.job","typeLabel":"object"},"contact":{"type":"object","description":"Contact for inline creation (XOR with contactId)","required":["firstName","lastName","gdprExpiryDate"],"properties":{"firstName":{"type":"string","description":"The contact's first name","example":"John","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.23.contact.firstName","typeLabel":"string"},"lastName":{"type":"string","description":"The contact's last name","example":"Doe","minLength":1,"maxLength":100,"isRequired":true,"uniqueKey":"oneOf.23.contact.lastName","typeLabel":"string"},"gdprExpiryDate":{"type":"string","description":"GDPR expiry date in ISO 8601 format (must be in the future)","example":"2026-11-16","format":"date","isRequired":true,"uniqueKey":"oneOf.23.contact.gdprExpiryDate","typeLabel":"string\u003cdate>"},"email":{"type":"string","description":"The contact's email address","example":"john.doe@example.com","uniqueKey":"oneOf.23.contact.email","typeLabel":"string"},"phoneNumber":{"type":"string","description":"The contact's phone number in E.164 format (must start with +)","example":"+421915123456","pattern":"^\\+[1-9]\\d{1,14}$","uniqueKey":"oneOf.23.contact.phoneNumber","typeLabel":"string"},"jobId":{"type":"string","description":"Optional Job ID to associate the contact with. Must belong to the same company as the API key. Note: When ContactDto is used inline within conversation creation, this field is ignored; use the top-level jobId/job instead.","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.23.contact.jobId","typeLabel":"string\u003cuuid>"},"gender":{"type":"string","description":"The contact's gender. Used for gender-aware addressing on the call. If not provided, it is auto-detected from the name.","enum":["male","female"],"example":"female","uniqueKey":"oneOf.23.contact.gender","typeLabel":"enum\u003cstring>"},"workHistory":{"type":"array","description":"Optional work history items for the contact.","maxItems":20,"items":{"type":"object","properties":{"companyName":{"type":"string","description":"Name of the employer company","example":"Google","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.23.contact.workHistory.items.[INDEX].companyName","typeLabel":"string"},"candidatePosition":{"type":"string","description":"The role held at that company. Keeps its original field name, which is the name the API accepts.","example":"Software Engineer","minLength":1,"maxLength":255,"isRequired":true,"uniqueKey":"oneOf.23.contact.workHistory.items.[INDEX].candidatePosition","typeLabel":"string"},"referencePhone":{"type":"string","description":"Phone number of reference contact in E.164 format","example":"+1987654321","pattern":"^\\+[1-9]\\d{1,14}$","isRequired":true,"uniqueKey":"oneOf.23.contact.workHistory.items.[INDEX].referencePhone","typeLabel":"string"},"id":{"type":"string","description":"Work history item ID","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"oneOf.23.contact.workHistory.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"referenceName":{"type":"string","description":"Name of the reference person","example":"Jane Smith","maxLength":255,"uniqueKey":"oneOf.23.contact.workHistory.items.[INDEX].referenceName","typeLabel":"string"},"startDate":{"type":"string","description":"Job start date in calendar format (yyyy-MM-dd)","example":"2020-01-01","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.23.contact.workHistory.items.[INDEX].startDate","typeLabel":"string\u003cdate>"},"endDate":{"type":"string","description":"Job end date in calendar format (yyyy-MM-dd)","example":"2022-12-31","format":"date","pattern":"^\\d{4}-\\d{2}-\\d{2}$","uniqueKey":"oneOf.23.contact.workHistory.items.[INDEX].endDate","typeLabel":"string\u003cdate>"}},"required":["companyName","candidatePosition","referencePhone"],"uniqueKey":"oneOf.23.contact.workHistory.items.[INDEX]","typeLabel":"object"},"uniqueKey":"oneOf.23.contact.workHistory","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"oneOf.23.contact","typeLabel":"object"},"agentId":{"type":"string","description":"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.","format":"uuid","example":"987e6543-e21b-12d3-a456-426614174000","uniqueKey":"oneOf.23.agentId","typeLabel":"string\u003cuuid>"},"scheduleTime":{"type":"string","description":"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.","example":"2025-11-20T10:00:00Z","format":"date-time","uniqueKey":"oneOf.23.scheduleTime","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata for the conversation (max 10KB, 5 levels deep, 50 keys)","example":{"externalInterviewId":"INT-789","interviewerNotes":"Focus on technical skills"},"uniqueKey":"oneOf.23.metadata","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"default":false,"uniqueKey":"oneOf.23.isTest","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"oneOf.23","typeLabel":"object"}],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"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}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"6a13554f-1c81-4aa8-9fb6-c12482f23a69":{"description":"OK (legacy; prefer 201)","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Conversation ID","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"id","typeLabel":"string\u003cuuid>"},"contactId":{"type":"string","format":"uuid","description":"Contact ID","example":"987e6543-e21b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"contactId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","format":"uuid","description":"Deprecated alias of `contactId`, always identical to it. Kept for the life of v1 so existing integrations keep working; new callers should read `contactId`.","example":"987e6543-e21b-12d3-a456-426614174000","deprecated":true,"isRequired":true,"uniqueKey":"candidateId","typeLabel":"string\u003cuuid>"},"agentId":{"type":"string","description":"Agent ID","format":"uuid","example":"456e7890-e12b-34d5-a678-901234567890","isRequired":true,"uniqueKey":"agentId","typeLabel":"string\u003cuuid>"},"status":{"type":"string","description":"Conversation status","enum":["UNDEFINED","SCHEDULED","CANCELLED","FAILED","COMPLETED","IN_PROGRESS","UNREACHABLE"],"example":"SCHEDULED","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"scheduledAt":{"type":"string","format":"date-time","description":"Scheduled time","example":"2025-11-20T10:00:00Z","isRequired":true,"uniqueKey":"scheduledAt","typeLabel":"string\u003cdate-time>"},"createdAt":{"type":"string","description":"Created timestamp","example":"2024-11-16T10:30:00Z","isRequired":true,"uniqueKey":"createdAt","typeLabel":"string"},"updatedAt":{"type":"string","description":"Updated timestamp","example":"2024-11-16T10:30:00Z","isRequired":true,"uniqueKey":"updatedAt","typeLabel":"string"},"jobId":{"oneOf":[{"type":"string","description":"Job ID associated with this conversation, if any","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"jobId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"Job ID associated with this conversation, if any","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"jobId.oneOf.1","typeLabel":"null"}],"uniqueKey":"jobId","typeLabel":"string\u003cuuid> | null"},"runId":{"oneOf":[{"type":"string","description":"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.","format":"uuid","example":"789e0123-e45b-67d8-a901-234567890123","uniqueKey":"runId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"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.","format":"uuid","example":"789e0123-e45b-67d8-a901-234567890123","uniqueKey":"runId.oneOf.1","typeLabel":"null"}],"uniqueKey":"runId","typeLabel":"string\u003cuuid> | null"},"flowVersion":{"oneOf":[{"type":"string","description":"Identity of the agent configuration (flow, guardrails and context, as compiled) that the most recent call in this conversation was placed with. A content hash: two calls that ran the same configuration carry the same value, and any edit that changes what the agent says produces a new one. Each entry in `callAttempts` carries its own, since a retry placed after an edit runs the edited configuration. `null` for agents without a designed flow and for calls placed before 2026-09-23.","pattern":"^[0-9a-f]{64}$","example":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","uniqueKey":"flowVersion.oneOf.0","typeLabel":"string"},{"type":"null","description":"Identity of the agent configuration (flow, guardrails and context, as compiled) that the most recent call in this conversation was placed with. A content hash: two calls that ran the same configuration carry the same value, and any edit that changes what the agent says produces a new one. Each entry in `callAttempts` carries its own, since a retry placed after an edit runs the edited configuration. `null` for agents without a designed flow and for calls placed before 2026-09-23.","pattern":"^[0-9a-f]{64}$","example":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","uniqueKey":"flowVersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"flowVersion","typeLabel":"string | null"},"durationMinutes":{"type":"number","description":"Conversation duration in minutes","example":15,"uniqueKey":"durationMinutes","typeLabel":"number"},"finishedDate":{"type":"string","format":"date-time","description":"Finished date","example":"2025-11-20T10:15:00Z","uniqueKey":"finishedDate","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata","example":{"externalInterviewId":"INT-789"},"uniqueKey":"metadata","typeLabel":"object"},"callAttempts":{"description":"Call attempt logs for this conversation. Present for PHONE conversations, typically empty or undefined for ONLINE ones.","type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Call attempt ID","example":"c9c9a6e8-fb4a-45f3-80fc-bf94f071cd2a","isRequired":true,"uniqueKey":"callAttempts.items.[INDEX].id","typeLabel":"string"},"direction":{"type":"string","description":"How the call was made: OUTBOUND (we dialled the candidate), INBOUND (the candidate called in) or ONLINE (a browser session on an online interview).","enum":["UNDEFINED","INBOUND","OUTBOUND","ONLINE"],"example":"OUTBOUND","isRequired":true,"uniqueKey":"callAttempts.items.[INDEX].direction","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Current status of the call attempt","enum":["UNDEFINED","SCHEDULED","IN_PROGRESS","COMPLETED","NO_ANSWER","BUSY","FAILED","CANCELLED","VOICEMAIL","REJECTED","NO_CONSENT","TIMEOUT","MAX_ATTEMPTS_REACHED","HUMAN_CONTACT_REQUESTED","OTHER_ROLE_INTEREST","POLITE_DECLINE","TIMING_ISSUE"],"example":"COMPLETED","uniqueKey":"callAttempts.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"reasonCode":{"type":"string","description":"Machine-readable reason code for failures or special outcomes","example":"NO_ANSWER","uniqueKey":"callAttempts.items.[INDEX].reasonCode","typeLabel":"string"},"notes":{"type":"string","description":"Human-readable notes associated with this call attempt","example":"Candidate did not pick up, mailbox full","uniqueKey":"callAttempts.items.[INDEX].notes","typeLabel":"string"},"retryNumber":{"type":"number","description":"Retry number for this attempt (starting from 0 or 1 depending on implementation)","example":2,"uniqueKey":"callAttempts.items.[INDEX].retryNumber","typeLabel":"number"},"recordingUrl":{"type":"string","description":"URL to the call recording, if available","example":"https://audio.example.com/recording.mp3","uniqueKey":"callAttempts.items.[INDEX].recordingUrl","typeLabel":"string"},"duration":{"type":"number","description":"Duration of the call attempt in seconds","example":180,"uniqueKey":"callAttempts.items.[INDEX].duration","typeLabel":"number"},"scheduledAt":{"type":"string","format":"date-time","description":"Scheduled time for this call attempt (ISO 8601, UTC)","example":"2025-07-22T10:00:00Z","uniqueKey":"callAttempts.items.[INDEX].scheduledAt","typeLabel":"string\u003cdate-time>"},"calledAt":{"type":"string","format":"date-time","description":"Actual time when the call started (ISO 8601, UTC)","example":"2025-07-22T10:01:00Z","uniqueKey":"callAttempts.items.[INDEX].calledAt","typeLabel":"string\u003cdate-time>"},"transcript":{"description":"Transcript segments for this call attempt, ordered chronologically. Each segment contains the speaker, text content, and timing. Omitted when the conversation has no transcript or the call attempt did not produce one.","type":"array","items":{"type":"object","description":"A single segment of a call attempt transcript: one utterance, by either the agent or the contact.","properties":{"speaker":{"type":"string","description":"Who spoke this segment","enum":["AI","HUMAN"],"example":"AI","isRequired":true,"uniqueKey":"callAttempts.items.[INDEX].transcript.items.[INDEX].speaker","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"Transcribed text of the utterance","example":"Hello, thank you for taking the time to speak with me today.","isRequired":true,"uniqueKey":"callAttempts.items.[INDEX].transcript.items.[INDEX].text","typeLabel":"string"},"startTime":{"type":"number","description":"Start time of the segment in seconds from the start of the recording","example":0,"minimum":0,"isRequired":true,"uniqueKey":"callAttempts.items.[INDEX].transcript.items.[INDEX].startTime","typeLabel":"number"},"endTime":{"type":"number","description":"End time of the segment in seconds from the start of the recording","example":3.5,"minimum":0,"isRequired":true,"uniqueKey":"callAttempts.items.[INDEX].transcript.items.[INDEX].endTime","typeLabel":"number"},"language":{"type":"string","description":"BCP-47 language code detected for this segment (e.g. 'en', 'sk')","example":"en","pattern":"^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$","uniqueKey":"callAttempts.items.[INDEX].transcript.items.[INDEX].language","typeLabel":"string"}},"required":["speaker","text","startTime","endTime"],"uniqueKey":"callAttempts.items.[INDEX].transcript.items.[INDEX]","typeLabel":"object"},"uniqueKey":"callAttempts.items.[INDEX].transcript","typeLabel":"object[]"},"flowVersion":{"oneOf":[{"type":"string","description":"Identity of the agent configuration this call was placed with; see `flowVersion` on the conversation. `null` for agents without a designed flow, for inbound calls, for online (browser) calls, whose version is recorded on the conversation only, and for calls placed before 2026-09-23.","pattern":"^[0-9a-f]{64}$","example":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","uniqueKey":"callAttempts.items.[INDEX].flowVersion.oneOf.0","typeLabel":"string"},{"type":"null","description":"Identity of the agent configuration this call was placed with; see `flowVersion` on the conversation. `null` for agents without a designed flow, for inbound calls, for online (browser) calls, whose version is recorded on the conversation only, and for calls placed before 2026-09-23.","pattern":"^[0-9a-f]{64}$","example":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","uniqueKey":"callAttempts.items.[INDEX].flowVersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"callAttempts.items.[INDEX].flowVersion","typeLabel":"string | null"}},"required":["id","direction"],"uniqueKey":"callAttempts.items.[INDEX]","typeLabel":"object"},"uniqueKey":"callAttempts","typeLabel":"object[]"},"analysis":{"type":"object","description":"Conversation analysis data. Present only if analysis has been generated.","required":["id","general"],"properties":{"id":{"type":"string","description":"Analysis ID","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"analysis.id","typeLabel":"string"},"general":{"type":"object","description":"General analysis data","required":["createdAt","updatedAt"],"properties":{"createdAt":{"type":"string","description":"Created timestamp (UTC)","example":"2024-11-16T10:30:00Z","format":"date-time","isRequired":true,"uniqueKey":"analysis.general.createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","description":"Updated timestamp (UTC)","example":"2024-11-16T10:30:00Z","format":"date-time","isRequired":true,"uniqueKey":"analysis.general.updatedAt","typeLabel":"string\u003cdate-time>"},"overallRating":{"oneOf":[{"type":"number","description":"Overall rating (0-100). Null when scoring did not complete — see scoringIncompleteReason. A null rating is never a low one: it means no score was produced, not that the candidate scored badly.","example":85,"uniqueKey":"analysis.general.overallRating.oneOf.0","typeLabel":"number"},{"type":"null","description":"Overall rating (0-100). Null when scoring did not complete — see scoringIncompleteReason. A null rating is never a low one: it means no score was produced, not that the candidate scored badly.","example":85,"uniqueKey":"analysis.general.overallRating.oneOf.1","typeLabel":"null"}],"uniqueKey":"analysis.general.overallRating","typeLabel":"number | null"},"scoringIncompleteReason":{"type":"string","description":"Why no overall rating was produced. Absent on a complete analysis. 'model_unavailable' means the scoring model could not be reached and the analysis is queued to be re-run; 'model_error' means it answered unusably and the analysis will not be retried on its own.","enum":["model_unavailable","model_error"],"example":"model_unavailable","uniqueKey":"analysis.general.scoringIncompleteReason","typeLabel":"enum\u003cstring>"},"companyFitRating":{"type":"string","description":"Company fit rating","enum":["UNDEFINED","LOW","MEDIUM","HIGH"],"example":"HIGH","uniqueKey":"analysis.general.companyFitRating","typeLabel":"enum\u003cstring>"},"education":{"type":"string","description":"Summary of education analysis","example":"Master's degree in Computer Science","uniqueKey":"analysis.general.education","typeLabel":"string"},"experience":{"type":"string","description":"Summary of experience analysis","example":"5 years of experience in software development","uniqueKey":"analysis.general.experience","typeLabel":"string"},"strongPoints":{"description":"Strong points and advantages found in the call","example":["Excellent communication skills","Strong technical expertise in React and Node.js","Proven track record of leading teams"],"type":"array","items":{"type":"string","uniqueKey":"analysis.general.strongPoints.items.[INDEX]","typeLabel":"string"},"uniqueKey":"analysis.general.strongPoints","typeLabel":"string[]"},"weakPoints":{"description":"Weak points, or areas for improvement, found in the call","example":["Limited experience with microservices","Needs improvement in system design"],"type":"array","items":{"type":"string","uniqueKey":"analysis.general.weakPoints.items.[INDEX]","typeLabel":"string"},"uniqueKey":"analysis.general.weakPoints","typeLabel":"string[]"},"evaluation":{"description":"Overall evaluation summary and recommendations","example":["Strong candidate with relevant experience","Good cultural fit for the team","Recommended for next round"],"type":"array","items":{"type":"string","uniqueKey":"analysis.general.evaluation.items.[INDEX]","typeLabel":"string"},"uniqueKey":"analysis.general.evaluation","typeLabel":"string[]"},"status":{"type":"number","description":"Analysis processing status","enum":[1,2,3,4],"example":3,"uniqueKey":"analysis.general.status","typeLabel":"enum\u003cnumber>"}},"isRequired":true,"uniqueKey":"analysis.general","typeLabel":"object"},"specific":{"type":"object","description":"Specific analysis data, depending on the agent's focus (e.g. language test scores, outreach feedback)","example":{"pronunciationScores":{"accuracy":90,"fluency":85,"prosody":82},"grammar":{"level":"C1"}},"uniqueKey":"analysis.specific","typeLabel":"object"}},"uniqueKey":"analysis","typeLabel":"object"},"analytics":{"type":"object","description":"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.","required":["matchScore","updatedAt"],"properties":{"matchScore":{"oneOf":[{"type":"number","description":"The weighted overall match score. Null until scoring has run.","minimum":0,"maximum":100,"example":72,"isRequired":true,"uniqueKey":"analytics.matchScore.oneOf.0","typeLabel":"number"},{"type":"null","description":"The weighted overall match score. Null until scoring has run.","minimum":0,"maximum":100,"example":72,"isRequired":true,"uniqueKey":"analytics.matchScore.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"analytics.matchScore","typeLabel":"number | null"},"updatedAt":{"type":"string","format":"date-time","description":"When these analytics were last written (UTC).","example":"2026-08-03T10:30:00Z","isRequired":true,"uniqueKey":"analytics.updatedAt","typeLabel":"string\u003cdate-time>"},"fields":{"type":"array","description":"The agent's extraction targets, resolved against this call.","items":{"type":"object","description":"One extraction target, resolved against the call.","required":["key","label","type","value"],"properties":{"key":{"type":"string","description":"The key configured on the agent.","example":"budget_confirmed","isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].key","typeLabel":"string"},"label":{"type":"string","example":"Budget confirmed","isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","enum":["string","number","bool","enum"],"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"value":{"oneOf":[{"type":"string","description":"The extracted value, coerced to `type`. `null` when the call did not surface it — which is distinct from a `false` or empty value that WAS surfaced.","example":true,"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].value.oneOf.0","typeLabel":"string"},{"type":"null","description":"The extracted value, coerced to `type`. `null` when the call did not surface it — which is distinct from a `false` or empty value that WAS surfaced.","example":true,"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].value.oneOf.1","typeLabel":"null"},{"type":"number","description":"The extracted value, coerced to `type`. `null` when the call did not surface it — which is distinct from a `false` or empty value that WAS surfaced.","example":true,"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].value.oneOf.2","typeLabel":"number"},{"type":"null","description":"The extracted value, coerced to `type`. `null` when the call did not surface it — which is distinct from a `false` or empty value that WAS surfaced.","example":true,"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].value.oneOf.3","typeLabel":"null"},{"type":"boolean","description":"The extracted value, coerced to `type`. `null` when the call did not surface it — which is distinct from a `false` or empty value that WAS surfaced.","example":true,"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].value.oneOf.4","typeLabel":"boolean"},{"type":"null","description":"The extracted value, coerced to `type`. `null` when the call did not surface it — which is distinct from a `false` or empty value that WAS surfaced.","example":true,"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].value.oneOf.5","typeLabel":"null"}],"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].value","typeLabel":"string · null · number · null · boolean · null"},"confidence":{"type":"number","minimum":0,"maximum":1,"description":"Model confidence, 0..1.","uniqueKey":"analytics.fields.items.[INDEX].confidence","typeLabel":"number"},"evidence":{"type":"string","description":"Short transcript-grounded justification.","example":"Said they have signed off on 15k for this quarter","uniqueKey":"analytics.fields.items.[INDEX].evidence","typeLabel":"string"}},"uniqueKey":"analytics.fields.items.[INDEX]","typeLabel":"object"},"uniqueKey":"analytics.fields","typeLabel":"object[]"},"scoring":{"type":"object","description":"How the match score was made up.","required":["total","items"],"properties":{"total":{"type":"number","minimum":0,"maximum":100,"description":"The weighted overall match score.","example":72,"isRequired":true,"uniqueKey":"analytics.scoring.total","typeLabel":"number"},"items":{"type":"array","description":"One entry per scored item.","items":{"type":"object","description":"One item contributing to the match score.","required":["key","kind","label","score"],"properties":{"key":{"type":"string","description":"The extraction target's or criterion's key, or the flow question's id.","example":"budget_confirmed","isRequired":true,"uniqueKey":"analytics.scoring.\\items.items.[INDEX].key","typeLabel":"string"},"kind":{"type":"string","description":"What kind of thing was scored.","enum":["field","question","criterion"],"example":"field","isRequired":true,"uniqueKey":"analytics.scoring.\\items.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"label":{"type":"string","description":"The field/criterion label, or the question itself.","example":"Budget confirmed","isRequired":true,"uniqueKey":"analytics.scoring.\\items.items.[INDEX].label","typeLabel":"string"},"score":{"type":"number","minimum":0,"maximum":100,"description":"How well this item scored.","example":80,"isRequired":true,"uniqueKey":"analytics.scoring.\\items.items.[INDEX].score","typeLabel":"number"},"weightPercent":{"type":"number","description":"Share of the overall match score this item accounts for, in percent. Computed from the configured weights (which are relative, not a budget), so the shares across all items sum to 100.","minimum":0,"maximum":100,"example":33.3,"uniqueKey":"analytics.scoring.\\items.items.[INDEX].weightPercent","typeLabel":"number"},"importance":{"type":"string","enum":["REQUIRED","PREFERRED"],"uniqueKey":"analytics.scoring.\\items.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"reasoning":{"type":"string","description":"Why it scored that way.","uniqueKey":"analytics.scoring.\\items.items.[INDEX].reasoning","typeLabel":"string"}},"uniqueKey":"analytics.scoring.\\items.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"analytics.scoring.\\items","typeLabel":"object[]"}},"uniqueKey":"analytics.scoring","typeLabel":"object"},"outcomes":{"type":"array","description":"The agent's outcomes, decided for this call.","items":{"type":"object","description":"One of the agent's outcomes, decided for this call.","required":["key","label","met"],"properties":{"key":{"type":"string","description":"The key configured on the agent.","example":"meeting_booked","isRequired":true,"uniqueKey":"analytics.outcomes.items.[INDEX].key","typeLabel":"string"},"label":{"type":"string","example":"Meeting booked","isRequired":true,"uniqueKey":"analytics.outcomes.items.[INDEX].label","typeLabel":"string"},"met":{"type":"boolean","description":"Whether the call achieved it.","example":true,"isRequired":true,"uniqueKey":"analytics.outcomes.items.[INDEX].met","typeLabel":"boolean"},"confidence":{"type":"number","minimum":0,"maximum":1,"uniqueKey":"analytics.outcomes.items.[INDEX].confidence","typeLabel":"number"},"evidence":{"type":"string","description":"Short transcript-grounded justification.","uniqueKey":"analytics.outcomes.items.[INDEX].evidence","typeLabel":"string"}},"uniqueKey":"analytics.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"analytics.outcomes","typeLabel":"object[]"},"tags":{"type":"array","description":"The agent's output tags, assigned or not.","items":{"type":"object","description":"One of the agent's output tags, assigned or not.","required":["key","label","applied"],"properties":{"key":{"type":"string","description":"The key configured on the agent.","example":"needs_followup","isRequired":true,"uniqueKey":"analytics.tags.items.[INDEX].key","typeLabel":"string"},"label":{"type":"string","example":"Needs follow-up","isRequired":true,"uniqueKey":"analytics.tags.items.[INDEX].label","typeLabel":"string"},"applied":{"type":"boolean","description":"Whether the AI applied it to this call.","example":true,"isRequired":true,"uniqueKey":"analytics.tags.items.[INDEX].applied","typeLabel":"boolean"},"reason":{"type":"string","description":"Why.","uniqueKey":"analytics.tags.items.[INDEX].reason","typeLabel":"string"}},"uniqueKey":"analytics.tags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"analytics.tags","typeLabel":"object[]"},"qa":{"type":"array","description":"The flow's looping questions, answered from the transcript.","items":{"type":"object","description":"One of the flow's looping questions, answered from the transcript.","required":["id","question","answered","answer"],"properties":{"id":{"type":"string","format":"uuid","description":"Id of the flow's looping question — the same id the agent read returns.","isRequired":true,"uniqueKey":"analytics.qa.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"question":{"type":"string","description":"The question, as designed.","isRequired":true,"uniqueKey":"analytics.qa.items.[INDEX].question","typeLabel":"string"},"answered":{"type":"boolean","description":"Whether the call actually covered it. Distinguishes “not discussed” from an empty answer.","example":true,"isRequired":true,"uniqueKey":"analytics.qa.items.[INDEX].answered","typeLabel":"boolean"},"answer":{"type":"string","description":"The answer as given on the call; empty when not answered.","isRequired":true,"uniqueKey":"analytics.qa.items.[INDEX].answer","typeLabel":"string"},"asked":{"type":"boolean","description":"Whether the question came up on the call at all: the agent asked it, or the contact answered it unprompted. `asked: true, answered: false` is a question that was asked but got no clear answer. Absent on results analysed before this field existed, unless `answered` is true.","example":true,"uniqueKey":"analytics.qa.items.[INDEX].asked","typeLabel":"boolean"},"evidence":{"type":"string","description":"Short transcript-grounded justification.","uniqueKey":"analytics.qa.items.[INDEX].evidence","typeLabel":"string"}},"uniqueKey":"analytics.qa.items.[INDEX]","typeLabel":"object"},"uniqueKey":"analytics.qa","typeLabel":"object[]"},"evaluation":{"type":"object","description":"Purpose-driven evaluation of the call.","required":["strengths","concerns","objections","assessment"],"properties":{"strengths":{"type":"array","description":"What went well.","items":{"type":"string","uniqueKey":"analytics.evaluation.strengths.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"analytics.evaluation.strengths","typeLabel":"string[]"},"concerns":{"type":"array","description":"What went poorly, and the risks.","items":{"type":"string","uniqueKey":"analytics.evaluation.concerns.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"analytics.evaluation.concerns","typeLabel":"string[]"},"objections":{"type":"array","description":"Objections or hesitations the contact raised.","items":{"type":"string","uniqueKey":"analytics.evaluation.objections.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"analytics.evaluation.objections","typeLabel":"string[]"},"assessment":{"type":"array","description":"Overall assessment, a few holistic lines.","items":{"type":"string","uniqueKey":"analytics.evaluation.assessment.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"analytics.evaluation.assessment","typeLabel":"string[]"}},"uniqueKey":"analytics.evaluation","typeLabel":"object"},"sentiment":{"type":"object","description":"Overall tone of the call.","required":["overall"],"properties":{"overall":{"type":"string","enum":["positive","neutral","negative"],"example":"positive","isRequired":true,"uniqueKey":"analytics.sentiment.overall","typeLabel":"enum\u003cstring>"},"score":{"type":"number","minimum":0,"maximum":1,"description":"0 (very negative) .. 1 (very positive).","uniqueKey":"analytics.sentiment.score","typeLabel":"number"},"trajectory":{"type":"string","enum":["improving","declining","steady","mixed"],"uniqueKey":"analytics.sentiment.trajectory","typeLabel":"enum\u003cstring>"},"notes":{"type":"string","description":"One-line note explaining the read.","uniqueKey":"analytics.sentiment.notes","typeLabel":"string"}},"uniqueKey":"analytics.sentiment","typeLabel":"object"},"summary":{"type":"string","description":"Generic call summary.","example":"Qualified lead; demo booked for Thursday.","uniqueKey":"analytics.summary","typeLabel":"string"}},"uniqueKey":"analytics","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"uniqueKey":"isTest","typeLabel":"boolean"}},"required":["id","contactId","candidateId","agentId","status","scheduledAt","createdAt","updatedAt"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"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","flowVersion":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","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"}],"flowVersion":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"}],"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":"\u003cstring>"}]},"outcomes":[{"key":"meeting_booked","label":"Meeting booked","met":true,"confidence":0.5,"evidence":"\u003cstring>"}],"tags":[{"key":"needs_followup","label":"Needs follow-up","applied":true,"reason":"\u003cstring>"}],"qa":[{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","question":"\u003cstring>","answered":true,"answer":"\u003cstring>","asked":true,"evidence":"\u003cstring>"}],"evaluation":{"strengths":["\u003cstring>"],"concerns":["\u003cstring>"],"objections":["\u003cstring>"],"assessment":["\u003cstring>"]},"sentiment":{"overall":"positive","score":0.5,"trajectory":"improving","notes":"\u003cstring>"},"summary":"Qualified lead; demo booked for Thursday."},"isTest":false}}},"exampleType":"generated"}},"exampleType":"generated"},"c03cc7f7-592b-479e-b28c-e06e8bb8f35a":{"description":"Conversation created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Conversation ID","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"id","typeLabel":"string\u003cuuid>"},"contactId":{"type":"string","format":"uuid","description":"Contact ID","example":"987e6543-e21b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"contactId","typeLabel":"string\u003cuuid>"},"candidateId":{"type":"string","format":"uuid","description":"Deprecated alias of `contactId`, always identical to it. Kept for the life of v1 so existing integrations keep working; new callers should read `contactId`.","example":"987e6543-e21b-12d3-a456-426614174000","deprecated":true,"isRequired":true,"uniqueKey":"candidateId","typeLabel":"string\u003cuuid>"},"agentId":{"type":"string","description":"Agent ID","format":"uuid","example":"456e7890-e12b-34d5-a678-901234567890","isRequired":true,"uniqueKey":"agentId","typeLabel":"string\u003cuuid>"},"status":{"type":"string","description":"Conversation status","enum":["UNDEFINED","SCHEDULED","CANCELLED","FAILED","COMPLETED","IN_PROGRESS","UNREACHABLE"],"example":"SCHEDULED","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"scheduledAt":{"type":"string","format":"date-time","description":"Scheduled time","example":"2025-11-20T10:00:00Z","isRequired":true,"uniqueKey":"scheduledAt","typeLabel":"string\u003cdate-time>"},"createdAt":{"type":"string","description":"Created timestamp","example":"2024-11-16T10:30:00Z","isRequired":true,"uniqueKey":"createdAt","typeLabel":"string"},"updatedAt":{"type":"string","description":"Updated timestamp","example":"2024-11-16T10:30:00Z","isRequired":true,"uniqueKey":"updatedAt","typeLabel":"string"},"jobId":{"oneOf":[{"type":"string","description":"Job ID associated with this conversation, if any","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"jobId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"Job ID associated with this conversation, if any","format":"uuid","example":"123e4567-e89b-12d3-a456-426614174000","uniqueKey":"jobId.oneOf.1","typeLabel":"null"}],"uniqueKey":"jobId","typeLabel":"string\u003cuuid> | null"},"runId":{"oneOf":[{"type":"string","description":"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.","format":"uuid","example":"789e0123-e45b-67d8-a901-234567890123","uniqueKey":"runId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"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.","format":"uuid","example":"789e0123-e45b-67d8-a901-234567890123","uniqueKey":"runId.oneOf.1","typeLabel":"null"}],"uniqueKey":"runId","typeLabel":"string\u003cuuid> | null"},"flowVersion":{"oneOf":[{"type":"string","description":"Identity of the agent configuration (flow, guardrails and context, as compiled) that the most recent call in this conversation was placed with. A content hash: two calls that ran the same configuration carry the same value, and any edit that changes what the agent says produces a new one. Each entry in `callAttempts` carries its own, since a retry placed after an edit runs the edited configuration. `null` for agents without a designed flow and for calls placed before 2026-09-23.","pattern":"^[0-9a-f]{64}$","example":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","uniqueKey":"flowVersion.oneOf.0","typeLabel":"string"},{"type":"null","description":"Identity of the agent configuration (flow, guardrails and context, as compiled) that the most recent call in this conversation was placed with. A content hash: two calls that ran the same configuration carry the same value, and any edit that changes what the agent says produces a new one. Each entry in `callAttempts` carries its own, since a retry placed after an edit runs the edited configuration. `null` for agents without a designed flow and for calls placed before 2026-09-23.","pattern":"^[0-9a-f]{64}$","example":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","uniqueKey":"flowVersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"flowVersion","typeLabel":"string | null"},"durationMinutes":{"type":"number","description":"Conversation duration in minutes","example":15,"uniqueKey":"durationMinutes","typeLabel":"number"},"finishedDate":{"type":"string","format":"date-time","description":"Finished date","example":"2025-11-20T10:15:00Z","uniqueKey":"finishedDate","typeLabel":"string\u003cdate-time>"},"metadata":{"type":"object","description":"Custom metadata","example":{"externalInterviewId":"INT-789"},"uniqueKey":"metadata","typeLabel":"object"},"callAttempts":{"description":"Call attempt logs for this conversation. Present for PHONE conversations, typically empty or undefined for ONLINE ones.","type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Call attempt ID","example":"c9c9a6e8-fb4a-45f3-80fc-bf94f071cd2a","isRequired":true,"uniqueKey":"callAttempts.items.[INDEX].id","typeLabel":"string"},"direction":{"type":"string","description":"How the call was made: OUTBOUND (we dialled the candidate), INBOUND (the candidate called in) or ONLINE (a browser session on an online interview).","enum":["UNDEFINED","INBOUND","OUTBOUND","ONLINE"],"example":"OUTBOUND","isRequired":true,"uniqueKey":"callAttempts.items.[INDEX].direction","typeLabel":"enum\u003cstring>"},"status":{"type":"string","description":"Current status of the call attempt","enum":["UNDEFINED","SCHEDULED","IN_PROGRESS","COMPLETED","NO_ANSWER","BUSY","FAILED","CANCELLED","VOICEMAIL","REJECTED","NO_CONSENT","TIMEOUT","MAX_ATTEMPTS_REACHED","HUMAN_CONTACT_REQUESTED","OTHER_ROLE_INTEREST","POLITE_DECLINE","TIMING_ISSUE"],"example":"COMPLETED","uniqueKey":"callAttempts.items.[INDEX].status","typeLabel":"enum\u003cstring>"},"reasonCode":{"type":"string","description":"Machine-readable reason code for failures or special outcomes","example":"NO_ANSWER","uniqueKey":"callAttempts.items.[INDEX].reasonCode","typeLabel":"string"},"notes":{"type":"string","description":"Human-readable notes associated with this call attempt","example":"Candidate did not pick up, mailbox full","uniqueKey":"callAttempts.items.[INDEX].notes","typeLabel":"string"},"retryNumber":{"type":"number","description":"Retry number for this attempt (starting from 0 or 1 depending on implementation)","example":2,"uniqueKey":"callAttempts.items.[INDEX].retryNumber","typeLabel":"number"},"recordingUrl":{"type":"string","description":"URL to the call recording, if available","example":"https://audio.example.com/recording.mp3","uniqueKey":"callAttempts.items.[INDEX].recordingUrl","typeLabel":"string"},"duration":{"type":"number","description":"Duration of the call attempt in seconds","example":180,"uniqueKey":"callAttempts.items.[INDEX].duration","typeLabel":"number"},"scheduledAt":{"type":"string","format":"date-time","description":"Scheduled time for this call attempt (ISO 8601, UTC)","example":"2025-07-22T10:00:00Z","uniqueKey":"callAttempts.items.[INDEX].scheduledAt","typeLabel":"string\u003cdate-time>"},"calledAt":{"type":"string","format":"date-time","description":"Actual time when the call started (ISO 8601, UTC)","example":"2025-07-22T10:01:00Z","uniqueKey":"callAttempts.items.[INDEX].calledAt","typeLabel":"string\u003cdate-time>"},"transcript":{"description":"Transcript segments for this call attempt, ordered chronologically. Each segment contains the speaker, text content, and timing. Omitted when the conversation has no transcript or the call attempt did not produce one.","type":"array","items":{"type":"object","description":"A single segment of a call attempt transcript: one utterance, by either the agent or the contact.","properties":{"speaker":{"type":"string","description":"Who spoke this segment","enum":["AI","HUMAN"],"example":"AI","isRequired":true,"uniqueKey":"callAttempts.items.[INDEX].transcript.items.[INDEX].speaker","typeLabel":"enum\u003cstring>"},"text":{"type":"string","description":"Transcribed text of the utterance","example":"Hello, thank you for taking the time to speak with me today.","isRequired":true,"uniqueKey":"callAttempts.items.[INDEX].transcript.items.[INDEX].text","typeLabel":"string"},"startTime":{"type":"number","description":"Start time of the segment in seconds from the start of the recording","example":0,"minimum":0,"isRequired":true,"uniqueKey":"callAttempts.items.[INDEX].transcript.items.[INDEX].startTime","typeLabel":"number"},"endTime":{"type":"number","description":"End time of the segment in seconds from the start of the recording","example":3.5,"minimum":0,"isRequired":true,"uniqueKey":"callAttempts.items.[INDEX].transcript.items.[INDEX].endTime","typeLabel":"number"},"language":{"type":"string","description":"BCP-47 language code detected for this segment (e.g. 'en', 'sk')","example":"en","pattern":"^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$","uniqueKey":"callAttempts.items.[INDEX].transcript.items.[INDEX].language","typeLabel":"string"}},"required":["speaker","text","startTime","endTime"],"uniqueKey":"callAttempts.items.[INDEX].transcript.items.[INDEX]","typeLabel":"object"},"uniqueKey":"callAttempts.items.[INDEX].transcript","typeLabel":"object[]"},"flowVersion":{"oneOf":[{"type":"string","description":"Identity of the agent configuration this call was placed with; see `flowVersion` on the conversation. `null` for agents without a designed flow, for inbound calls, for online (browser) calls, whose version is recorded on the conversation only, and for calls placed before 2026-09-23.","pattern":"^[0-9a-f]{64}$","example":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","uniqueKey":"callAttempts.items.[INDEX].flowVersion.oneOf.0","typeLabel":"string"},{"type":"null","description":"Identity of the agent configuration this call was placed with; see `flowVersion` on the conversation. `null` for agents without a designed flow, for inbound calls, for online (browser) calls, whose version is recorded on the conversation only, and for calls placed before 2026-09-23.","pattern":"^[0-9a-f]{64}$","example":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","uniqueKey":"callAttempts.items.[INDEX].flowVersion.oneOf.1","typeLabel":"null"}],"uniqueKey":"callAttempts.items.[INDEX].flowVersion","typeLabel":"string | null"}},"required":["id","direction"],"uniqueKey":"callAttempts.items.[INDEX]","typeLabel":"object"},"uniqueKey":"callAttempts","typeLabel":"object[]"},"analysis":{"type":"object","description":"Conversation analysis data. Present only if analysis has been generated.","required":["id","general"],"properties":{"id":{"type":"string","description":"Analysis ID","example":"123e4567-e89b-12d3-a456-426614174000","isRequired":true,"uniqueKey":"analysis.id","typeLabel":"string"},"general":{"type":"object","description":"General analysis data","required":["createdAt","updatedAt"],"properties":{"createdAt":{"type":"string","description":"Created timestamp (UTC)","example":"2024-11-16T10:30:00Z","format":"date-time","isRequired":true,"uniqueKey":"analysis.general.createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","description":"Updated timestamp (UTC)","example":"2024-11-16T10:30:00Z","format":"date-time","isRequired":true,"uniqueKey":"analysis.general.updatedAt","typeLabel":"string\u003cdate-time>"},"overallRating":{"oneOf":[{"type":"number","description":"Overall rating (0-100). Null when scoring did not complete — see scoringIncompleteReason. A null rating is never a low one: it means no score was produced, not that the candidate scored badly.","example":85,"uniqueKey":"analysis.general.overallRating.oneOf.0","typeLabel":"number"},{"type":"null","description":"Overall rating (0-100). Null when scoring did not complete — see scoringIncompleteReason. A null rating is never a low one: it means no score was produced, not that the candidate scored badly.","example":85,"uniqueKey":"analysis.general.overallRating.oneOf.1","typeLabel":"null"}],"uniqueKey":"analysis.general.overallRating","typeLabel":"number | null"},"scoringIncompleteReason":{"type":"string","description":"Why no overall rating was produced. Absent on a complete analysis. 'model_unavailable' means the scoring model could not be reached and the analysis is queued to be re-run; 'model_error' means it answered unusably and the analysis will not be retried on its own.","enum":["model_unavailable","model_error"],"example":"model_unavailable","uniqueKey":"analysis.general.scoringIncompleteReason","typeLabel":"enum\u003cstring>"},"companyFitRating":{"type":"string","description":"Company fit rating","enum":["UNDEFINED","LOW","MEDIUM","HIGH"],"example":"HIGH","uniqueKey":"analysis.general.companyFitRating","typeLabel":"enum\u003cstring>"},"education":{"type":"string","description":"Summary of education analysis","example":"Master's degree in Computer Science","uniqueKey":"analysis.general.education","typeLabel":"string"},"experience":{"type":"string","description":"Summary of experience analysis","example":"5 years of experience in software development","uniqueKey":"analysis.general.experience","typeLabel":"string"},"strongPoints":{"description":"Strong points and advantages found in the call","example":["Excellent communication skills","Strong technical expertise in React and Node.js","Proven track record of leading teams"],"type":"array","items":{"type":"string","uniqueKey":"analysis.general.strongPoints.items.[INDEX]","typeLabel":"string"},"uniqueKey":"analysis.general.strongPoints","typeLabel":"string[]"},"weakPoints":{"description":"Weak points, or areas for improvement, found in the call","example":["Limited experience with microservices","Needs improvement in system design"],"type":"array","items":{"type":"string","uniqueKey":"analysis.general.weakPoints.items.[INDEX]","typeLabel":"string"},"uniqueKey":"analysis.general.weakPoints","typeLabel":"string[]"},"evaluation":{"description":"Overall evaluation summary and recommendations","example":["Strong candidate with relevant experience","Good cultural fit for the team","Recommended for next round"],"type":"array","items":{"type":"string","uniqueKey":"analysis.general.evaluation.items.[INDEX]","typeLabel":"string"},"uniqueKey":"analysis.general.evaluation","typeLabel":"string[]"},"status":{"type":"number","description":"Analysis processing status","enum":[1,2,3,4],"example":3,"uniqueKey":"analysis.general.status","typeLabel":"enum\u003cnumber>"}},"isRequired":true,"uniqueKey":"analysis.general","typeLabel":"object"},"specific":{"type":"object","description":"Specific analysis data, depending on the agent's focus (e.g. language test scores, outreach feedback)","example":{"pronunciationScores":{"accuracy":90,"fluency":85,"prosody":82},"grammar":{"level":"C1"}},"uniqueKey":"analysis.specific","typeLabel":"object"}},"uniqueKey":"analysis","typeLabel":"object"},"analytics":{"type":"object","description":"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.","required":["matchScore","updatedAt"],"properties":{"matchScore":{"oneOf":[{"type":"number","description":"The weighted overall match score. Null until scoring has run.","minimum":0,"maximum":100,"example":72,"isRequired":true,"uniqueKey":"analytics.matchScore.oneOf.0","typeLabel":"number"},{"type":"null","description":"The weighted overall match score. Null until scoring has run.","minimum":0,"maximum":100,"example":72,"isRequired":true,"uniqueKey":"analytics.matchScore.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"analytics.matchScore","typeLabel":"number | null"},"updatedAt":{"type":"string","format":"date-time","description":"When these analytics were last written (UTC).","example":"2026-08-03T10:30:00Z","isRequired":true,"uniqueKey":"analytics.updatedAt","typeLabel":"string\u003cdate-time>"},"fields":{"type":"array","description":"The agent's extraction targets, resolved against this call.","items":{"type":"object","description":"One extraction target, resolved against the call.","required":["key","label","type","value"],"properties":{"key":{"type":"string","description":"The key configured on the agent.","example":"budget_confirmed","isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].key","typeLabel":"string"},"label":{"type":"string","example":"Budget confirmed","isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","enum":["string","number","bool","enum"],"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"value":{"oneOf":[{"type":"string","description":"The extracted value, coerced to `type`. `null` when the call did not surface it — which is distinct from a `false` or empty value that WAS surfaced.","example":true,"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].value.oneOf.0","typeLabel":"string"},{"type":"null","description":"The extracted value, coerced to `type`. `null` when the call did not surface it — which is distinct from a `false` or empty value that WAS surfaced.","example":true,"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].value.oneOf.1","typeLabel":"null"},{"type":"number","description":"The extracted value, coerced to `type`. `null` when the call did not surface it — which is distinct from a `false` or empty value that WAS surfaced.","example":true,"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].value.oneOf.2","typeLabel":"number"},{"type":"null","description":"The extracted value, coerced to `type`. `null` when the call did not surface it — which is distinct from a `false` or empty value that WAS surfaced.","example":true,"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].value.oneOf.3","typeLabel":"null"},{"type":"boolean","description":"The extracted value, coerced to `type`. `null` when the call did not surface it — which is distinct from a `false` or empty value that WAS surfaced.","example":true,"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].value.oneOf.4","typeLabel":"boolean"},{"type":"null","description":"The extracted value, coerced to `type`. `null` when the call did not surface it — which is distinct from a `false` or empty value that WAS surfaced.","example":true,"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].value.oneOf.5","typeLabel":"null"}],"isRequired":true,"uniqueKey":"analytics.fields.items.[INDEX].value","typeLabel":"string · null · number · null · boolean · null"},"confidence":{"type":"number","minimum":0,"maximum":1,"description":"Model confidence, 0..1.","uniqueKey":"analytics.fields.items.[INDEX].confidence","typeLabel":"number"},"evidence":{"type":"string","description":"Short transcript-grounded justification.","example":"Said they have signed off on 15k for this quarter","uniqueKey":"analytics.fields.items.[INDEX].evidence","typeLabel":"string"}},"uniqueKey":"analytics.fields.items.[INDEX]","typeLabel":"object"},"uniqueKey":"analytics.fields","typeLabel":"object[]"},"scoring":{"type":"object","description":"How the match score was made up.","required":["total","items"],"properties":{"total":{"type":"number","minimum":0,"maximum":100,"description":"The weighted overall match score.","example":72,"isRequired":true,"uniqueKey":"analytics.scoring.total","typeLabel":"number"},"items":{"type":"array","description":"One entry per scored item.","items":{"type":"object","description":"One item contributing to the match score.","required":["key","kind","label","score"],"properties":{"key":{"type":"string","description":"The extraction target's or criterion's key, or the flow question's id.","example":"budget_confirmed","isRequired":true,"uniqueKey":"analytics.scoring.\\items.items.[INDEX].key","typeLabel":"string"},"kind":{"type":"string","description":"What kind of thing was scored.","enum":["field","question","criterion"],"example":"field","isRequired":true,"uniqueKey":"analytics.scoring.\\items.items.[INDEX].kind","typeLabel":"enum\u003cstring>"},"label":{"type":"string","description":"The field/criterion label, or the question itself.","example":"Budget confirmed","isRequired":true,"uniqueKey":"analytics.scoring.\\items.items.[INDEX].label","typeLabel":"string"},"score":{"type":"number","minimum":0,"maximum":100,"description":"How well this item scored.","example":80,"isRequired":true,"uniqueKey":"analytics.scoring.\\items.items.[INDEX].score","typeLabel":"number"},"weightPercent":{"type":"number","description":"Share of the overall match score this item accounts for, in percent. Computed from the configured weights (which are relative, not a budget), so the shares across all items sum to 100.","minimum":0,"maximum":100,"example":33.3,"uniqueKey":"analytics.scoring.\\items.items.[INDEX].weightPercent","typeLabel":"number"},"importance":{"type":"string","enum":["REQUIRED","PREFERRED"],"uniqueKey":"analytics.scoring.\\items.items.[INDEX].importance","typeLabel":"enum\u003cstring>"},"reasoning":{"type":"string","description":"Why it scored that way.","uniqueKey":"analytics.scoring.\\items.items.[INDEX].reasoning","typeLabel":"string"}},"uniqueKey":"analytics.scoring.\\items.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"analytics.scoring.\\items","typeLabel":"object[]"}},"uniqueKey":"analytics.scoring","typeLabel":"object"},"outcomes":{"type":"array","description":"The agent's outcomes, decided for this call.","items":{"type":"object","description":"One of the agent's outcomes, decided for this call.","required":["key","label","met"],"properties":{"key":{"type":"string","description":"The key configured on the agent.","example":"meeting_booked","isRequired":true,"uniqueKey":"analytics.outcomes.items.[INDEX].key","typeLabel":"string"},"label":{"type":"string","example":"Meeting booked","isRequired":true,"uniqueKey":"analytics.outcomes.items.[INDEX].label","typeLabel":"string"},"met":{"type":"boolean","description":"Whether the call achieved it.","example":true,"isRequired":true,"uniqueKey":"analytics.outcomes.items.[INDEX].met","typeLabel":"boolean"},"confidence":{"type":"number","minimum":0,"maximum":1,"uniqueKey":"analytics.outcomes.items.[INDEX].confidence","typeLabel":"number"},"evidence":{"type":"string","description":"Short transcript-grounded justification.","uniqueKey":"analytics.outcomes.items.[INDEX].evidence","typeLabel":"string"}},"uniqueKey":"analytics.outcomes.items.[INDEX]","typeLabel":"object"},"uniqueKey":"analytics.outcomes","typeLabel":"object[]"},"tags":{"type":"array","description":"The agent's output tags, assigned or not.","items":{"type":"object","description":"One of the agent's output tags, assigned or not.","required":["key","label","applied"],"properties":{"key":{"type":"string","description":"The key configured on the agent.","example":"needs_followup","isRequired":true,"uniqueKey":"analytics.tags.items.[INDEX].key","typeLabel":"string"},"label":{"type":"string","example":"Needs follow-up","isRequired":true,"uniqueKey":"analytics.tags.items.[INDEX].label","typeLabel":"string"},"applied":{"type":"boolean","description":"Whether the AI applied it to this call.","example":true,"isRequired":true,"uniqueKey":"analytics.tags.items.[INDEX].applied","typeLabel":"boolean"},"reason":{"type":"string","description":"Why.","uniqueKey":"analytics.tags.items.[INDEX].reason","typeLabel":"string"}},"uniqueKey":"analytics.tags.items.[INDEX]","typeLabel":"object"},"uniqueKey":"analytics.tags","typeLabel":"object[]"},"qa":{"type":"array","description":"The flow's looping questions, answered from the transcript.","items":{"type":"object","description":"One of the flow's looping questions, answered from the transcript.","required":["id","question","answered","answer"],"properties":{"id":{"type":"string","format":"uuid","description":"Id of the flow's looping question — the same id the agent read returns.","isRequired":true,"uniqueKey":"analytics.qa.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"question":{"type":"string","description":"The question, as designed.","isRequired":true,"uniqueKey":"analytics.qa.items.[INDEX].question","typeLabel":"string"},"answered":{"type":"boolean","description":"Whether the call actually covered it. Distinguishes “not discussed” from an empty answer.","example":true,"isRequired":true,"uniqueKey":"analytics.qa.items.[INDEX].answered","typeLabel":"boolean"},"answer":{"type":"string","description":"The answer as given on the call; empty when not answered.","isRequired":true,"uniqueKey":"analytics.qa.items.[INDEX].answer","typeLabel":"string"},"asked":{"type":"boolean","description":"Whether the question came up on the call at all: the agent asked it, or the contact answered it unprompted. `asked: true, answered: false` is a question that was asked but got no clear answer. Absent on results analysed before this field existed, unless `answered` is true.","example":true,"uniqueKey":"analytics.qa.items.[INDEX].asked","typeLabel":"boolean"},"evidence":{"type":"string","description":"Short transcript-grounded justification.","uniqueKey":"analytics.qa.items.[INDEX].evidence","typeLabel":"string"}},"uniqueKey":"analytics.qa.items.[INDEX]","typeLabel":"object"},"uniqueKey":"analytics.qa","typeLabel":"object[]"},"evaluation":{"type":"object","description":"Purpose-driven evaluation of the call.","required":["strengths","concerns","objections","assessment"],"properties":{"strengths":{"type":"array","description":"What went well.","items":{"type":"string","uniqueKey":"analytics.evaluation.strengths.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"analytics.evaluation.strengths","typeLabel":"string[]"},"concerns":{"type":"array","description":"What went poorly, and the risks.","items":{"type":"string","uniqueKey":"analytics.evaluation.concerns.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"analytics.evaluation.concerns","typeLabel":"string[]"},"objections":{"type":"array","description":"Objections or hesitations the contact raised.","items":{"type":"string","uniqueKey":"analytics.evaluation.objections.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"analytics.evaluation.objections","typeLabel":"string[]"},"assessment":{"type":"array","description":"Overall assessment, a few holistic lines.","items":{"type":"string","uniqueKey":"analytics.evaluation.assessment.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"analytics.evaluation.assessment","typeLabel":"string[]"}},"uniqueKey":"analytics.evaluation","typeLabel":"object"},"sentiment":{"type":"object","description":"Overall tone of the call.","required":["overall"],"properties":{"overall":{"type":"string","enum":["positive","neutral","negative"],"example":"positive","isRequired":true,"uniqueKey":"analytics.sentiment.overall","typeLabel":"enum\u003cstring>"},"score":{"type":"number","minimum":0,"maximum":1,"description":"0 (very negative) .. 1 (very positive).","uniqueKey":"analytics.sentiment.score","typeLabel":"number"},"trajectory":{"type":"string","enum":["improving","declining","steady","mixed"],"uniqueKey":"analytics.sentiment.trajectory","typeLabel":"enum\u003cstring>"},"notes":{"type":"string","description":"One-line note explaining the read.","uniqueKey":"analytics.sentiment.notes","typeLabel":"string"}},"uniqueKey":"analytics.sentiment","typeLabel":"object"},"summary":{"type":"string","description":"Generic call summary.","example":"Qualified lead; demo booked for Thursday.","uniqueKey":"analytics.summary","typeLabel":"string"}},"uniqueKey":"analytics","typeLabel":"object"},"isTest":{"type":"boolean","description":"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.","example":false,"uniqueKey":"isTest","typeLabel":"boolean"}},"required":["id","contactId","candidateId","agentId","status","scheduledAt","createdAt","updatedAt"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"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","flowVersion":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08","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"}],"flowVersion":"9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"}],"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":"\u003cstring>"}]},"outcomes":[{"key":"meeting_booked","label":"Meeting booked","met":true,"confidence":0.5,"evidence":"\u003cstring>"}],"tags":[{"key":"needs_followup","label":"Needs follow-up","applied":true,"reason":"\u003cstring>"}],"qa":[{"id":"3c90c3cc-0d44-4b50-8888-8dd25736052a","question":"\u003cstring>","answered":true,"answer":"\u003cstring>","asked":true,"evidence":"\u003cstring>"}],"evaluation":{"strengths":["\u003cstring>"],"concerns":["\u003cstring>"],"objections":["\u003cstring>"],"assessment":["\u003cstring>"]},"sentiment":{"overall":"positive","score":0.5,"trajectory":"improving","notes":"\u003cstring>"},"summary":"Qualified lead; demo booked for Thursday."},"isTest":false}}},"exampleType":"generated"}},"exampleType":"generated"},"8e377c84-bf9b-4e37-a0ba-ee540819b857":{"description":"Bad Request - Validation error or invalid input","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"integer","example":400,"isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","example":"Validation failed","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"string","example":"Bad Request","uniqueKey":"error","typeLabel":"string"}},"required":["statusCode","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"missingJobId":{"title":"missingJobId","value":{"statusCode":400,"message":"Job ID must be provided when candidate has multiple job assignments","error":"Bad Request"}},"xorViolation":{"title":"xorViolation","value":{"statusCode":400,"message":"Either contactId or contact must be provided, but not both.","error":"Bad Request"}},"jobXorViolation":{"title":"jobXorViolation","value":{"statusCode":400,"message":"Either jobId or job must be provided, but not both. You may also provide neither.","error":"Bad Request"}}},"exampleType":"examples"}},"exampleType":"examples"},"c15eaedc-f1e8-440d-af51-d84ad9e127c1":{"description":"Unauthorized - Invalid or missing API key","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"integer","example":400,"isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","example":"Validation failed","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"string","example":"Bad Request","uniqueKey":"error","typeLabel":"string"}},"required":["statusCode","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"missingBearer":{"title":"missingBearer","value":{"statusCode":401,"message":"Unauthorized","error":"Unauthorized"}}},"exampleType":"examples"}},"exampleType":"examples"},"35f40284-c747-4a03-8193-eac0f25d6984":{"description":"Payment Required - no active subscription, or the batch costs more than the balance allows. May carry a `billing` object with the required and available amounts; it is absent when no figures were reported.","content":{"application/json":{"schema":{"type":"object","description":"A 402 refusal. `billing` is present when the billing system reported figures, and absent when it had none to report - treat an absent object as unknown rather than as zero.","properties":{"statusCode":{"type":"integer","example":402,"isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","example":"Insufficient minutes available to schedule 10 interviews (50 minutes total). Please purchase additional minutes.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"string","example":"PAYMENT_REQUIRED","uniqueKey":"error","typeLabel":"string"},"billing":{"type":"object","description":"The shortfall, in the company's own billing unit. Read `billingSystem` first: a minutes-based company carries `requiredMinutes` and `availableMinutes`, a credits-based one `requiredCredits` and `availableCredits`, matching the split `GET /billing/usage` returns.","properties":{"billingSystem":{"type":"string","enum":["minutes","credits"],"example":"minutes","isRequired":true,"uniqueKey":"billing.billingSystem","typeLabel":"enum\u003cstring>"},"requiredMinutes":{"type":"number","description":"Minutes the request would cost. Present only for a minutes-based company.","example":50,"uniqueKey":"billing.requiredMinutes","typeLabel":"number"},"availableMinutes":{"type":"number","description":"Minutes the company has left. Present only for a minutes-based company.","example":12,"uniqueKey":"billing.availableMinutes","typeLabel":"number"},"requiredCredits":{"type":"number","description":"Credits the request would cost. Present only for a credits-based company.","example":50,"uniqueKey":"billing.requiredCredits","typeLabel":"number"},"availableCredits":{"type":"number","description":"Credits the company has left. Present only for a credits-based company.","example":12,"uniqueKey":"billing.availableCredits","typeLabel":"number"},"suggestedAction":{"type":"string","enum":["purchase_minutes","upgrade_plan","increase_spending_cap","contact_support"],"example":"purchase_minutes","uniqueKey":"billing.suggestedAction","typeLabel":"enum\u003cstring>"}},"required":["billingSystem"],"uniqueKey":"billing","typeLabel":"object"},"traceId":{"type":"string","example":"4b1f0c9d2e6a47f8b3c5d7e9a1b2c3d4","uniqueKey":"traceId","typeLabel":"string"}},"required":["statusCode","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":402,"message":"Insufficient minutes available to schedule 10 interviews (50 minutes total). Please purchase additional minutes.","error":"PAYMENT_REQUIRED","billing":{"billingSystem":"minutes","requiredMinutes":50,"availableMinutes":12,"requiredCredits":50,"availableCredits":12,"suggestedAction":"purchase_minutes"},"traceId":"4b1f0c9d2e6a47f8b3c5d7e9a1b2c3d4"}}},"exampleType":"generated"}},"exampleType":"generated"},"6bee66f9-b444-46fd-bb80-fe1fa4b2f849":{"description":"Forbidden - access denied. Billing refusals are 402, not 403.","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"integer","example":400,"isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","example":"Validation failed","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"string","example":"Bad Request","uniqueKey":"error","typeLabel":"string"}},"required":["statusCode","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request"}}},"exampleType":"generated"}},"exampleType":"generated"},"a12c919c-9651-4d71-8c39-d49cea628238":{"description":"Not Found - Resource not found","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"integer","example":400,"isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","example":"Validation failed","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"string","example":"Bad Request","uniqueKey":"error","typeLabel":"string"}},"required":["statusCode","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request"}}},"exampleType":"generated"}},"exampleType":"generated"},"c922b6cf-f5ba-445a-a4b2-ece973d9076a":{"description":"An inline `agent` carried a structurally invalid conversation flow. `errors` lists every problem found, each with the path of the block it is on. Other 422s on this route carry a message but no `errors`.","content":{"application/json":{"schema":{"type":"object","description":"A 422 from a route that accepts a conversation flow. `errors` is present when the flow itself failed structural validation, and lists EVERY problem found — fixing a flow should not take one request per fault. It is absent on the other 422s these routes can return, which carry a `message` only.","properties":{"statusCode":{"type":"integer","example":422,"isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","example":"Invalid conversation flow.","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"errors":{"type":"array","description":"Every problem found in the flow, one entry per problem.","items":{"type":"object","description":"One problem found in a submitted conversation flow.","properties":{"code":{"type":"string","description":"Machine-readable code identifying what is wrong. Match on the codes you handle and fall back on `message` for the rest — the set grows as the flow schema does, and a code is added without a major version.","example":"UNKNOWN_BLOCK_TYPE","isRequired":true,"uniqueKey":"errors.items.[INDEX].code","typeLabel":"string"},"message":{"type":"string","description":"Human-readable explanation of this single problem.","example":"Unknown block type: teleport.","isRequired":true,"uniqueKey":"errors.items.[INDEX].message","typeLabel":"string"},"path":{"type":"string","description":"Path to the offending node in the flow document you sent. This is what to show a user, and what to anchor an editor to.","example":"sections[2].branches[0].blocks[1]","uniqueKey":"errors.items.[INDEX].path","typeLabel":"string"}},"required":["code","message"],"uniqueKey":"errors.items.[INDEX]","typeLabel":"object"},"uniqueKey":"errors","typeLabel":"object[]"},"traceId":{"type":"string","description":"Trace identifier for this request. Quote it when contacting support.","example":"6a707aee000000000c1e285eefed9980","uniqueKey":"traceId","typeLabel":"string"}},"required":["statusCode","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"invalidFlow":{"title":"invalidFlow","value":{"statusCode":422,"message":"Invalid conversation flow.","errors":[{"code":"LOOPING_QUESTION_INCOMPLETE","message":"Each looping question needs a non-empty question.","path":"sections[1].questions[0]"}],"traceId":"6a707aee000000000c1e285eefed9980"}}},"exampleType":"examples"}},"exampleType":"examples"},"31cd6bc6-c44a-4e5f-8d54-246858cb8c48":{"description":"Too Many Requests - Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"integer","example":400,"isRequired":true,"uniqueKey":"statusCode","typeLabel":"integer"},"message":{"type":"string","example":"Validation failed","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"error":{"type":"string","example":"Bad Request","uniqueKey":"error","typeLabel":"string"}},"required":["statusCode","message"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"statusCode":400,"message":"Validation failed","error":"Bad Request"}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"d381dc5d-ea46-4dbd-a0ca-165aa3101979":{"bearer":{"type":"http","scheme":"bearer","description":"API key for authentication using Bearer scheme","scopes":[],"schemeName":"bearer"}}},"servers":{"fefe9da2-a252-4644-8424-0eaff357a7a8":{"url":"https://api.instaview.sk","description":"Production API Gateway"}},"schemas":{"1c317405-133d-44b5-8795-2ec01022a596":{"oneOf":[{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","prompt"],"properties":{"type":{"type":"string","enum":["sequential"],"isRequired":true},"prompt":{"type":"string","description":"What the agent should cover here. Supports `{{contact.*}}` variables.","example":"Introduce yourself and explain why you are calling.","isRequired":true},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget"}}},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","questions"],"properties":{"type":{"type":"string","enum":["looping"],"isRequired":true},"questions":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"The question to ask. Supports `{{contact.*}}` variables.","example":"What are you using today?","isRequired":true},"idealAnswer":{"type":"string","description":"What a good answer looks like, used when scoring the call. Optional, and it is the scoring switch: a question without one is still asked but never scored, which is how you write a question set that has no right answers (an internal survey, a satisfaction check).","example":"Names a competing tool"},"weight":{"type":"number","description":"Relative importance of this question when scoring. Setting it also opts the question into the match score (as `PREFERRED` unless `importance` says otherwise).","minimum":0,"example":40,"maximum":100},"importance":{"type":"string","description":"Opts this question into the agent's match score. Set `importance` (or `weight`) to score it; a question with neither is asked but not scored. `REQUIRED` gates the score, `PREFERRED` contributes by weight.","enum":["REQUIRED","PREFERRED"],"example":"PREFERRED"}},"description":"A question the agent asks, optionally with the answer it is measured against. `importance` and `weight` are how a question joins the match score — they live here rather than in `analyticsConfig` because a question is addressed by an id InstaView assigns, which a caller cannot know when writing the flow."},"isRequired":true},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget"}}},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","branches"],"properties":{"type":{"type":"string","enum":["conditional"],"isRequired":true},"branches":{"type":"array","description":"Between 2 and 5 routes, evaluated in order.","minItems":2,"maxItems":5,"items":{"type":"object","description":"One route out of a `conditional`. Every entry in `branches` must be an object; anything else (a `null` left by a client that built the array by index, say) is rejected with `422` (`CONDITIONAL_BRANCH_NOT_AN_OBJECT`).","required":["label","condition","blocks"],"properties":{"label":{"type":"string","description":"What this route is — unique within the block, and how `defaultBranch` addresses it.","example":"Interested","isRequired":true},"condition":{"oneOf":[{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","description"],"properties":{"type":{"type":"string","enum":["intent"],"isRequired":true},"description":{"type":"string","description":"The intent to match. Must be non-empty: it is the whole instruction the agent reads this route off, so a blank one is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`) rather than stored as a route nothing selects. Whitespace does not count as content, which is what the pattern says and what the validator checks.","minLength":1,"pattern":"\\S","example":"wants to see a demo","isRequired":true}},"isRequired":true},{"type":"object","description":"How the route is chosen.\n\nRequired on every branch, and it must match one of the two shapes below — it is what the agent routes on. A missing or non-object condition is rejected with `422` (`CONDITIONAL_CONDITION_MISSING`), a `type` that is neither `intent` nor `expression` with `CONDITIONAL_CONDITION_TYPE_UNKNOWN`, and a condition of a known type missing the fields that type needs with `CONDITIONAL_CONDITION_INVALID`. Each carries the `path` of the offending branch, e.g. `sections[0].branches[1].condition`.\n\nThe branch nominated by `defaultBranch` is checked like any other. Its condition is not read while it is the fallthrough, but moving `defaultBranch` to a different branch later would put it back in charge of a route.","required":["type","field","operator"],"properties":{"type":{"type":"string","enum":["expression"],"isRequired":true},"field":{"type":"string","description":"Name of the extracted field to test. Must be non-empty, whitespace excluded (`CONDITIONAL_CONDITION_INVALID`).","minLength":1,"pattern":"\\S","example":"budget","isRequired":true},"operator":{"type":"string","enum":["EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","CONTAINS","EXISTS"],"isRequired":true},"value":{"description":"Value to compare against. Required for every operator except EXISTS, which ignores it — omitting it for any other operator is rejected with `422` (`CONDITIONAL_CONDITION_INVALID`), since there is then nothing to compare against. Use a number for GREATER_THAN and LESS_THAN, and a string for CONTAINS.","example":1000},"logicalOperator":{"type":"string","description":"Reserved. Nothing composes conditions yet — a branch takes exactly one — so this is accepted and ignored.","enum":["AND","OR"]}},"isRequired":true}],"isRequired":true},"blocks":{"type":"array","description":"The sections executed on this route. Conditionals may nest up to 3 levels deep.","maxItems":50,"items":{"$circularRef":"1c317405-133d-44b5-8795-2ec01022a596"},"isRequired":true}}},"isRequired":true},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder.","example":"Qualify budget"},"defaultBranch":{"type":"string","description":"Label of the branch to fall through to when no condition matches. Branch ids are assigned by InstaView, so the fallthrough route is addressed by label; a label that matches no branch is rejected with `400`. Returned on reads as well, so a flow read back can be sent again unchanged apart from the assigned ids.","example":"Not now"}}},{"type":"object","description":"One section of the conversation. `type` selects the shape.","required":["type","phoneNumber"],"properties":{"type":{"type":"string","enum":["human_handoff"],"isRequired":true},"phoneNumber":{"type":"string","description":"Where to transfer the call, in E.164 format — a leading `+`, country code, no spaces or dashes. A number that is not E.164 is rejected with `422` (`HUMAN_HANDOFF_INVALID_NUMBER`) when the agent is created, not when the transfer is attempted.","example":"+421900123456","isRequired":true},"label":{"type":"string","description":"Optional name for this block, shown in the visual builder. Also names the destination for the agent, so a label saying who answers the number is worth setting.","example":"Sales"},"message":{"type":"string","description":"The line the caller hears as the call is transferred to this number. Optional — omitted, InstaView supplies a neutral line in the call's language, which promises nothing about who answers because the block does not know. **Keep it true on every transfer to this number:** a caller who asks for a person before the flow reaches this step can be transferred here and hear it too, so describe the transfer, not what came before it. Anything true only at this point of the flow belongs in the step before the handoff, which the agent says in a turn of its own and then transfers once the caller has responded. Blocks that share a `phoneNumber` share one line, taken from the first block that names the number (top to bottom): a later block's `message` is never heard, and if the first block has none the neutral line is used. Supports `{{contact.*}}` and `{{system.*}}` variables; a line that resolves to nothing on a call (only variables, none with a value) falls back to the neutral line rather than a silent transfer. An empty string is rejected (`HUMAN_HANDOFF_MESSAGE_EMPTY`) rather than read as absent, so clearing the field cannot silently restore the default.","example":"I'll put you through to Martin on our sales team now, one moment."}}}]}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"API key for authentication using Bearer scheme","scopes":[],"schemeName":"bearer"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"API key for authentication using Bearer scheme","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearer","name":"Authorization"}],"title":"bearer"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"instaview","siteName":"InstaView API","title":"Create Conversation - InstaView API","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-08-29T15:43:22.767Z","originalFileLocation":"api-reference/conversations/create-conversation.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Creates a conversation with a contact, using an existing or inline contact/agent/job, scoped to the API key\u0026#x27;s company. Respects company billing limits and subscription plans. Set isTest=true to create a test conversation that completes immediately without consuming billing minutes.\">\u003cmeta data-mint-head name=\"application-name\" content=\"InstaView API\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/instaview/FzS1-dDCztzdlzmX/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/instaview/FzS1-dDCztzdlzmX/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/instaview/FzS1-dDCztzdlzmX/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/instaview/FzS1-dDCztzdlzmX/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/instaview/FzS1-dDCztzdlzmX/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/instaview/FzS1-dDCztzdlzmX/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/instaview/FzS1-dDCztzdlzmX/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/instaview/FzS1-dDCztzdlzmX/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/instaview/FzS1-dDCztzdlzmX/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Create Conversation - InstaView API\">\u003cmeta data-mint-head property=\"og:description\" content=\"Creates a conversation with a contact, using an existing or inline contact/agent/job, scoped to the API key\u0026#x27;s company. Respects company billing limits and subscription plans. Set isTest=true to create a test conversation that completes immediately without consuming billing minutes.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"InstaView API\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.instaview.sk/api-reference/conversations/create-conversation\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://instaview.mintlify.app/_mintlify/api/og/v2?division=Conversations\u0026amp;title=Create+Conversation\u0026amp;description=Creates+a+conversation+with+a+contact%2C+using+an+existing+or+inline+contact%2Fagent%2Fjob%2C+scoped+to+the+API+key%27s+company.+Respects+company+billing+limits+and+subsc\u0026amp;theme=1444b1b95306a409923bc3c0\u0026amp;signature=ec6521e07436383e861d861672b624264c5c8170bf3ab13587f4953672488fb1\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Create Conversation - InstaView API\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Creates a conversation with a contact, using an existing or inline contact/agent/job, scoped to the API key\u0026#x27;s company. Respects company billing limits and subscription plans. Set isTest=true to create a test conversation that completes immediately without consuming billing minutes.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://instaview.mintlify.app/_mintlify/api/og/v2?division=Conversations\u0026amp;title=Create+Conversation\u0026amp;description=Creates+a+conversation+with+a+contact%2C+using+an+existing+or+inline+contact%2Fagent%2Fjob%2C+scoped+to+the+API+key%27s+company.+Respects+company+billing+limits+and+subsc\u0026amp;theme=1444b1b95306a409923bc3c0\u0026amp;signature=ec6521e07436383e861d861672b624264c5c8170bf3ab13587f4953672488fb1\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/instaview/FzS1-dDCztzdlzmX/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"InstaView API\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#2741F9\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.instaview.sk/api-reference/conversations/create-conversation\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/conversations/create-conversation.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.instaview.sk/#organization\",\"name\":\"InstaView API\",\"url\":\"https://docs.instaview.sk\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/instaview/srYC_WLR3UAwt0PY/logo/light.svg?fit=max\u0026auto=format\u0026n=srYC_WLR3UAwt0PY\u0026q=85\u0026s=a941bc948e20b3503a55e49b4438bfd8\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.instaview.sk#website\",\"name\":\"InstaView API\",\"url\":\"https://docs.instaview.sk\",\"publisher\":{\"@id\":\"https://docs.instaview.sk/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.instaview.sk/api-reference/conversations/create-conversation#webpage\",\"url\":\"https://docs.instaview.sk/api-reference/conversations/create-conversation\",\"name\":\"Create Conversation\",\"description\":\"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.\",\"dateModified\":\"2026-08-29T15:43:22.767Z\",\"isPartOf\":{\"@id\":\"https://docs.instaview.sk#website\"},\"breadcrumb\":{\"@id\":\"https://docs.instaview.sk/api-reference/conversations/create-conversation#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.instaview.sk/api-reference/conversations/create-conversation#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Conversations\",\"item\":\"https://docs.instaview.sk/api-reference/conversations/list-conversations\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Create Conversation\",\"item\":\"https://docs.instaview.sk/api-reference/conversations/create-conversation\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.instaview.sk/api-reference/conversations/create-conversation#apireference\",\"headline\":\"Create Conversation\",\"name\":\"Create Conversation\",\"description\":\"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.\",\"url\":\"https://docs.instaview.sk/api-reference/conversations/create-conversation\",\"mainEntityOfPage\":{\"@id\":\"https://docs.instaview.sk/api-reference/conversations/create-conversation#webpage\"},\"dateModified\":\"2026-08-29T15:43:22.767Z\",\"publisher\":{\"@id\":\"https://docs.instaview.sk/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.instaview.sk#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"InstaView API\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"InstaView API","nav":{"global":null,"tabs":[{"tab":"Documentation","icon":"book","pages":[{"title":"Documentation","href":"/introduction"}]},{"tab":"API Reference","icon":"code","groups":[{"group":"Overview","pages":[{"title":"API Reference","href":"/api-reference/introduction"}]},{"group":"Agents","pages":[{"title":"List Agents","openapi":"GET /agents","href":"/api-reference/agents/list-agents"},{"title":"Design an Agent","openapi":"POST /agents/composer","href":"/api-reference/agents/compose-agent"},{"title":"Refine a Composed Agent","openapi":"POST /agents/composer/{sessionId}/messages","href":"/api-reference/agents/refine-agent"},{"title":"Poll a Composer Session","openapi":"GET /agents/composer/{sessionId}","href":"/api-reference/agents/get-composer-session"},{"title":"Create Agent","openapi":"POST /agents","href":"/api-reference/agents/create-agent"},{"title":"Get Agent","openapi":"GET /agents/{id}","href":"/api-reference/agents/get-agent"},{"title":"Update Agent","openapi":"PATCH /agents/{id}","href":"/api-reference/agents/update-agent"},{"title":"Delete Agent","openapi":"DELETE /agents/{id}","href":"/api-reference/agents/delete-agent"}]},{"group":"Agent Knowledge Base","pages":[{"title":"List Knowledge Documents","openapi":"GET /agents/{id}/knowledge","href":"/api-reference/agents/knowledge/list-knowledge"},{"title":"Start Knowledge Upload","openapi":"POST /agents/{id}/knowledge","href":"/api-reference/agents/knowledge/start-upload"},{"title":"Complete Knowledge Upload","openapi":"POST /agents/{id}/knowledge/{documentId}/complete","href":"/api-reference/agents/knowledge/complete-upload"},{"title":"Update Knowledge Document","openapi":"PATCH /agents/{id}/knowledge/{documentId}","href":"/api-reference/agents/knowledge/update-knowledge"},{"title":"Delete Knowledge Document","openapi":"DELETE /agents/{id}/knowledge/{documentId}","href":"/api-reference/agents/knowledge/delete-knowledge"}]},{"group":"Jobs","pages":[{"title":"List Jobs","openapi":"GET /jobs","href":"/api-reference/jobs/list-jobs"},{"title":"Create Job","openapi":"POST /jobs","href":"/api-reference/jobs/create-job"},{"title":"Create Job from URL","openapi":"POST /jobs/url","href":"/api-reference/jobs/create-job-from-url"},{"title":"Get Job","openapi":"GET /jobs/{id}","href":"/api-reference/jobs/get-job"},{"title":"Update Job","openapi":"PATCH /jobs/{id}","href":"/api-reference/jobs/update-job"},{"title":"Delete Job","openapi":"DELETE /jobs/{id}","href":"/api-reference/jobs/delete-job"}]},{"group":"Contacts","pages":[{"title":"List Contacts","openapi":"GET /contacts","href":"/api-reference/contacts/list-contacts"},{"title":"Create Contact","openapi":"POST /contacts","href":"/api-reference/contacts/create-contact"},{"title":"Get Contact","openapi":"GET /contacts/{id}","href":"/api-reference/contacts/get-contact"},{"title":"Update Contact","openapi":"PATCH /contacts/{id}","href":"/api-reference/contacts/update-contact"},{"title":"Delete Contact","openapi":"DELETE /contacts/{id}","href":"/api-reference/contacts/delete-contact"}]},{"group":"Contact Documents","pages":[{"title":"List Contact Documents","openapi":"GET /contacts/{id}/documents","href":"/api-reference/contacts/documents/list-documents"},{"title":"Start Contact Document Upload","openapi":"POST /contacts/{id}/documents/uploads","href":"/api-reference/contacts/documents/start-upload"},{"title":"Complete Contact Document Upload","openapi":"POST /contacts/{id}/documents/{documentId}/complete","href":"/api-reference/contacts/documents/complete-upload"},{"title":"Update Contact Document","openapi":"PATCH /contacts/{id}/documents/{documentId}","href":"/api-reference/contacts/documents/update-document"},{"title":"Delete Contact Document","openapi":"DELETE /contacts/{id}/documents/{documentId}","href":"/api-reference/contacts/documents/delete-document"}]},{"group":"Contact Fields","pages":[{"title":"List Contact Fields","openapi":"GET /contact-fields","href":"/api-reference/contact-fields/list-contact-fields"},{"title":"Create Contact Field","openapi":"POST /contact-fields","href":"/api-reference/contact-fields/create-contact-field"},{"title":"Update Contact Field","openapi":"PATCH /contact-fields/{id}","href":"/api-reference/contact-fields/update-contact-field"},{"title":"Delete Contact Field","openapi":"DELETE /contact-fields/{id}","href":"/api-reference/contact-fields/delete-contact-field"}]},{"group":"Companies","pages":[{"title":"List Companies","openapi":"GET /company","href":"/api-reference/companies/list-companies"},{"title":"Create Company","openapi":"POST /company","href":"/api-reference/companies/create-company"},{"title":"Get Company","openapi":"GET /company/{id}","href":"/api-reference/companies/get-company"},{"title":"Update Company","openapi":"PATCH /company/{id}","href":"/api-reference/companies/update-company"},{"title":"Delete Company","openapi":"DELETE /company/{id}","href":"/api-reference/companies/delete-company"}]},{"group":"Conversations","pages":[{"title":"List Conversations","openapi":"GET /conversations","description":"Lists conversations within the API key's company. Every filter is optional: pass `contactId` to narrow the page to one contact (`candidateId` is accepted as its legacy alias), and omit it to list all of them.","href":"/api-reference/conversations/list-conversations"},{"title":"Create Conversation","openapi":"POST /conversations","href":"/api-reference/conversations/create-conversation"},{"title":"Get Conversation","openapi":"GET /conversations/{id}","description":"Returns a single conversation, ensuring it belongs to the API key's company.","href":"/api-reference/conversations/get-conversation"},{"title":"Get Conversation Analysis PDF","openapi":"GET /conversations/{id}/analysis-pdf","href":"/api-reference/conversations/get-conversation-analysis-pdf"},{"title":"Invoke New Call Attempt","openapi":"POST /conversations/{id}/call-attempts","href":"/api-reference/conversations/invoke-call-attempt"},{"title":"Reschedule Call Attempt","openapi":"PATCH /conversations/{id}/call-attempts/{attemptId}","href":"/api-reference/conversations/reschedule-call-attempt"},{"title":"Delete Call Attempt","openapi":"DELETE /conversations/{id}/call-attempts/{attemptId}","href":"/api-reference/conversations/delete-call-attempt"},{"title":"Delete Conversation","openapi":"DELETE /conversations/{id}","href":"/api-reference/conversations/delete-conversation"}]},{"group":"Runs","pages":[{"title":"Create Run","openapi":"POST /runs","href":"/api-reference/runs/create-run"},{"title":"Get Run","openapi":"GET /runs/{id}","href":"/api-reference/runs/get-run"},{"title":"List Run Conversations","openapi":"GET /runs/{id}/conversations","href":"/api-reference/runs/list-run-conversations"},{"title":"Attach Contacts","openapi":"POST /runs/{id}/contacts","href":"/api-reference/runs/attach-run-contacts"},{"title":"Detach Contact","openapi":"DELETE /runs/{id}/contacts/{contactId}","href":"/api-reference/runs/detach-run-contact"},{"title":"Launch Run","openapi":"POST /runs/{id}/launch","href":"/api-reference/runs/launch-run"},{"title":"Pause Run","openapi":"POST /runs/{id}/pause","href":"/api-reference/runs/pause-run"},{"title":"Resume Run","openapi":"POST /runs/{id}/resume","href":"/api-reference/runs/resume-run"},{"title":"Cancel Run","openapi":"POST /runs/{id}/cancel","href":"/api-reference/runs/cancel-run"},{"title":"Delete Run","openapi":"DELETE /runs/{id}","href":"/api-reference/runs/delete-run"}]},{"group":"Billing","pages":[{"title":"Get Usage Statistics","openapi":"GET /billing/usage","href":"/api-reference/billing/get-usage"}]},{"group":"Voice","pages":[{"title":"Generate Audio","openapi":"POST /voice","href":"/api-reference/voice/generate-audio"}]},{"group":"Webhooks","pages":[{"title":"List Webhooks","api":"GET /webhooks","href":"/api-reference/webhooks/list-webhooks"},{"title":"Create Webhook","api":"POST /webhooks","href":"/api-reference/webhooks/create-webhook"},{"title":"Get Webhook","api":"GET /webhooks/{id}","href":"/api-reference/webhooks/get-webhook"},{"title":"Update Webhook","api":"PATCH /webhooks/{id}","href":"/api-reference/webhooks/update-webhook"},{"title":"Delete Webhook","api":"DELETE /webhooks/{id}","href":"/api-reference/webhooks/delete-webhook"},{"title":"Test Webhook","api":"POST /webhooks/{id}/test","href":"/api-reference/webhooks/test-webhook"},{"title":"Reset Circuit Breaker","api":"POST /webhooks/{id}/reset-circuit","href":"/api-reference/webhooks/reset-circuit"}]},{"group":"Sourcing","pages":[{"title":"Initiate Sourcing Run","openapi":"POST /sourcing","href":"/api-reference/sourcing/initiate-sourcing"},{"title":"Initiate Sourcing Preview Run","openapi":"POST /sourcing/preview","href":"/api-reference/sourcing/initiate-sourcing-preview"},{"title":"Get Sourcing Preview Results","openapi":"GET /sourcing/preview/{id}/results","href":"/api-reference/sourcing/get-sourcing-preview-results"},{"title":"Patch Sourcing Run","openapi":"PATCH /sourcing/{id}","href":"/api-reference/sourcing/patch-sourcing"},{"title":"Get Sourcing Results","openapi":"GET /sourcing/{id}/results","href":"/api-reference/sourcing/get-sourcing-results"},{"title":"Initiate Enrichment Run","openapi":"POST /sourcing/enrich","href":"/api-reference/sourcing/initiate-enrichment"},{"title":"Get Enrichment Results","openapi":"GET /sourcing/enrich/{id}/results","href":"/api-reference/sourcing/get-enrich-results"},{"title":"Render HTML Candidate Cards","openapi":"POST /sourcing/render-html","href":"/api-reference/sourcing/render-html"}]},{"group":"Phone Numbers","pages":[{"title":"List Phone Numbers","openapi":"GET /phone-numbers","href":"/api-reference/phone-numbers/list-phone-numbers"}]}]},{"tab":"Changelog","icon":"clock","pages":[{"title":"Changelog","href":"/changelog/introduction"}]}]},"title":"Create Conversation - InstaView API","buildId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","deploymentId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-Bbp7I60D.js","utils-C3RIvJha.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DqD-vLt8.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B31Loprg.js","snippetPresets-DKpk-b8t.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-Cj65AhOR.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BXtn5gcC.js","shallow-RY2b03Cp.js","getApiPlaygroundDisplay-B0jeiPk3.js","CodeSnippet-CYgBjjwn.js","CodeSnippets-DOngDrYB.js","Page-n7I5XbKb.js","getPastedJson-DRQbJx-T.js","icon-CQiQCicY.js","MethodPill-BKTLdNtu.js","DuplicateIcon-B9jpAdat.js","createIcon-DCddRrXv.js","DynamicMarkdown-a8hUKrw6.js","SectionHeading-eECVV2eH.js","axios-vUo_bRtp.js","Markdown--GF7ZIpf.js","clsx-DZLdJUrt.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-2LoAhjKH.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Zwc0ZncM.js"]}