curl --request GET \
--url https://api.duvo.ai/v2/queues/{queue_id}/cases \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.duvo.ai/v2/queues/{queue_id}/cases"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.duvo.ai/v2/queues/{queue_id}/cases', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.duvo.ai/v2/queues/{queue_id}/cases"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.duvo.ai/v2/queues/{queue_id}/cases")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.duvo.ai/v2/queues/{queue_id}/cases")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"cases": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"queue_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"data": "<string>",
"status": "pending",
"priority": "none",
"display_status": "pending",
"claimed_at": "<string>",
"claimed_by_run_id": "<string>",
"completed_at": "<string>",
"postponed_to": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"created_by_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_by_user_name": "<string>",
"created_by_user_email": "<string>",
"agent_run_status": "<string>",
"agent_run_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"pending_human_request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"pending_approval_batch_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"pending_approval_assignee_user_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"approval_approved_count": 4503599627370495,
"approval_rejected_count": 4503599627370495,
"labels": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"key": "<string>",
"value": "<string>",
"color_hue": 180
}
],
"json_data": {},
"json_schema_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"outcome_source": "system",
"outcome_severity": "critical",
"eval_summary": {
"passed": 123,
"total": 123,
"status": "ready",
"evaluationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"final_comment": "<string>",
"severityCounts": {
"critical": 4503599627370495,
"medium": 4503599627370495,
"low": 4503599627370495
}
},
"search_match_data_snippet": {
"before": "<string>",
"match": "<string>",
"after": "<string>"
}
}
],
"total": 123,
"limit": 0,
"offset": 0
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}List Cases
List cases in a queue. Supports status, date-range, free-text, and json_data field filters via query params. Set count_only=true to skip Case row selection and transformation. The normal response shape is returned with cases: [] and the matching total. For label filters, use POST /v2/queues/:queue_id/cases/search.
curl --request GET \
--url https://api.duvo.ai/v2/queues/{queue_id}/cases \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.duvo.ai/v2/queues/{queue_id}/cases"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.duvo.ai/v2/queues/{queue_id}/cases', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.duvo.ai/v2/queues/{queue_id}/cases"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.duvo.ai/v2/queues/{queue_id}/cases")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.duvo.ai/v2/queues/{queue_id}/cases")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"cases": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"queue_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"title": "<string>",
"data": "<string>",
"status": "pending",
"priority": "none",
"display_status": "pending",
"claimed_at": "<string>",
"claimed_by_run_id": "<string>",
"completed_at": "<string>",
"postponed_to": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"created_by_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_by_user_name": "<string>",
"created_by_user_email": "<string>",
"agent_run_status": "<string>",
"agent_run_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"pending_human_request_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"pending_approval_batch_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"pending_approval_assignee_user_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"approval_approved_count": 4503599627370495,
"approval_rejected_count": 4503599627370495,
"labels": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"key": "<string>",
"value": "<string>",
"color_hue": 180
}
],
"json_data": {},
"json_schema_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"outcome_source": "system",
"outcome_severity": "critical",
"eval_summary": {
"passed": 123,
"total": 123,
"status": "ready",
"evaluationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"final_comment": "<string>",
"severityCounts": {
"critical": 4503599627370495,
"medium": 4503599627370495,
"low": 4503599627370495
}
},
"search_match_data_snippet": {
"before": "<string>",
"match": "<string>",
"after": "<string>"
}
}
],
"total": 123,
"limit": 0,
"offset": 0
}{
"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
Query Parameters
Number of cases per page (1-100, default 20).
1 <= x <= 100Zero-based offset for pagination.
0 <= x <= 9007199254740991Filter by one or more status buckets (comma-separated). Values: all, pending, processing, needs_input, postponed, needs_review, resolved, canceled. processing covers both a case actively being worked and one waiting on its evaluation.
Filter by highest failing rubric severity (comma-separated). Values: critical, medium. Severity is a facet within the issues outcome, so it returns nothing when combined with a status bucket that excludes issues. low is not selectable: an all-low verdict is stored as success, so no case carries it.
Return only cases holding an unanswered approval row assigned to you, on the case's own run. Resolved from the authenticated caller, so it names no user: an API key filters as the user who owns it, and a credential with no user behind it is rejected rather than served an empty list. Narrows within needs_input, so it returns nothing alongside a terminal status bucket.
true, false Filter by one or more priority levels (comma-separated). Values: none, medium, high.
Full-text search across case title and data.
Return only cases created at or after an ISO-8601 timestamp or a lookback such as 24h or 7d.
Return only cases created before this ISO-8601 timestamp. The upper bound is exclusive.
Return only cases updated at or after an ISO-8601 timestamp or a lookback such as 24h or 7d.
Return only cases updated before this ISO-8601 timestamp. The upper bound is exclusive.
Field to sort by. Default: created_at.
created_at, updated_at, postponed_to Sort direction. Default: desc.
asc, desc Filter on a field of a typed queue's json_data, as :[:] (e.g. $.invoice.amount:gte:5000). Repeat the param to require several; all must match, so two comparisons on one path express a range. Operators: equals, notEquals, in, notIn, gt, gte, lt, lte, contains, isSet, isNotSet. in/notIn take a comma-separated list; isSet/isNotSet take no value. A value is typed by shape (5000 is a number, true a boolean, 00123 a string so a leading zero survives). A path the queue's Case schema does not declare is rejected rather than ignored.
Skip row selection and enrichment. The normal list response shape is returned with an empty row array and the matching total.
true, false Was this page helpful?