curl --request POST \
--url https://api.duvo.ai/v2/queues/{queue_id}/cases/bulk-update-status \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"case_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"all_matching": true,
"filters": {
"status": [],
"issue_severity": [],
"awaiting_my_approval": true,
"priority": [],
"created_at_from": "<string>",
"created_at_to": "<string>",
"updated_at_from": "<string>",
"updated_at_to": "<string>",
"labels": {},
"json_data": [
{
"path": "<string>",
"value": "<string>"
}
]
},
"search": "<string>"
}
'import requests
url = "https://api.duvo.ai/v2/queues/{queue_id}/cases/bulk-update-status"
payload = {
"case_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"all_matching": True,
"filters": {
"status": [],
"issue_severity": [],
"awaiting_my_approval": True,
"priority": [],
"created_at_from": "<string>",
"created_at_to": "<string>",
"updated_at_from": "<string>",
"updated_at_to": "<string>",
"labels": {},
"json_data": [
{
"path": "<string>",
"value": "<string>"
}
]
},
"search": "<string>"
}
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({
case_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
all_matching: true,
filters: {
status: [],
issue_severity: [],
awaiting_my_approval: true,
priority: [],
created_at_from: '<string>',
created_at_to: '<string>',
updated_at_from: '<string>',
updated_at_to: '<string>',
labels: {},
json_data: [{path: '<string>', value: '<string>'}]
},
search: '<string>'
})
};
fetch('https://api.duvo.ai/v2/queues/{queue_id}/cases/bulk-update-status', 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.duvo.ai/v2/queues/{queue_id}/cases/bulk-update-status",
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([
'case_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'all_matching' => true,
'filters' => [
'status' => [
],
'issue_severity' => [
],
'awaiting_my_approval' => true,
'priority' => [
],
'created_at_from' => '<string>',
'created_at_to' => '<string>',
'updated_at_from' => '<string>',
'updated_at_to' => '<string>',
'labels' => [
],
'json_data' => [
[
'path' => '<string>',
'value' => '<string>'
]
]
],
'search' => '<string>'
]),
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.duvo.ai/v2/queues/{queue_id}/cases/bulk-update-status"
payload := strings.NewReader("{\n \"case_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"all_matching\": true,\n \"filters\": {\n \"status\": [],\n \"issue_severity\": [],\n \"awaiting_my_approval\": true,\n \"priority\": [],\n \"created_at_from\": \"<string>\",\n \"created_at_to\": \"<string>\",\n \"updated_at_from\": \"<string>\",\n \"updated_at_to\": \"<string>\",\n \"labels\": {},\n \"json_data\": [\n {\n \"path\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n },\n \"search\": \"<string>\"\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.duvo.ai/v2/queues/{queue_id}/cases/bulk-update-status")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"case_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"all_matching\": true,\n \"filters\": {\n \"status\": [],\n \"issue_severity\": [],\n \"awaiting_my_approval\": true,\n \"priority\": [],\n \"created_at_from\": \"<string>\",\n \"created_at_to\": \"<string>\",\n \"updated_at_from\": \"<string>\",\n \"updated_at_to\": \"<string>\",\n \"labels\": {},\n \"json_data\": [\n {\n \"path\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n },\n \"search\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.duvo.ai/v2/queues/{queue_id}/cases/bulk-update-status")
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 \"case_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"all_matching\": true,\n \"filters\": {\n \"status\": [],\n \"issue_severity\": [],\n \"awaiting_my_approval\": true,\n \"priority\": [],\n \"created_at_from\": \"<string>\",\n \"created_at_to\": \"<string>\",\n \"updated_at_from\": \"<string>\",\n \"updated_at_to\": \"<string>\",\n \"labels\": {},\n \"json_data\": [\n {\n \"path\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n },\n \"search\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"updatedCount": 123,
"skippedCount": 123,
"interruptedRunIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Bulk Update Case Status
Update the status of multiple cases to pending, completed, failed, or canceled. Interrupts any active runs and releases their case ownership, but never cancels their human-in-the-loop state — pending requests and open approval batches stay answerable/resolvable from the run view. Settling a case archives the pending requests on every run attached to it, both the runs this call interrupted and any that were already terminal, so they leave the activity inbox instead of outliving the case there. Resetting to pending archives nothing and re-dispatches cases to the queue’s trigger consumer.
curl --request POST \
--url https://api.duvo.ai/v2/queues/{queue_id}/cases/bulk-update-status \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"case_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"all_matching": true,
"filters": {
"status": [],
"issue_severity": [],
"awaiting_my_approval": true,
"priority": [],
"created_at_from": "<string>",
"created_at_to": "<string>",
"updated_at_from": "<string>",
"updated_at_to": "<string>",
"labels": {},
"json_data": [
{
"path": "<string>",
"value": "<string>"
}
]
},
"search": "<string>"
}
'import requests
url = "https://api.duvo.ai/v2/queues/{queue_id}/cases/bulk-update-status"
payload = {
"case_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"all_matching": True,
"filters": {
"status": [],
"issue_severity": [],
"awaiting_my_approval": True,
"priority": [],
"created_at_from": "<string>",
"created_at_to": "<string>",
"updated_at_from": "<string>",
"updated_at_to": "<string>",
"labels": {},
"json_data": [
{
"path": "<string>",
"value": "<string>"
}
]
},
"search": "<string>"
}
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({
case_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
all_matching: true,
filters: {
status: [],
issue_severity: [],
awaiting_my_approval: true,
priority: [],
created_at_from: '<string>',
created_at_to: '<string>',
updated_at_from: '<string>',
updated_at_to: '<string>',
labels: {},
json_data: [{path: '<string>', value: '<string>'}]
},
search: '<string>'
})
};
fetch('https://api.duvo.ai/v2/queues/{queue_id}/cases/bulk-update-status', 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.duvo.ai/v2/queues/{queue_id}/cases/bulk-update-status",
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([
'case_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'all_matching' => true,
'filters' => [
'status' => [
],
'issue_severity' => [
],
'awaiting_my_approval' => true,
'priority' => [
],
'created_at_from' => '<string>',
'created_at_to' => '<string>',
'updated_at_from' => '<string>',
'updated_at_to' => '<string>',
'labels' => [
],
'json_data' => [
[
'path' => '<string>',
'value' => '<string>'
]
]
],
'search' => '<string>'
]),
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.duvo.ai/v2/queues/{queue_id}/cases/bulk-update-status"
payload := strings.NewReader("{\n \"case_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"all_matching\": true,\n \"filters\": {\n \"status\": [],\n \"issue_severity\": [],\n \"awaiting_my_approval\": true,\n \"priority\": [],\n \"created_at_from\": \"<string>\",\n \"created_at_to\": \"<string>\",\n \"updated_at_from\": \"<string>\",\n \"updated_at_to\": \"<string>\",\n \"labels\": {},\n \"json_data\": [\n {\n \"path\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n },\n \"search\": \"<string>\"\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.duvo.ai/v2/queues/{queue_id}/cases/bulk-update-status")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"case_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"all_matching\": true,\n \"filters\": {\n \"status\": [],\n \"issue_severity\": [],\n \"awaiting_my_approval\": true,\n \"priority\": [],\n \"created_at_from\": \"<string>\",\n \"created_at_to\": \"<string>\",\n \"updated_at_from\": \"<string>\",\n \"updated_at_to\": \"<string>\",\n \"labels\": {},\n \"json_data\": [\n {\n \"path\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n },\n \"search\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.duvo.ai/v2/queues/{queue_id}/cases/bulk-update-status")
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 \"case_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"all_matching\": true,\n \"filters\": {\n \"status\": [],\n \"issue_severity\": [],\n \"awaiting_my_approval\": true,\n \"priority\": [],\n \"created_at_from\": \"<string>\",\n \"created_at_to\": \"<string>\",\n \"updated_at_from\": \"<string>\",\n \"updated_at_to\": \"<string>\",\n \"labels\": {},\n \"json_data\": [\n {\n \"path\": \"<string>\",\n \"value\": \"<string>\"\n }\n ]\n },\n \"search\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"updatedCount": 123,
"skippedCount": 123,
"interruptedRunIds": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
]
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Authorizations
API key authentication. Get your API key from the Duvo dashboard.
Path Parameters
The queue's unique identifier
Body
Target status for each case. completed, failed, and canceled are terminal — canceled records a deliberate human stop, distinct from a system failed. pending resets the case (the queue's trigger consumer, if any, will re-claim it). success is not settable: it means an evaluation passed.
pending, completed, failed, canceled Explicit case IDs to act on (1-100). Provide this or set all_matching.
1 - 100 elementsWhen true, act on every case matching the provided filters/search instead of an explicit id list.
Filters selecting the cases when all_matching is true.
Show child attributes
Show child attributes
Free-text search selecting the cases when all_matching is true.
Was this page helpful?