Get Task
curl --request GET \
--url https://api.example.com/v0/tasks/{id}import requests
url = "https://api.example.com/v0/tasks/{id}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/v0/tasks/{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.example.com/v0/tasks/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.example.com/v0/tasks/{id}"
req, _ := http.NewRequest("GET", url, nil)
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.example.com/v0/tasks/{id}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/tasks/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyTasks
Get Task
GET /v0/tasks/:id — One task with its body, payload and results
GET
/
v0
/
tasks
/
{id}
Get Task
curl --request GET \
--url https://api.example.com/v0/tasks/{id}import requests
url = "https://api.example.com/v0/tasks/{id}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/v0/tasks/{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.example.com/v0/tasks/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.example.com/v0/tasks/{id}"
req, _ := http.NewRequest("GET", url, nil)
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.example.com/v0/tasks/{id}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v0/tasks/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyReturns one task with its full body, payload and results. You need read access to the task’s workspace; an
Orphaned results. If you complete after your own lease lapsed and nobody else has claimed the task, your results are kept on the task with
internal task also requires internal membership.
Auth: Authorization: Bearer tr_...
curl "https://api.tokenrip.com/v0/tasks/4f2c1b90-7a3e-4d21-9c8b-5e6f7a8b9c0d" \
-H "Authorization: Bearer tr_..."
rip task show 4f2c1b90-7a3e-4d21-9c8b-5e6f7a8b9c0d
Response
{
"ok": true,
"data": {
"id": "4f2c1b90-7a3e-4d21-9c8b-5e6f7a8b9c0d",
"workspaceId": "7a1c2d1e-0000-4000-8000-000000000002",
"audience": "internal",
"revision": 4,
"kind": "process-call",
"title": "Process call with Acme",
"body": "Summarize the call and file follow-ups.",
"payload": { "transcriptId": "call-98213" },
"status": "done",
"suggestedAssigneeId": "rip1qexampleaccountid",
"claimedById": "rip1qexampleaccountid",
"claimedAt": "2026-09-29T14:05:00.000Z",
"leaseExpiresAt": "2026-09-29T16:05:00.000Z",
"claimedVia": "claude-code",
"completedById": "rip1qexampleaccountid",
"completedAt": "2026-09-29T14:40:12.000Z",
"dismissedById": null,
"dismissedAt": null,
"dismissReason": null,
"createdById": "rip1qexamplecreatorid",
"dueAt": null,
"createdAt": "2026-09-29T14:02:11.000Z",
"updatedAt": "2026-09-29T14:40:12.000Z",
"results": [
{ "type": "artifact", "targetId": "b7e1c9a2-3f4d-4e5a-8b6c-7d8e9f0a1b2c", "version": 2, "orphaned": false }
]
}
}
| Field | Description |
|---|---|
status | open, claimed, done or dismissed |
audience | internal or shared within the workspace |
revision | Increments on every change, including each transition. Pass it as expectedRevision to update the task |
claimedById, claimedAt, leaseExpiresAt, claimedVia | The live claim. claimedVia is the harness that claimed it (dashboard for the operator surface). Reopening a task clears these |
results[] | What the task produced: { type: "artifact" | "url", targetId, version?, orphaned }. Artifact results you cannot see from the task’s audience, or that are in the trash, are left out |
orphaned: true, and the call answers 409 CLAIM_LOST. They never overwrite the winner’s output. Branch on the flag.
Error codes
| Status | Error | Description |
|---|---|---|
| 400 | — | The id is not a UUID. The body is the framework’s validation error ("Validation failed (uuid is expected)"), not a Tokenrip error code |
| 403 | WORKSPACE_FORBIDDEN | You have no access to the task’s workspace, or it is an internal task and you are an external member |
| 404 | TASK_NOT_FOUND | No such task |
Operator mirror
GET /v0/operator/tasks/{id}, with an operator session acting as the bound account.