Invite multiple candidates at once
curl --request POST \
--url https://api.interviewflowai.com/api/external/ingest/interview \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"interviewerId": "<string>",
"status": "<string>",
"skills": [
"<string>"
],
"data": [
{
"name": "<string>",
"email": "<string>",
"additionalFields": {},
"metadata": {
"sendEmailAfter": 123
}
}
]
}
'import requests
url = "https://api.interviewflowai.com/api/external/ingest/interview"
payload = {
"interviewerId": "<string>",
"status": "<string>",
"skills": ["<string>"],
"data": [
{
"name": "<string>",
"email": "<string>",
"additionalFields": {},
"metadata": { "sendEmailAfter": 123 }
}
]
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
interviewerId: '<string>',
status: '<string>',
skills: ['<string>'],
data: [
{
name: '<string>',
email: '<string>',
additionalFields: {},
metadata: {sendEmailAfter: 123}
}
]
})
};
fetch('https://api.interviewflowai.com/api/external/ingest/interview', 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.interviewflowai.com/api/external/ingest/interview",
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([
'interviewerId' => '<string>',
'status' => '<string>',
'skills' => [
'<string>'
],
'data' => [
[
'name' => '<string>',
'email' => '<string>',
'additionalFields' => [
],
'metadata' => [
'sendEmailAfter' => 123
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.interviewflowai.com/api/external/ingest/interview"
payload := strings.NewReader("{\n \"interviewerId\": \"<string>\",\n \"status\": \"<string>\",\n \"skills\": [\n \"<string>\"\n ],\n \"data\": [\n {\n \"name\": \"<string>\",\n \"email\": \"<string>\",\n \"additionalFields\": {},\n \"metadata\": {\n \"sendEmailAfter\": 123\n }\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.interviewflowai.com/api/external/ingest/interview")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"interviewerId\": \"<string>\",\n \"status\": \"<string>\",\n \"skills\": [\n \"<string>\"\n ],\n \"data\": [\n {\n \"name\": \"<string>\",\n \"email\": \"<string>\",\n \"additionalFields\": {},\n \"metadata\": {\n \"sendEmailAfter\": 123\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.interviewflowai.com/api/external/ingest/interview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"interviewerId\": \"<string>\",\n \"status\": \"<string>\",\n \"skills\": [\n \"<string>\"\n ],\n \"data\": [\n {\n \"name\": \"<string>\",\n \"email\": \"<string>\",\n \"additionalFields\": {},\n \"metadata\": {\n \"sendEmailAfter\": 123\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_bodyAPI Integration
Invite multiple candidates at once
Invite multiple candidates to an Interviewer in one API request.
POST
/
api
/
external
/
ingest
/
interview
Invite multiple candidates at once
curl --request POST \
--url https://api.interviewflowai.com/api/external/ingest/interview \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"interviewerId": "<string>",
"status": "<string>",
"skills": [
"<string>"
],
"data": [
{
"name": "<string>",
"email": "<string>",
"additionalFields": {},
"metadata": {
"sendEmailAfter": 123
}
}
]
}
'import requests
url = "https://api.interviewflowai.com/api/external/ingest/interview"
payload = {
"interviewerId": "<string>",
"status": "<string>",
"skills": ["<string>"],
"data": [
{
"name": "<string>",
"email": "<string>",
"additionalFields": {},
"metadata": { "sendEmailAfter": 123 }
}
]
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
interviewerId: '<string>',
status: '<string>',
skills: ['<string>'],
data: [
{
name: '<string>',
email: '<string>',
additionalFields: {},
metadata: {sendEmailAfter: 123}
}
]
})
};
fetch('https://api.interviewflowai.com/api/external/ingest/interview', 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.interviewflowai.com/api/external/ingest/interview",
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([
'interviewerId' => '<string>',
'status' => '<string>',
'skills' => [
'<string>'
],
'data' => [
[
'name' => '<string>',
'email' => '<string>',
'additionalFields' => [
],
'metadata' => [
'sendEmailAfter' => 123
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);
$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.interviewflowai.com/api/external/ingest/interview"
payload := strings.NewReader("{\n \"interviewerId\": \"<string>\",\n \"status\": \"<string>\",\n \"skills\": [\n \"<string>\"\n ],\n \"data\": [\n {\n \"name\": \"<string>\",\n \"email\": \"<string>\",\n \"additionalFields\": {},\n \"metadata\": {\n \"sendEmailAfter\": 123\n }\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-KEY", "<api-key>")
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.interviewflowai.com/api/external/ingest/interview")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"interviewerId\": \"<string>\",\n \"status\": \"<string>\",\n \"skills\": [\n \"<string>\"\n ],\n \"data\": [\n {\n \"name\": \"<string>\",\n \"email\": \"<string>\",\n \"additionalFields\": {},\n \"metadata\": {\n \"sendEmailAfter\": 123\n }\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.interviewflowai.com/api/external/ingest/interview")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"interviewerId\": \"<string>\",\n \"status\": \"<string>\",\n \"skills\": [\n \"<string>\"\n ],\n \"data\": [\n {\n \"name\": \"<string>\",\n \"email\": \"<string>\",\n \"additionalFields\": {},\n \"metadata\": {\n \"sendEmailAfter\": 123\n }\n }\n ]\n}"
response = http.request(request)
puts response.read_bodyUse this API to invite multiple candidates to a specific Interviewer at once.
Rate limit: 100 requests per minute per API key. Requests over the limit return
429 Too Many Requests.Payload structure
string
required
The unique ID of the Interviewer to ingest Candidates into.
string
shortlisted or draft. Controls the onboarding experience.string[]
Skills used to generate custom questions, such as
nodejs, aws, and mongodb.object[]
required
Candidates to invite.
string
required
Candidate’s full name.
string
required
Candidate’s email address.
object
Custom key-value fields to tag against the Candidate, such as scores or flags.
Status routing
| Status | Behavior |
|---|---|
shortlisted | Candidate bypasses the application form and is redirected straight to the interview lobby (requires Resume Screening and Screening Questions to be disabled). |
draft | Candidate must fill out the application form. Your team will then need to manually shortlist them from the dashboard. |
Default behavior (when status is omitted)
| Interviewer Visibility | Default Status |
|---|---|
| Public Interviewer | shortlisted |
| Private Interviewer | draft |
Example request
curl -X POST "https://api.interviewflowai.com/api/external/ingest/interview" \
-H "Content-Type: application/json" \
-H "X-API-KEY: your_api_key_here" \
-d '{
"status": "shortlisted",
"interviewerId": "304c0cfb-324f-4b2c-ac89-c93725c00399",
"data": [
{
"name": "John Doe",
"email": "john.doe@example.com",
"skills": ["nodejs", "aws", "mongodb"],
"additionalFields": {
"Manual Score": 72,
"isSynced": "true"
},
"metadata": {
"External ID": "candidate_12345",
"Phone": "+1-555-123-4567",
"sendEmailAfter": 1
}
}
]
}'
Best Practice: Trigger this API call automatically when a candidate reaches a specific stage in your ATS (e.g. “Phone Screen” or “AI Interview”).

