curl --request GET \
--url https://api.duvo.ai/v2/clarity-v2/processes/{process_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.duvo.ai/v2/clarity-v2/processes/{process_id}"
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/clarity-v2/processes/{process_id}', 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/clarity-v2/processes/{process_id}",
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/clarity-v2/processes/{process_id}"
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/clarity-v2/processes/{process_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.duvo.ai/v2/clarity-v2/processes/{process_id}")
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{
"process": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"team_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"version": 0,
"generation_error": "<string>",
"generation_progress": {
"steps": [
{
"key": "<string>",
"label": "<string>",
"order": 123,
"count": 123
}
]
},
"custom_prompt": "<string>",
"created_at": "<string>",
"updated_at": "<string>"
},
"current_process_versions": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"process_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"parent_current_process_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "<string>",
"user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sandbox_id": "<string>",
"last_session_id": "<string>"
}
],
"transformation_proposal_versions": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"process_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"clarity_current_process_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"parent_transformation_proposal_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "<string>",
"user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sandbox_id": "<string>",
"last_session_id": "<string>",
"extra_capture_requests": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"proposal_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"step_id": "<string>",
"capture_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"requested_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"gap": "<string>",
"suggested_prompt": "<string>",
"created_at": "<string>",
"updated_at": "<string>"
}
]
}
],
"captures": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"processId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "<string>",
"videoUrl": "<string>",
"videoTranscript": "<string>",
"transcript": [
{
"message": "<string>",
"speakerName": "<string>",
"timestamp": 123
}
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"userName": "<string>",
"documentFileName": "<string>",
"documentTextMetadata": {
"pages": [
{
"pageNumber": 123,
"startOffset": 4503599627370495,
"endOffset": 4503599627370495,
"lines": [
{
"pageNumber": 123,
"lineNumber": 123,
"startOffset": 4503599627370495,
"endOffset": 4503599627370495
}
]
}
]
},
"hasTranscript": true,
"hasVideoTranscript": true,
"transcriptQuestionCount": 4503599627370495
}
]
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}Get Clarity Process
Get the v2 read model for a clarity process: the process row (with operational fields like generation_error, generation_progress, custom_prompt), its captures, and the lightweight version arrays for both snapshot tabs. The full payload of any specific snapshot is fetched lazily via the unified per-snapshot detail endpoint (GET .../snapshots/:kind/:id); this read model deliberately doesn’t carry it so the response stays small.
curl --request GET \
--url https://api.duvo.ai/v2/clarity-v2/processes/{process_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.duvo.ai/v2/clarity-v2/processes/{process_id}"
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/clarity-v2/processes/{process_id}', 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/clarity-v2/processes/{process_id}",
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/clarity-v2/processes/{process_id}"
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/clarity-v2/processes/{process_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.duvo.ai/v2/clarity-v2/processes/{process_id}")
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{
"process": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"team_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"version": 0,
"generation_error": "<string>",
"generation_progress": {
"steps": [
{
"key": "<string>",
"label": "<string>",
"order": 123,
"count": 123
}
]
},
"custom_prompt": "<string>",
"created_at": "<string>",
"updated_at": "<string>"
},
"current_process_versions": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"process_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"parent_current_process_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "<string>",
"user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sandbox_id": "<string>",
"last_session_id": "<string>"
}
],
"transformation_proposal_versions": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"process_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"clarity_current_process_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"parent_transformation_proposal_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "<string>",
"user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sandbox_id": "<string>",
"last_session_id": "<string>",
"extra_capture_requests": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"proposal_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"step_id": "<string>",
"capture_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"requested_user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"gap": "<string>",
"suggested_prompt": "<string>",
"created_at": "<string>",
"updated_at": "<string>"
}
]
}
],
"captures": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"processId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"userId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"type": "<string>",
"videoUrl": "<string>",
"videoTranscript": "<string>",
"transcript": [
{
"message": "<string>",
"speakerName": "<string>",
"timestamp": 123
}
],
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"userName": "<string>",
"documentFileName": "<string>",
"documentTextMetadata": {
"pages": [
{
"pageNumber": 123,
"startOffset": 4503599627370495,
"endOffset": 4503599627370495,
"lines": [
{
"pageNumber": 123,
"lineNumber": 123,
"startOffset": 4503599627370495,
"endOffset": 4503599627370495
}
]
}
]
},
"hasTranscript": true,
"hasVideoTranscript": true,
"transcriptQuestionCount": 4503599627370495
}
]
}{
"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 clarity process id
Query Parameters
Capture payload mode. full (default) embeds each capture's transcript content. lite omits transcript/videoTranscript (returned as null) and relies on the hasTranscript/hasVideoTranscript flags; fetch content on demand via GET .../captures/:capture_id.
full, lite Response
Default Response
Show child attributes
Show child attributes
All non-deleted current-process snapshots, newest first. Lightweight rows (no data) for the version-picker UI. Clients lazy-fetch the live (or selected) snapshot via the per-snapshot detail endpoint.
Show child attributes
Show child attributes
All non-deleted transformation-proposal snapshots, newest first. Lightweight rows (no data) for the version-picker UI.
Show child attributes
Show child attributes
All captures (videos, interviews, documents) attached to this process. Field names follow the legacy v1 capture wire format (camelCase) so existing capture consumers keep working unchanged.
Show child attributes
Show child attributes
Was this page helpful?