curl --request GET \
--url https://api.duvo.ai/v2/teams/{teamId}/runs \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.duvo.ai/v2/teams/{teamId}/runs"
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/teams/{teamId}/runs', 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/teams/{teamId}/runs",
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/teams/{teamId}/runs"
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/teams/{teamId}/runs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.duvo.ai/v2/teams/{teamId}/runs")
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{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"status": "not_started",
"source": "<string>",
"title": "<string>",
"run_number": 123,
"agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"agent_name": "<string>",
"build_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"automation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"automation_name": "<string>",
"user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"case_queue_item_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"case_queue_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"case_queue_name": "<string>",
"case_title": "<string>",
"postponed_to": "2023-11-07T05:31:56Z",
"submitted_prompt_count": 4503599627370495,
"eval_summaries": {
"passed": 123,
"total": 123,
"status": "ready",
"evaluationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"final_comment": "<string>",
"severityCounts": {
"critical": 4503599627370495,
"medium": 4503599627370495,
"low": 4503599627370495
}
}
}
],
"total": 123,
"has_more": false,
"next_cursor": null
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}List Runs
List runs for the current team. Supports filtering by agent, user, queue, status, etc. Messages, evaluation data, and queue metadata are included where available. Set count_only=true to skip Run row selection and enrichment. The normal response shape is returned with data: [] and the matching total. To sweep a whole team, follow next_cursor rather than raising offset.
curl --request GET \
--url https://api.duvo.ai/v2/teams/{teamId}/runs \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.duvo.ai/v2/teams/{teamId}/runs"
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/teams/{teamId}/runs', 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/teams/{teamId}/runs",
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/teams/{teamId}/runs"
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/teams/{teamId}/runs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.duvo.ai/v2/teams/{teamId}/runs")
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{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"started_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"status": "not_started",
"source": "<string>",
"title": "<string>",
"run_number": 123,
"agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"agent_name": "<string>",
"build_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"automation_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"automation_name": "<string>",
"user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"case_queue_item_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"case_queue_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"case_queue_name": "<string>",
"case_title": "<string>",
"postponed_to": "2023-11-07T05:31:56Z",
"submitted_prompt_count": 4503599627370495,
"eval_summaries": {
"passed": 123,
"total": 123,
"status": "ready",
"evaluationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"final_comment": "<string>",
"severityCounts": {
"critical": 4503599627370495,
"medium": 4503599627370495,
"low": 4503599627370495
}
}
}
],
"total": 123,
"has_more": false,
"next_cursor": null
}{
"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
Query Parameters
Number of runs per page (1-100, default 20)
1 <= x <= 100Number of runs to skip. Every skipped run is still read by the database, so deep offsets get slower page by page; to walk a whole team's history, page with cursor instead.
x >= 0Resume after the run a previous page ended on: pass the next_cursor that page returned, with the same filters and sort_order. Unlike offset, a cursor page does not re-read the runs before it, so a sweep does not slow down as it goes deeper; send include_total=false on the first page to skip the full count too. Runs created in between cannot shift a boundary already passed, so pages do not repeat or skip runs the way offset pages do. A run created or completed while a sweep is in progress can still be missed by that sweep, so to export runs continuously, poll with since and a short overlap and deduplicate on run id. Cannot be combined with offset. 400 when the value is not a valid runs cursor.
1Whether to return total, the count of every matching run. Counting walks every match, so it costs far more than the page itself on a large team. Defaults to true on a first page and false on a cursor page, where total is null unless this is true. Implied by count_only.
true, false Field to sort by (default created_at)
created_at Sort direction (default desc)
asc, desc Filter to runs with this status
not_started, pending, starting, running, waiting, completed, failed, interrupted, stopped, needs_attention Filter to runs for this agent
Filter to runs that ran under this automation. A run keeps the automation it was created under, even after its agent moves to another automation
Filter to runs owned by this user; non-superadmin callers are scoped to themselves regardless of this value
Filter to runs associated with this queue
Filter to runs created from this source (e.g. api, schedule)
Full-text search across run titles and case titles
Filter on the run's latest successful evaluation: true returns only runs it flagged, false only runs it did not. Only the latest evaluation counts — an older flag does not match — and a run whose latest evaluation errored, or that has none, counts as unflagged. Omit to return both.
true, false If set, only return runs whose latest successful evaluation has at least one failing rubric with this severity (critical | medium | low). Implies has_issues; legacy evaluations without severity companion fields do not match this filter.
critical, medium, low Return runs completed at or after this ISO-8601 timestamp. Runs that have not completed are excluded.
Return runs completed before this ISO-8601 timestamp. The upper bound is exclusive. Runs that have not completed are excluded.
Skip row selection and enrichment. The normal list response shape is returned with an empty row array and the matching total.
true, false Response
Default Response
Show child attributes
Show child attributes
Total runs matching the filters, ignoring pagination. Null when no count was requested (a cursor page without include_total=true, or include_total=false) — distinct from a count of 0.
Whether another page exists past this one, determined by looking one row ahead. False on a count_only response.
Pass as cursor (same filters, same sort_order) to fetch the next page. Null when has_more is false. Continues right after the last run on this page.
Was this page helpful?