Overview
Batch-modify multiple interviews in a single API call. Useful for applying consistent settings across interviews, updating keywords in bulk, or cloning configuration from a template.
Endpoint: PATCH /qsi/gather/interviews/bulk-update
Mode Behavior
The mode parameter controls how supplied values interact with existing data.
Supplied values completely replace existing values. For example, if an interview has keywords ["java", "python"] and you send keywords: ["go"], the interview will only have ["go"] after the update.
Supplied values are added to existing values. Using the same example, if an interview has keywords ["java", "python"] and you send keywords: ["go"], the interview will have ["java", "python", "go"] after the update. Use the removed* fields (removedKeywords, removedQuestionIds, removedSurveyQuestionIds, removedAITextQuestionIds) to selectively remove specific items without replacing the entire list.
Parameters
Notifications and Scoring
Response
{
"data" : {
"success" : true ,
"updatedCount" : 3 ,
"errors" : [],
"templateInterviewId" : null
}
}
Examples
1. Update Title and Display Name (Overwrite)
Set the same title and display name across multiple interviews.
curl -X PATCH https://api.prod.qualifi.hr/qsi/gather/interviews/bulk-update \
-H "x-api-key: ${ API_KEY }" \
-H "Content-Type: application/json" \
-d '{
"interviewIds": ["int-uuid-1", "int-uuid-2", "int-uuid-3"],
"mode": "overwrite",
"title": "Senior Engineer Interview",
"displayName": "Senior Engineer Phone Screen"
}'
const response = await fetch (
'https://api.prod.qualifi.hr/qsi/gather/interviews/bulk-update' ,
{
method: 'PATCH' ,
headers: {
'x-api-key' : apiKey ,
'Content-Type' : 'application/json'
},
body: JSON . stringify ({
interviewIds: [ 'int-uuid-1' , 'int-uuid-2' , 'int-uuid-3' ],
mode: 'overwrite' ,
title: 'Senior Engineer Interview' ,
displayName: 'Senior Engineer Phone Screen'
})
}
);
const result = await response . json ();
response = requests.patch(
'https://api.prod.qualifi.hr/qsi/gather/interviews/bulk-update' ,
headers = {
'x-api-key' : api_key,
'Content-Type' : 'application/json'
},
json = {
'interviewIds' : [ 'int-uuid-1' , 'int-uuid-2' , 'int-uuid-3' ],
'mode' : 'overwrite' ,
'title' : 'Senior Engineer Interview' ,
'displayName' : 'Senior Engineer Phone Screen'
}
)
result = response.json()
2. Add Keywords to Existing Interviews (Merge)
Add new keywords without removing existing ones.
{
"interviewIds" : [ "int-uuid-1" , "int-uuid-2" ],
"mode" : "merge" ,
"keywords" : [ "remote" , "senior" , "full-stack" ]
}
3. Replace All Keywords (Overwrite)
Completely replace the keywords on multiple interviews.
{
"interviewIds" : [ "int-uuid-1" , "int-uuid-2" ],
"mode" : "overwrite" ,
"keywords" : [ "go" , "kubernetes" , "microservices" ]
}
4. Remove Specific Keywords (Merge)
Remove specific keywords while keeping all others intact.
{
"interviewIds" : [ "int-uuid-1" , "int-uuid-2" , "int-uuid-3" ],
"mode" : "merge" ,
"removedKeywords" : [ "outdated-skill" , "deprecated-tech" ]
}
5. Clone from Template Interview (Overwrite)
Apply a template interview’s configuration to multiple interviews.
curl -X PATCH https://api.prod.qualifi.hr/qsi/gather/interviews/bulk-update \
-H "x-api-key: ${ API_KEY }" \
-H "Content-Type: application/json" \
-d '{
"interviewIds": ["int-uuid-1", "int-uuid-2", "int-uuid-3"],
"mode": "overwrite",
"templateInterviewId": "template-int-uuid"
}'
const response = await fetch (
'https://api.prod.qualifi.hr/qsi/gather/interviews/bulk-update' ,
{
method: 'PATCH' ,
headers: {
'x-api-key' : apiKey ,
'Content-Type' : 'application/json'
},
body: JSON . stringify ({
interviewIds: [ 'int-uuid-1' , 'int-uuid-2' , 'int-uuid-3' ],
mode: 'overwrite' ,
templateInterviewId: 'template-int-uuid'
})
}
);
const result = await response . json ();
response = requests.patch(
'https://api.prod.qualifi.hr/qsi/gather/interviews/bulk-update' ,
headers = {
'x-api-key' : api_key,
'Content-Type' : 'application/json'
},
json = {
'interviewIds' : [ 'int-uuid-1' , 'int-uuid-2' , 'int-uuid-3' ],
'mode' : 'overwrite' ,
'templateInterviewId' : 'template-int-uuid'
}
)
result = response.json()
6. Add Survey Questions with Knockout (Merge)
Add survey questions to existing interviews, including knockout configuration.
{
"interviewIds" : [ "int-uuid-1" , "int-uuid-2" ],
"mode" : "merge" ,
"surveyQuestions" : [
{ "id" : "sq-uuid-1" , "knockout" : false },
{ "id" : "sq-uuid-2" , "knockout" : true }
]
}
7. Remove Specific Questions (Merge)
Remove specific questions from interviews while preserving all others.
{
"interviewIds" : [ "int-uuid-1" , "int-uuid-2" ],
"mode" : "merge" ,
"removedQuestionIds" : [ "q-uuid-old-1" , "q-uuid-old-2" ],
"removedSurveyQuestionIds" : [ "sq-uuid-old-1" ],
"removedAITextQuestionIds" : [ "aitq-uuid-old-1" ]
}
8. Set Score Card Topics (Overwrite)
Apply a standardized score card across multiple interviews.
curl -X PATCH https://api.prod.qualifi.hr/qsi/gather/interviews/bulk-update \
-H "x-api-key: ${ API_KEY }" \
-H "Content-Type: application/json" \
-d '{
"interviewIds": ["int-uuid-1", "int-uuid-2"],
"mode": "overwrite",
"scoreCardTopics": [
{
"topic": "Technical Skills",
"weight": 40,
"description": "Evaluate depth of technical knowledge",
"lookingFor": "Strong understanding of core concepts and practical experience",
"scoreDescriptions": {
"1": "No relevant technical knowledge",
"2": "Basic understanding but limited experience",
"3": "Solid knowledge with some practical experience",
"4": "Strong expertise with extensive experience",
"5": "Expert-level mastery with deep practical experience"
}
},
{
"topic": "Communication",
"weight": 30,
"description": "Evaluate clarity and effectiveness of communication",
"lookingFor": "Clear, concise, and structured responses",
"scoreDescriptions": {
"1": "Unable to communicate ideas clearly",
"2": "Somewhat clear but disorganized",
"3": "Clear and reasonably well-structured",
"4": "Very clear, well-structured, and engaging",
"5": "Exceptionally clear, persuasive, and articulate"
}
},
{
"topic": "Problem Solving",
"weight": 30,
"description": "Evaluate approach to solving problems",
"lookingFor": "Structured thinking and creative solutions",
"scoreDescriptions": {
"1": "No evidence of structured problem solving",
"2": "Some structure but limited creativity",
"3": "Good structured approach with reasonable solutions",
"4": "Strong analytical thinking with creative solutions",
"5": "Exceptional problem-solving with innovative approaches"
}
}
]
}'
const response = await fetch (
'https://api.prod.qualifi.hr/qsi/gather/interviews/bulk-update' ,
{
method: 'PATCH' ,
headers: {
'x-api-key' : apiKey ,
'Content-Type' : 'application/json'
},
body: JSON . stringify ({
interviewIds: [ 'int-uuid-1' , 'int-uuid-2' ],
mode: 'overwrite' ,
scoreCardTopics: [
{
topic: 'Technical Skills' ,
weight: 40 ,
description: 'Evaluate depth of technical knowledge' ,
lookingFor: 'Strong understanding of core concepts and practical experience' ,
scoreDescriptions: {
'1' : 'No relevant technical knowledge' ,
'2' : 'Basic understanding but limited experience' ,
'3' : 'Solid knowledge with some practical experience' ,
'4' : 'Strong expertise with extensive experience' ,
'5' : 'Expert-level mastery with deep practical experience'
}
},
{
topic: 'Communication' ,
weight: 30 ,
description: 'Evaluate clarity and effectiveness of communication' ,
lookingFor: 'Clear, concise, and structured responses' ,
scoreDescriptions: {
'1' : 'Unable to communicate ideas clearly' ,
'2' : 'Somewhat clear but disorganized' ,
'3' : 'Clear and reasonably well-structured' ,
'4' : 'Very clear, well-structured, and engaging' ,
'5' : 'Exceptionally clear, persuasive, and articulate'
}
},
{
topic: 'Problem Solving' ,
weight: 30 ,
description: 'Evaluate approach to solving problems' ,
lookingFor: 'Structured thinking and creative solutions' ,
scoreDescriptions: {
'1' : 'No evidence of structured problem solving' ,
'2' : 'Some structure but limited creativity' ,
'3' : 'Good structured approach with reasonable solutions' ,
'4' : 'Strong analytical thinking with creative solutions' ,
'5' : 'Exceptional problem-solving with innovative approaches'
}
}
]
})
}
);
const result = await response . json ();
response = requests.patch(
'https://api.prod.qualifi.hr/qsi/gather/interviews/bulk-update' ,
headers = {
'x-api-key' : api_key,
'Content-Type' : 'application/json'
},
json = {
'interviewIds' : [ 'int-uuid-1' , 'int-uuid-2' ],
'mode' : 'overwrite' ,
'scoreCardTopics' : [
{
'topic' : 'Technical Skills' ,
'weight' : 40 ,
'description' : 'Evaluate depth of technical knowledge' ,
'lookingFor' : 'Strong understanding of core concepts and practical experience' ,
'scoreDescriptions' : {
'1' : 'No relevant technical knowledge' ,
'2' : 'Basic understanding but limited experience' ,
'3' : 'Solid knowledge with some practical experience' ,
'4' : 'Strong expertise with extensive experience' ,
'5' : 'Expert-level mastery with deep practical experience'
}
},
{
'topic' : 'Communication' ,
'weight' : 30 ,
'description' : 'Evaluate clarity and effectiveness of communication' ,
'lookingFor' : 'Clear, concise, and structured responses' ,
'scoreDescriptions' : {
'1' : 'Unable to communicate ideas clearly' ,
'2' : 'Somewhat clear but disorganized' ,
'3' : 'Clear and reasonably well-structured' ,
'4' : 'Very clear, well-structured, and engaging' ,
'5' : 'Exceptionally clear, persuasive, and articulate'
}
},
{
'topic' : 'Problem Solving' ,
'weight' : 30 ,
'description' : 'Evaluate approach to solving problems' ,
'lookingFor' : 'Structured thinking and creative solutions' ,
'scoreDescriptions' : {
'1' : 'No evidence of structured problem solving' ,
'2' : 'Some structure but limited creativity' ,
'3' : 'Good structured approach with reasonable solutions' ,
'4' : 'Strong analytical thinking with creative solutions' ,
'5' : 'Exceptional problem-solving with innovative approaches'
}
}
]
}
)
result = response.json()
9. Update Interview Settings (Overwrite)
Set language, web-only, and resume settings across interviews.
{
"interviewIds" : [ "int-uuid-1" , "int-uuid-2" , "int-uuid-3" ],
"mode" : "overwrite" ,
"language" : "es" ,
"webOnly" : true ,
"resume" : true
}
10. Set Notification Subscribers and Message Group (Overwrite)
Assign notification subscribers and a message group to multiple interviews.
{
"interviewIds" : [ "int-uuid-1" , "int-uuid-2" ],
"mode" : "overwrite" ,
"notificationSubscribers" : [ "user-uuid-1" , "user-uuid-2" , "user-uuid-3" ],
"messageGroupId" : "msg-group-uuid"
}
11. Combined Merge (Questions + Keywords + Subscribers)
A realistic example that adds questions, keywords, and notification subscribers in a single merge operation.
curl -X PATCH https://api.prod.qualifi.hr/qsi/gather/interviews/bulk-update \
-H "x-api-key: ${ API_KEY }" \
-H "Content-Type: application/json" \
-d '{
"interviewIds": ["int-uuid-1", "int-uuid-2", "int-uuid-3"],
"mode": "merge",
"audioQuestionAndMessageIds": ["q-uuid-new-1", "q-uuid-new-2"],
"surveyQuestions": [
{ "id": "sq-uuid-new-1", "knockout": false },
{ "id": "sq-uuid-new-2", "knockout": true }
],
"keywords": ["leadership", "management", "strategy"],
"removedKeywords": ["entry-level"],
"notificationSubscribers": ["user-uuid-hiring-mgr"]
}'
const response = await fetch (
'https://api.prod.qualifi.hr/qsi/gather/interviews/bulk-update' ,
{
method: 'PATCH' ,
headers: {
'x-api-key' : apiKey ,
'Content-Type' : 'application/json'
},
body: JSON . stringify ({
interviewIds: [ 'int-uuid-1' , 'int-uuid-2' , 'int-uuid-3' ],
mode: 'merge' ,
audioQuestionAndMessageIds: [ 'q-uuid-new-1' , 'q-uuid-new-2' ],
surveyQuestions: [
{ id: 'sq-uuid-new-1' , knockout: false },
{ id: 'sq-uuid-new-2' , knockout: true }
],
keywords: [ 'leadership' , 'management' , 'strategy' ],
removedKeywords: [ 'entry-level' ],
notificationSubscribers: [ 'user-uuid-hiring-mgr' ]
})
}
);
const result = await response . json ();
response = requests.patch(
'https://api.prod.qualifi.hr/qsi/gather/interviews/bulk-update' ,
headers = {
'x-api-key' : api_key,
'Content-Type' : 'application/json'
},
json = {
'interviewIds' : [ 'int-uuid-1' , 'int-uuid-2' , 'int-uuid-3' ],
'mode' : 'merge' ,
'audioQuestionAndMessageIds' : [ 'q-uuid-new-1' , 'q-uuid-new-2' ],
'surveyQuestions' : [
{ 'id' : 'sq-uuid-new-1' , 'knockout' : False },
{ 'id' : 'sq-uuid-new-2' , 'knockout' : True }
],
'keywords' : [ 'leadership' , 'management' , 'strategy' ],
'removedKeywords' : [ 'entry-level' ],
'notificationSubscribers' : [ 'user-uuid-hiring-mgr' ]
}
)
result = response.json()
Error Handling
Status Code Cause 400Missing interviewIds or empty array 400Missing or invalid mode (must be "overwrite" or "merge") 401Invalid or missing API key 500Internal server error
Partial failures are possible — some interviews may update successfully while others fail. Always check the errors array in the response.