Resume Twin
Re-queue a failed or canceled twin. Every stage it finished is cached, so only what did not finish runs
again. Free while the twin is paid for; a twin that was refunded (it built nothing) is charged 5,000 tokens
again, or 402 insufficient_tokens.
curl --request POST \
--url https://api.kiteml.com/v1/twins/{twin_id}/resume \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.kiteml.com/v1/twins/{twin_id}/resume"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.kiteml.com/v1/twins/{twin_id}/resume', 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.kiteml.com/v1/twins/{twin_id}/resume",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
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.kiteml.com/v1/twins/{twin_id}/resume"
req, _ := http.NewRequest("POST", 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.post("https://api.kiteml.com/v1/twins/{twin_id}/resume")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kiteml.com/v1/twins/{twin_id}/resume")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"status": "queued",
"progress": 0.5,
"source": {
"repo_id": "<string>",
"type": "huggingface"
},
"tokens": {
"charged": 123,
"refunded": 123
},
"object": "twin",
"stage": "<string>",
"status_message": "<string>",
"eta_seconds": 123,
"error": {
"code": "<string>",
"message": "<string>",
"resumable": true,
"stage": "<string>"
},
"camera": {
"scene": "<string>",
"wrist": "<string>",
"available": [
"<string>"
]
},
"config": {},
"stages": [
{
"stage": "<string>",
"ok": true,
"attempts": 123,
"seconds": 123,
"measurement": "<string>"
}
],
"download": {
"url": "<string>",
"requires_auth": true,
"filename": "<string>",
"bytes": 123,
"sha256": "<string>",
"scene": "<string>",
"expires_at": "<string>"
},
"webhook_metadata": {},
"created_at": "<string>"
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}Authorizations
A Kite API key (kite_...), from Platform API → Keys in the dashboard.
Headers
The dated contract your code was written against. Without it you get 2026-09-27; every response says which version served it.
2026-09-27 Path Parameters
Response
The twin, queued again
One digital twin.
twin_ + a time-ordered ULID
queued, processing, canceling, succeeded, failed, canceled 0 <= x <= 1Where the episode comes from. The same shape as an augmentation's source.
Show child attributes
Show child attributes
What the twin has cost: charged at create, refunded if it built nothing
Show child attributes
Show child attributes
twin "twin"The stage running now
While queued or processing: time left, from the stages' typical durations
Show child attributes
Show child attributes
What the dataset check resolved
Show child attributes
Show child attributes
The build options given at create
Every finished stage, in order
Show child attributes
Show child attributes
Once succeeded: the whole scene as one .tar.gz. Its file list is GET /v1/twins/{id}/files
Show child attributes
Show child attributes
curl --request POST \
--url https://api.kiteml.com/v1/twins/{twin_id}/resume \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.kiteml.com/v1/twins/{twin_id}/resume"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.kiteml.com/v1/twins/{twin_id}/resume', 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.kiteml.com/v1/twins/{twin_id}/resume",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
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.kiteml.com/v1/twins/{twin_id}/resume"
req, _ := http.NewRequest("POST", 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.post("https://api.kiteml.com/v1/twins/{twin_id}/resume")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kiteml.com/v1/twins/{twin_id}/resume")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"status": "queued",
"progress": 0.5,
"source": {
"repo_id": "<string>",
"type": "huggingface"
},
"tokens": {
"charged": 123,
"refunded": 123
},
"object": "twin",
"stage": "<string>",
"status_message": "<string>",
"eta_seconds": 123,
"error": {
"code": "<string>",
"message": "<string>",
"resumable": true,
"stage": "<string>"
},
"camera": {
"scene": "<string>",
"wrist": "<string>",
"available": [
"<string>"
]
},
"config": {},
"stages": [
{
"stage": "<string>",
"ok": true,
"attempts": 123,
"seconds": 123,
"measurement": "<string>"
}
],
"download": {
"url": "<string>",
"requires_auth": true,
"filename": "<string>",
"bytes": 123,
"sha256": "<string>",
"scene": "<string>",
"expires_at": "<string>"
},
"webhook_metadata": {},
"created_at": "<string>"
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}{
"error": {
"type": "<string>",
"code": "<string>",
"message": "<string>",
"param": "<string>",
"request_id": "<string>",
"details": {}
}
}