Skip to main content
POST
Create interview
Creates a new AI-powered interview session for a candidate. This endpoint supports both existing candidates/agents and inline resource creation, making it flexible for various integration scenarios.

Overview

The create interview endpoint allows you to schedule AI-powered interviews with candidates. You can use existing candidate and agent IDs, or create them on-the-fly using inline definitions. Interviews can be scheduled for a future time or started immediately.

Use Cases

  • Scheduled Interviews: Schedule interviews for a specific date and time
  • Immediate Interviews: Start interviews right away for quick screening
  • Inline Resources: Create interviews without pre-creating candidates or agents
  • Bulk Interview Scheduling: Automate interview scheduling for multiple candidates

Inline Candidate, Agent, and Job Support

You can create interviews with candidates, agents, and jobs that don’t exist yet by providing inline resource objects. This enables streamlined interview scheduling without pre-creating resources in your system.

Inline Candidate with Job Association

Inline Candidate with Inline Job

Create both the candidate and job inline for a completely self-contained interview creation:
Complete Inline Workflow: When using candidate with job: - A new Job entity is created in your company - A new Candidate entity is created and automatically associated with the new job
  • The Interview is linked to both the new candidate and job - All resources become permanent entities in your system - This is the most streamlined way to schedule interviews without any pre-existing resources

Inline Candidate without Job Association

Job Specification Options: You can specify the job in several ways: - Create inline: Use job at the DTO level to create a new job - Reference existing: Use jobId at the DTO level to link to an existing job - Within inline candidate: Use jobId inside candidate for a more compact syntax when creating both candidate and job association - No job: Omit all job fields to create a candidate in your talent pool without job association (can be assigned later via the update candidate endpoint) Priority: When multiple job sources are provided, job takes precedence over DTO-level jobId, which takes precedence over candidate.jobId. XOR Validation: You cannot combine candidate.jobId with DTO-level job fields (jobId or job) as this would be ambiguous. Choose one method per request.

Inline Custom Agent

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 interview 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 interview and on its analysis.completed webhook.
Inline creation mints a permanent agent per interview. 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.

Generic Focus and Jobless Interviews

Two focuses are job-optional — they can interview someone without associating the interview 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:
A job-optional focus ignores the candidate’s assignments entirely. You do not need to pick one with jobId, and a candidate assigned to five jobs is interviewed exactly like one assigned to none. The “specify a jobId” error described under Candidate 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 candidate.jobId for a custom agent is a 400 rather than a silently ignored field.
Generic focus agents are designed for interviews where candidates don’t need to be assigned to a specific job. This is useful for:
  • Talent Pool Building: Interviewing candidates for future opportunities without a specific role
  • General Outreach: Engaging with candidates in your database who aren’t currently assigned to jobs
  • Pre-screening: Conducting initial conversations before matching candidates to specific positions

Creating a Jobless Interview with GENERIC Focus

Validation: The API will return a 400 Bad Request error if:
  • You try to create a jobless interview (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 interview
Note that a GENERIC interview is not rejected for a candidate who has job assignments: the assignments are simply not used.For more details on Generic interview analysis structure, see the Interviews Resource Guide.

Existing Candidate with Inline Job

You can also define the job inline using job when you already have a candidate but don’t want to create a separate job resource first.
Inline Job Behavior: - When you provide job together with an existing candidateId, the API: - Creates a full Job entity in your company using the inline fields. - Automatically associates the candidate with the new job if they weren’t already linked. - Links the interview to this newly created job. - jobId and job are mutually exclusive (XOR): - Use either jobId (existing job) or job (inline job definition), but not both.

Billing and Limits

Creating interviews consumes interview minutes from your company’s billing plan. Ensure you have sufficient minutes available before scheduling bulk interviews. The API will return a 403 Forbidden error if billing limits are exceeded.Exception: Test interviews (created with isTest: true) do not consume billing minutes and bypass all billing checks.

Scheduling Options

Immediate Interview

Omit scheduleTime to start the interview immediately:

Scheduled Interview

Provide a future scheduleTime timestamp (max 30 days in the future):
Note: When using existing candidates, ensure they already exist in your system. For inline candidates, all required fields (firstName, lastName, email or phoneNumber, gdprExpiryDate) must be provided.

Job Selection for Existing Candidates

When using an existing candidateId, you can optionally specify a jobId to indicate which job the interview is for. This is especially important when a candidate is associated with multiple jobs.

Candidate with Single Job

If the candidate has only one job (or no jobs), the jobId field is optional. The system will automatically use the candidate’s first job if available:

Candidate with Multiple Jobs

When a candidate is associated with multiple jobs, you must specify the jobId to indicate which job the interview is for:
Multiple Job Assignments: If a candidate has multiple job assignments and you don’t provide jobId, the API will return a 400 Bad Request error with the message “Job ID must be provided when candidate has multiple job assignments”.This applies only to job-requiring focuses. GENERIC and custom (flow-based) agents are job-optional, so they interview a multi-job candidate 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 candidate is not already assigned to this job, they will be automatically assigned to it when the interview is created.
Job Selection Rules: - jobId and job are XOR (mutually exclusive): - If you provide jobId, you must omit job. - If you provide job, you must omit jobId. - When job is used: - A new job is created for your company. - That job is used as the interview’s jobId. - The candidate is associated with that job automatically before the interview is created.

Company Isolation

All resources (candidate, agent, job) must belong to the same company as your API key. The API automatically validates company ownership and returns 403 Forbidden if resources belong to different companies.

Complete Workflow Examples

Scenario 1: Interview with Job Association

Scenario 2: Interview without Job Association (Talent Pool)

Scenario 3: Interview for Candidate with Multiple Jobs

Scenario 4: Existing Candidate with Inline Job

The inline job is saved as a regular Job entity. You can later fetch and manage it via the Jobs API using the jobId returned in the interview object.

Test Mode

Test mode allows you to create test interviews that immediately complete without consuming billing minutes. This is useful for testing webhook handlers and integration flows.

When to Use Test Mode

  • Testing Webhook Handlers: Verify that your webhook endpoints correctly handle interview.completed and analysis.completed events
  • Integration Testing: Test your application’s interview processing logic without waiting for real interviews
  • Development: Develop and debug features that depend on completed interviews
  • Demo Purposes: Create sample interviews for demonstrations

How Test Mode Works

When you set isTest: true:
  1. Billing Bypass: All billing checks are skipped - no minutes are consumed
  2. Immediate Completion: The interview is created with COMPLETED status immediately
  3. Mock Analysis Data: Realistic screening analysis data is automatically generated and stored
  4. Webhook Events: Both interview.completed and analysis.completed webhook events are triggered
  5. Default Duration: Test interviews have a default duration of 5 minutes

Example: Creating a Test Interview

Test Interview Characteristics

  • Status: Always COMPLETED immediately
  • Duration: 5 minutes (300 seconds)
  • Analysis: Includes mock screening analysis with:
    • Conversation check results (candidateInterest: true, conversationCompleted: true)
    • Candidate analysis scores and recommendations
    • Mock transcript segments
  • Webhooks: Triggers both interview.completed and analysis.completed events
  • Billing: No minutes consumed, no billing checks performed
Test interviews are marked with isTest: true in their metadata. They appear in interview lists and can be queried like normal interviews, but they do not affect billing or production metrics.

Interviews Resource Guide

Learn about interview management and analysis

Agents Resource Guide

Configure AI interview agents

Candidates Resource Guide

Manage candidate profiles

Billing Guide

Understand interview costs and limits

Webhooks Guide

Learn about webhook events and testing

Authorizations

Authorization
string
header
required

API key for authentication using Bearer scheme

Query Parameters

companyId
string

Required for ATS API keys to specify which company to access. Ignored for standard company API keys.

Body

application/json
candidateId
string<uuid>
required

Existing candidate ID (XOR with candidate). Must exist and belong to the same company as the API key. Existence/company relationship is validated server-side.

Example:

"123e4567-e89b-12d3-a456-426614174000"

jobId
string<uuid>
required

Job ID to associate the interview with (XOR with job). Required when the candidate 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 candidate 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"

agentId
string<uuid>
required

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.

Example:

"987e6543-e21b-12d3-a456-426614174000"

scheduleTime
string<date-time>
required

Scheduled time in ISO 8601 format (max 30 days in future)

Example:

"2025-11-20T10:00:00Z"

job
object

Job for inline creation (XOR with jobId). When provided, a new job will be created and used for the interview. Cannot be combined with jobId. Rejected with 400 for custom agents (agents defined by a conversation flow), which are always jobless.

candidate
object

Candidate for inline creation (XOR with candidateId)

agent
object

Agent for inline creation (XOR with agentId)

metadata
object

Custom metadata for the interview (max 10KB, 5 levels deep, 50 keys)

Example:
isTest
boolean
default:false

If true, creates a test interview that immediately completes without consuming billing minutes. Triggers webhook events (interview.completed, analysis.completed) for testing webhook handlers.

Example:

false

Response

OK (legacy; prefer 201)

id
string<uuid>
required

Interview ID

Example:

"123e4567-e89b-12d3-a456-426614174000"

candidateId
string<uuid>
required

Candidate ID

Example:

"987e6543-e21b-12d3-a456-426614174000"

agentId
string<uuid>
required

Agent ID

Example:

"456e7890-e12b-34d5-a678-901234567890"

status
enum<string>
required

Interview status

Available options:
UNDEFINED,
SCHEDULED,
CANCELLED,
FAILED,
COMPLETED,
IN_PROGRESS,
UNREACHABLE
Example:

"SCHEDULED"

scheduledAt
string<date-time>
required

Scheduled time

Example:

"2025-11-20T10:00:00Z"

createdAt
string
required

Created timestamp

Example:

"2024-11-16T10:30:00Z"

updatedAt
string
required

Updated timestamp

Example:

"2024-11-16T10:30:00Z"

jobId
string<uuid> | null

Job ID associated with this interview, if any

Example:

"123e4567-e89b-12d3-a456-426614174000"

durationMinutes
number

Interview duration in minutes

Example:

15

finishedDate
string<date-time>

Finished date

Example:

"2025-11-20T10:15:00Z"

metadata
object

Custom metadata

Example:
callAttempts
object[]

Call attempt logs for this interview. Present for phone interviews, typically empty or undefined for online interviews.

analysis
object

Candidate analysis data. Present only if analysis has been generated.

analytics
object

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.

isTest
boolean

Whether this is a test interview. Test interviews are created with isTest=true, immediately complete without consuming billing minutes, and are excluded from billing/usage summaries. Use test interviews for testing webhook handlers and integration flows.

Example:

false