curl --request GET \
--url https://api.example.com/api/v1/jobs/cancel-work/ \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.example.com/api/v1/jobs/cancel-work/"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.example.com/api/v1/jobs/cancel-work/', 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/api/v1/jobs/cancel-work/",
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.example.com/api/v1/jobs/cancel-work/"
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.example.com/api/v1/jobs/cancel-work/")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/jobs/cancel-work/")
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[
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"temporal_workflow_name": "EnrollmentWorkflow",
"organisation": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"category": "enrolment"
},
"created_by": "<string>",
"ai_failure_summary": {
"headline": "<string>",
"explanation": "<string>",
"failure_categories": {}
},
"test_slugs": [
"multi-node.hello-world"
],
"hostlist": "<string>",
"chad_sop": {
"id": "<string>",
"name": "<string>",
"version": 1073741824
},
"links": {
"self": "<string>",
"collection": "<string>",
"workflow": "<string>",
"devices": "<string>",
"job_device_statuses": "<string>",
"temporal": "<string>",
"logs": "<string>"
},
"devices": [
{
"name": "<string>",
"rack_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rack_name": "<string>",
"position": 123,
"pod": "<string>"
}
],
"device_count": 123,
"failed_device_count": 123,
"unevaluated_device_count": 123,
"work_claimed_at": "2023-11-07T05:31:56Z",
"work_claim_expires_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"parameters": "<unknown>",
"max_attempts_override": 123,
"source_test_execution": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"status": "pending",
"started_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"temporal_workflow_id": "<string>"
}
]{
"detail": "<string>",
"code": "error",
"field_errors": [
{
"field": "<string>",
"messages": [
"<string>"
]
}
]
}{
"detail": "<string>",
"code": "error",
"field_errors": [
{
"field": "<string>",
"messages": [
"<string>"
]
}
]
}{
"detail": "<string>",
"code": "error",
"field_errors": [
{
"field": "<string>",
"messages": [
"<string>"
]
}
]
}Claim workflow cancellation work (internal)
Claim this cycle’s cancellation-dispatch work for one replica.
Internal endpoint: replaces the plain CANCELLATION_REQUESTED list read so each pending cancellation is dispatched to Temporal by exactly one replica per TTL window. The response lease lets the controller discard stale cached work after another replica reclaims it.
curl --request GET \
--url https://api.example.com/api/v1/jobs/cancel-work/ \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.example.com/api/v1/jobs/cancel-work/"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.example.com/api/v1/jobs/cancel-work/', 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/api/v1/jobs/cancel-work/",
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.example.com/api/v1/jobs/cancel-work/"
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.example.com/api/v1/jobs/cancel-work/")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/jobs/cancel-work/")
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[
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"workflow": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"temporal_workflow_name": "EnrollmentWorkflow",
"organisation": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"category": "enrolment"
},
"created_by": "<string>",
"ai_failure_summary": {
"headline": "<string>",
"explanation": "<string>",
"failure_categories": {}
},
"test_slugs": [
"multi-node.hello-world"
],
"hostlist": "<string>",
"chad_sop": {
"id": "<string>",
"name": "<string>",
"version": 1073741824
},
"links": {
"self": "<string>",
"collection": "<string>",
"workflow": "<string>",
"devices": "<string>",
"job_device_statuses": "<string>",
"temporal": "<string>",
"logs": "<string>"
},
"devices": [
{
"name": "<string>",
"rack_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"rack_name": "<string>",
"position": 123,
"pod": "<string>"
}
],
"device_count": 123,
"failed_device_count": 123,
"unevaluated_device_count": 123,
"work_claimed_at": "2023-11-07T05:31:56Z",
"work_claim_expires_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"parameters": "<unknown>",
"max_attempts_override": 123,
"source_test_execution": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"status": "pending",
"started_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"temporal_workflow_id": "<string>"
}
]{
"detail": "<string>",
"code": "error",
"field_errors": [
{
"field": "<string>",
"messages": [
"<string>"
]
}
]
}{
"detail": "<string>",
"code": "error",
"field_errors": [
{
"field": "<string>",
"messages": [
"<string>"
]
}
]
}{
"detail": "<string>",
"code": "error",
"field_errors": [
{
"field": "<string>",
"messages": [
"<string>"
]
}
]
}Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Query Parameters
1 <= x <= 2001Claim lease duration. Pass the agent's poll interval so claim expiry doubles as the poll schedule; defaults are per operation.
5 <= x <= 3600Response
Compact workflow reference embedded in every job response.
Includes the fields required by the fleet-manager client's WorkflowRef model while skipping expensive computed fields like parameters_presets.
category is here because the UI reads it off a job's workflow, and it costs
nothing: Workflow.category is a dict lookup on temporal_workflow_name, not a
column or a query. Declared exactly as WorkflowSerializer declares it so both
resolve to one named enum component instead of splitting into two generated types.
Show child attributes
Show child attributes
Return the creator: username, app client_id with prefix, or None.
AI-generated failure summary for jobs that ended in FAILED or PARTIALLY_FAILED
Show child attributes
Show child attributes
Distinct test slugs from associated test executions
multi-node.hello-world- multi-node.hello-worldmulti-node.iperf-matrix- multi-node.iperf-matrixmulti-node.nccl-all-gather- multi-node.nccl-all-gathermulti-node.nccl-all-reduce- multi-node.nccl-all-reducemulti-node.nccl-all-reduce-multi-rack- multi-node.nccl-all-reduce-multi-rackmulti-node.nccl-all-to-all- multi-node.nccl-all-to-allmulti-node.nvloom- multi-node.nvloommulti-node.pairwise-net-gpu.bw- multi-node.pairwise-net-gpu.bwmulti-node.pairwise-net-gpu.lat- multi-node.pairwise-net-gpu.latmulti-node.pairwise-net.bw- multi-node.pairwise-net.bwmulti-node.pairwise-net.lat- multi-node.pairwise-net.latmulti-node.s3-elbencho- multi-node.s3-elbenchomulti-node.storage-elbencho- multi-node.storage-elbenchomulti-node.training-gpt-oss-120b- multi-node.training-gpt-oss-120bmulti-node.training-llama3-1-405b- multi-node.training-llama3-1-405bmulti-node.training-llama3-70b- multi-node.training-llama3-70bmulti-node.training-nemotron-24x2h- multi-node.training-nemotron-24x2hmulti-node.training-nemotron-checkpoint- multi-node.training-nemotron-checkpointmulti-node.training-nemotron-h- multi-node.training-nemotron-hmulti-node.training-nemotron-h-multi-rack- multi-node.training-nemotron-h-multi-rackmulti-node.training-qwen3-235b- multi-node.training-qwen3-235bsingle-node.babelstream- single-node.babelstreamsingle-node.dcgmi-diag- single-node.dcgmi-diagsingle-node.gpu-fryer- single-node.gpu-fryersingle-node.hello-world- single-node.hello-worldsingle-node.hpl-cpu- single-node.hpl-cpusingle-node.hpl-gpu- single-node.hpl-gpusingle-node.lmbench-lat-mem-rd- single-node.lmbench-lat-mem-rdsingle-node.memtester- single-node.memtestersingle-node.nccl-all-gather- single-node.nccl-all-gathersingle-node.nccl-all-reduce- single-node.nccl-all-reducesingle-node.nccl-all-reduce-loopback- single-node.nccl-all-reduce-loopbacksingle-node.nccl-all-to-all- single-node.nccl-all-to-allsingle-node.node-health-check- single-node.node-health-checksingle-node.nvme-fio- single-node.nvme-fiosingle-node.nvme-self-test- single-node.nvme-self-testsingle-node.storage-elbencho- single-node.storage-elbenchosingle-node.stream- single-node.streamsingle-node.stress-ng-cpu- single-node.stress-ng-cpusingle-node.training-llama3-8b- single-node.training-llama3-8bsingle-node.training-nemotronh-8b- single-node.training-nemotronh-8b
multi-node.hello-world, multi-node.iperf-matrix, multi-node.nccl-all-gather, multi-node.nccl-all-reduce, multi-node.nccl-all-reduce-multi-rack, multi-node.nccl-all-to-all, multi-node.nvloom, multi-node.pairwise-net-gpu.bw, multi-node.pairwise-net-gpu.lat, multi-node.pairwise-net.bw, multi-node.pairwise-net.lat, multi-node.s3-elbencho, multi-node.storage-elbencho, multi-node.training-gpt-oss-120b, multi-node.training-llama3-1-405b, multi-node.training-llama3-70b, multi-node.training-nemotron-24x2h, multi-node.training-nemotron-checkpoint, multi-node.training-nemotron-h, multi-node.training-nemotron-h-multi-rack, multi-node.training-qwen3-235b, single-node.babelstream, single-node.dcgmi-diag, single-node.gpu-fryer, single-node.hello-world, single-node.hpl-cpu, single-node.hpl-gpu, single-node.lmbench-lat-mem-rd, single-node.memtester, single-node.nccl-all-gather, single-node.nccl-all-reduce, single-node.nccl-all-reduce-loopback, single-node.nccl-all-to-all, single-node.node-health-check, single-node.nvme-fio, single-node.nvme-self-test, single-node.storage-elbencho, single-node.stream, single-node.stress-ng-cpu, single-node.training-llama3-8b, single-node.training-nemotronh-8b Compressed hostlist derived from the job's associated device names
The CHAD SOP recipe that dispatched this job; null when the job was not dispatched by CHAD.
Show child attributes
Show child attributes
Serializer for job links.
Show child attributes
Show child attributes
Per-device name + physical location (rack, U, networking pod) for the job's devices, ordered by name — a slim summary the UI aggregates into rack/pod chips. Carried by the jobs list only; omitted from responses that do not project it. The full device objects are at links.devices.
Show child attributes
Show child attributes
Number of devices the job runs on. A convenience projection of the same set devices lists and hostlist compresses, so all three always agree. Carried by the jobs list only.
Number of the job's devices that failed burn-in evaluation, counting each device once however many of the job's tests it failed. Sourced from the evaluation outcome of the job's test executions, so it reflects the threshold verdict rather than the Temporal result: a burn-in job whose devices all report completed still counts them here when their metrics breached thresholds. A test that has not been evaluated yet is not counted, and a job that runs no burn-in tests reports 0 — read unevaluated_device_count to tell those two apart. A failing multi-device test implicates every device in its cohort, so one bad device in a collective run counts the whole cohort. Counts debug-mode and stale-marked evidence too, matching what the test-executions list returns for the job. Carried by the jobs list only.
Number of the job's devices whose burn-in evidence finished but has never been evaluated, so failed_device_count cannot speak for them. Non-zero means this row's failure count is incomplete rather than clean: the test-executions list evaluates these rows on read, so it can show a failure the count does not. Counted once per device, and 0 for a job that runs no burn-in tests. Carried by the jobs list only.
Per-job override for Temporal activity retry budgets. NULL uses the worker's ActivityRetryConfigs defaults; 1 fails fast (no retries) for OpenStack debugging. Must be >= 1 — Temporal treats maximum_attempts=0 as unlimited retries.
Set when this job was created via a single-test re-run; points to the source execution.
50^[-a-zA-Z0-9_]+$pending- Pendingrunning- Runningcancellation_requested- Cancellation Requestedcompleted- Completedfailed- Failedpartially_failed- Partially Failedcancelled- Cancelledterminated- Terminatedsuperseded- Supersededtimed_out- Timed Out
pending, running, cancellation_requested, completed, failed, partially_failed, cancelled, terminated, superseded, timed_out 255