Approve Augmentation
Beta. Usable today, but this endpoint can change before it is stable, without a new Kite-Version. Changes are announced before they ship.
Beta. Approve a background / world run whose preview passed (awaiting_approval): its episodes are
charged and start. Not enough tokens, or the account’s monthly budget hard limit reached, is a 402 and the run
keeps waiting, so it can be approved after a top-up.
curl --request POST \
--url https://api.kiteml.com/v1/augmentations/{aug_id}/approve \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.kiteml.com/v1/augmentations/{aug_id}/approve"
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/augmentations/{aug_id}/approve', 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/augmentations/{aug_id}/approve",
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/augmentations/{aug_id}/approve"
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/augmentations/{aug_id}/approve")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kiteml.com/v1/augmentations/{aug_id}/approve")
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{
"awaiting_approval": false,
"config": {
"episode_count": 3
},
"created_at": "2026-09-27T01:00:00Z",
"id": "aug_01K62QZ8V4X9C3N7M5T2R8W6HB",
"instructions": "Make the table dark walnut and the light warm",
"model": "video",
"object": "augmentation",
"output": {
"files": [
{
"bytes": 3186,
"path": "meta/info.json",
"url": "https://storage.googleapis.com/kite-augment/augment/meta/info.json?X-Goog-Signature=abc"
}
],
"type": "download"
},
"plan": {
"changes": [
{
"description": "make the table dark walnut",
"kind": "in_front"
}
],
"engine": "video",
"reason": "The table's material changes, which needs new video.",
"source_revision": "b28c65d7b892cb8dd4ed61f45158484374330086"
},
"progress": 1,
"source": {
"repo_id": "lerobot/svla_so101_pickplace",
"type": "huggingface"
},
"status": "succeeded",
"status_message": "Output published",
"tokens": {
"charged": 32670
},
"webhook_metadata": {
"ref": "run-42"
}
}{
"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, 2026-10-12 Path Parameters
Response
The augmentation, running every episode
One augmentation of a Hugging Face LeRobot dataset, keeping its motion: every episode relit, or new episodes generated by video augmentation.
aug_ + a time-ordered ULID
processing, succeeded, failed, canceled Of the current phase (import, generate, publish): it starts again from 0 at each
0 <= x <= 1auto until the planner decides, then relight, video, background, world or mixed
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Where the episodes go, as given at create
- AugmentationHuggingFaceOutput
- AugmentationDownloadOutput
Show child attributes
Show child attributes
Show child attributes
Show child attributes
augmentation "augmentation"What it is doing now, or the last thing it did
Set when failed
Show child attributes
Show child attributes
What the background and world engines put behind the work cell: exactly one of ids or prompt, or a
filter and/or count to pick from your ready environments and the Kite library (fitted to the rig's light).
Show child attributes
Show child attributes
Set once the run is planned: what it does and why
Show child attributes
Show child attributes
The preview passed and the run waits for POST /v1/augmentations/{id}/approve
Background and world, once the episodes ran
Show child attributes
Show child attributes
curl --request POST \
--url https://api.kiteml.com/v1/augmentations/{aug_id}/approve \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.kiteml.com/v1/augmentations/{aug_id}/approve"
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/augmentations/{aug_id}/approve', 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/augmentations/{aug_id}/approve",
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/augmentations/{aug_id}/approve"
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/augmentations/{aug_id}/approve")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kiteml.com/v1/augmentations/{aug_id}/approve")
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{
"awaiting_approval": false,
"config": {
"episode_count": 3
},
"created_at": "2026-09-27T01:00:00Z",
"id": "aug_01K62QZ8V4X9C3N7M5T2R8W6HB",
"instructions": "Make the table dark walnut and the light warm",
"model": "video",
"object": "augmentation",
"output": {
"files": [
{
"bytes": 3186,
"path": "meta/info.json",
"url": "https://storage.googleapis.com/kite-augment/augment/meta/info.json?X-Goog-Signature=abc"
}
],
"type": "download"
},
"plan": {
"changes": [
{
"description": "make the table dark walnut",
"kind": "in_front"
}
],
"engine": "video",
"reason": "The table's material changes, which needs new video.",
"source_revision": "b28c65d7b892cb8dd4ed61f45158484374330086"
},
"progress": 1,
"source": {
"repo_id": "lerobot/svla_so101_pickplace",
"type": "huggingface"
},
"status": "succeeded",
"status_message": "Output published",
"tokens": {
"charged": 32670
},
"webhook_metadata": {
"ref": "run-42"
}
}{
"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": {}
}
}