curl --request GET \
--url https://api.duvo.ai/v2/agents/{agent_id}/revisions \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.duvo.ai/v2/agents/{agent_id}/revisions"
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/agents/{agent_id}/revisions', 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/agents/{agent_id}/revisions",
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/agents/{agent_id}/revisions"
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/agents/{agent_id}/revisions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.duvo.ai/v2/agents/{agent_id}/revisions")
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{
"builds": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"copilot_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"config": {
"version": "v1",
"data": {
"language": "python",
"source": {
"kind": "inline",
"code": "<string>"
},
"files": [],
"timeoutMs": 600000,
"handoverRequired": false,
"maxConcurrency": 123
}
},
"status": "<string>",
"revision_number": 123,
"parent_build_id": "<string>",
"created_by": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"revision_name": "<string>",
"revision_description": "<string>",
"created_by_name": "<string>",
"schedules": [
{
"id": "<string>",
"build_id": "<string>",
"agent_id": "<string>",
"user_id": "<string>",
"enabled": true,
"frequency": "every_5_minutes",
"time": "<string>",
"timezone": "<string>",
"day": "<string>",
"day_of_month": 123,
"cron": "<string>",
"source": "<string>",
"task": "<string>",
"recurring": true,
"auto_disabled_at": "<string>",
"auto_disabled_reason": "<string>",
"consecutive_missing_connection_failures": 4503599627370495,
"first_missing_connection_failure_at": "<string>",
"last_missing_connection_failure_at": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"user_name": "<string>",
"user_email": "<string>",
"pending_change": {
"automation_revision_id": "<string>",
"enabled": true,
"cron": "<string>",
"frequency": "<string>",
"time": "<string>",
"timezone": "<string>",
"day": "<string>",
"day_of_month": 123,
"task": "<string>"
}
}
],
"handover_to": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"handover_options": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
}
],
"config_summary": {
"config_hash": "<string>",
"input_chars": 0,
"source_chars": 0,
"models": {
"agent": {
"model": "<string>"
},
"browsing": {
"provider": "google",
"model": "gemini-2.5-pro"
}
}
}
}
],
"total": 0,
"limit": 0,
"offset": 0
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"validationErrors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"validationErrors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"validationErrors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"validationErrors": [
{
"field": "<string>",
"message": "<string>"
}
]
}List Agent Revisions
List revisions for an agent. Pass config=light to leave each revision’s config out of the page and get its sizes instead; read the AOP with getRevisionBody.
curl --request GET \
--url https://api.duvo.ai/v2/agents/{agent_id}/revisions \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.duvo.ai/v2/agents/{agent_id}/revisions"
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/agents/{agent_id}/revisions', 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/agents/{agent_id}/revisions",
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/agents/{agent_id}/revisions"
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/agents/{agent_id}/revisions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.duvo.ai/v2/agents/{agent_id}/revisions")
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{
"builds": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"copilot_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"config": {
"version": "v1",
"data": {
"language": "python",
"source": {
"kind": "inline",
"code": "<string>"
},
"files": [],
"timeoutMs": 600000,
"handoverRequired": false,
"maxConcurrency": 123
}
},
"status": "<string>",
"revision_number": 123,
"parent_build_id": "<string>",
"created_by": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"revision_name": "<string>",
"revision_description": "<string>",
"created_by_name": "<string>",
"schedules": [
{
"id": "<string>",
"build_id": "<string>",
"agent_id": "<string>",
"user_id": "<string>",
"enabled": true,
"frequency": "every_5_minutes",
"time": "<string>",
"timezone": "<string>",
"day": "<string>",
"day_of_month": 123,
"cron": "<string>",
"source": "<string>",
"task": "<string>",
"recurring": true,
"auto_disabled_at": "<string>",
"auto_disabled_reason": "<string>",
"consecutive_missing_connection_failures": 4503599627370495,
"first_missing_connection_failure_at": "<string>",
"last_missing_connection_failure_at": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"user_name": "<string>",
"user_email": "<string>",
"pending_change": {
"automation_revision_id": "<string>",
"enabled": true,
"cron": "<string>",
"frequency": "<string>",
"time": "<string>",
"timezone": "<string>",
"day": "<string>",
"day_of_month": 123,
"task": "<string>"
}
}
],
"handover_to": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"handover_options": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>"
}
],
"config_summary": {
"config_hash": "<string>",
"input_chars": 0,
"source_chars": 0,
"models": {
"agent": {
"model": "<string>"
},
"browsing": {
"provider": "google",
"model": "gemini-2.5-pro"
}
}
}
}
],
"total": 0,
"limit": 0,
"offset": 0
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"validationErrors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"validationErrors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"validationErrors": [
{
"field": "<string>",
"message": "<string>"
}
]
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"validationErrors": [
{
"field": "<string>",
"message": "<string>"
}
]
}Authorizations
API key authentication. Get your API key from the Duvo dashboard.
Path Parameters
The agent's unique identifier
Query Parameters
Number of revisions per page (1-100, default 20)
1 <= x <= 100Number of revisions to skip
0 <= x <= 9007199254740991Only revisions with this status. live returns the active revision, wherever it falls in the history.
draft, live, historic full (default) embeds each revision's config. light sets config to null and reports its sizes, hash and models in config_summary; read the AOP or program text with getRevisionBody. Use light unless you need the instructions themselves: a page of revisions can run to millions of characters.
light, full Response
Default Response
Was this page helpful?