Create Augmentation
curl --request POST \
--url https://api.kiteml.com/v1/augmentations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"source": {
"repo_id": "<string>",
"type": "huggingface"
},
"instructions": "<string>",
"config": {
"episode_count": 3,
"variation_prompts": [
"<string>"
],
"relight": {}
},
"output": {
"type": "download",
"repo_id": "<string>",
"private": true
},
"model": "<string>",
"reference_images": [
{
"data": "<string>",
"camera": "<string>",
"media_type": "image/jpeg"
}
],
"webhook_metadata": {}
}
'import requests
url = "https://api.kiteml.com/v1/augmentations"
payload = {
"source": {
"repo_id": "<string>",
"type": "huggingface"
},
"instructions": "<string>",
"config": {
"episode_count": 3,
"variation_prompts": ["<string>"],
"relight": {}
},
"output": {
"type": "download",
"repo_id": "<string>",
"private": True
},
"model": "<string>",
"reference_images": [
{
"data": "<string>",
"camera": "<string>",
"media_type": "image/jpeg"
}
],
"webhook_metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
source: {repo_id: '<string>', type: 'huggingface'},
instructions: '<string>',
config: {episode_count: 3, variation_prompts: ['<string>'], relight: {}},
output: {type: 'download', repo_id: '<string>', private: true},
model: '<string>',
reference_images: [{data: '<string>', camera: '<string>', media_type: 'image/jpeg'}],
webhook_metadata: {}
})
};
fetch('https://api.kiteml.com/v1/augmentations', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'source' => [
'repo_id' => '<string>',
'type' => 'huggingface'
],
'instructions' => '<string>',
'config' => [
'episode_count' => 3,
'variation_prompts' => [
'<string>'
],
'relight' => [
]
],
'output' => [
'type' => 'download',
'repo_id' => '<string>',
'private' => true
],
'model' => '<string>',
'reference_images' => [
[
'data' => '<string>',
'camera' => '<string>',
'media_type' => 'image/jpeg'
]
],
'webhook_metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.kiteml.com/v1/augmentations"
payload := strings.NewReader("{\n \"source\": {\n \"repo_id\": \"<string>\",\n \"type\": \"huggingface\"\n },\n \"instructions\": \"<string>\",\n \"config\": {\n \"episode_count\": 3,\n \"variation_prompts\": [\n \"<string>\"\n ],\n \"relight\": {}\n },\n \"output\": {\n \"type\": \"download\",\n \"repo_id\": \"<string>\",\n \"private\": true\n },\n \"model\": \"<string>\",\n \"reference_images\": [\n {\n \"data\": \"<string>\",\n \"camera\": \"<string>\",\n \"media_type\": \"image/jpeg\"\n }\n ],\n \"webhook_metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"source\": {\n \"repo_id\": \"<string>\",\n \"type\": \"huggingface\"\n },\n \"instructions\": \"<string>\",\n \"config\": {\n \"episode_count\": 3,\n \"variation_prompts\": [\n \"<string>\"\n ],\n \"relight\": {}\n },\n \"output\": {\n \"type\": \"download\",\n \"repo_id\": \"<string>\",\n \"private\": true\n },\n \"model\": \"<string>\",\n \"reference_images\": [\n {\n \"data\": \"<string>\",\n \"camera\": \"<string>\",\n \"media_type\": \"image/jpeg\"\n }\n ],\n \"webhook_metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kiteml.com/v1/augmentations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"source\": {\n \"repo_id\": \"<string>\",\n \"type\": \"huggingface\"\n },\n \"instructions\": \"<string>\",\n \"config\": {\n \"episode_count\": 3,\n \"variation_prompts\": [\n \"<string>\"\n ],\n \"relight\": {}\n },\n \"output\": {\n \"type\": \"download\",\n \"repo_id\": \"<string>\",\n \"private\": true\n },\n \"model\": \"<string>\",\n \"reference_images\": [\n {\n \"data\": \"<string>\",\n \"camera\": \"<string>\",\n \"media_type\": \"image/jpeg\"\n }\n ],\n \"webhook_metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"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": {
"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": {}
}
}Authorizations
A Kite API key (kite_...), from Platform API → Keys in the dashboard.
Headers
255The dated contract your code was written against. Without it you get 2026-09-27; every response says which version served it.
2026-09-27 Body
Show child attributes
Show child attributes
3 - 2000Show child attributes
Show child attributes
Show child attributes
Show child attributes
'auto' (default: the planner picks relight or video), 'relight' (colour and exposure transform of every episode) or 'video' (generative video augmentation)
Photos of the target look (e.g. from the deployment cameras): at most 5 MB each, 20 MB in total
6Show child attributes
Show child attributes
Opaque metadata echoed on the resource and future webhook events
Response
The augmentation, processing
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 or video
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
Set once the run is planned: what it does and why
Show child attributes
Show child attributes
curl --request POST \
--url https://api.kiteml.com/v1/augmentations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"source": {
"repo_id": "<string>",
"type": "huggingface"
},
"instructions": "<string>",
"config": {
"episode_count": 3,
"variation_prompts": [
"<string>"
],
"relight": {}
},
"output": {
"type": "download",
"repo_id": "<string>",
"private": true
},
"model": "<string>",
"reference_images": [
{
"data": "<string>",
"camera": "<string>",
"media_type": "image/jpeg"
}
],
"webhook_metadata": {}
}
'import requests
url = "https://api.kiteml.com/v1/augmentations"
payload = {
"source": {
"repo_id": "<string>",
"type": "huggingface"
},
"instructions": "<string>",
"config": {
"episode_count": 3,
"variation_prompts": ["<string>"],
"relight": {}
},
"output": {
"type": "download",
"repo_id": "<string>",
"private": True
},
"model": "<string>",
"reference_images": [
{
"data": "<string>",
"camera": "<string>",
"media_type": "image/jpeg"
}
],
"webhook_metadata": {}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
source: {repo_id: '<string>', type: 'huggingface'},
instructions: '<string>',
config: {episode_count: 3, variation_prompts: ['<string>'], relight: {}},
output: {type: 'download', repo_id: '<string>', private: true},
model: '<string>',
reference_images: [{data: '<string>', camera: '<string>', media_type: 'image/jpeg'}],
webhook_metadata: {}
})
};
fetch('https://api.kiteml.com/v1/augmentations', 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",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'source' => [
'repo_id' => '<string>',
'type' => 'huggingface'
],
'instructions' => '<string>',
'config' => [
'episode_count' => 3,
'variation_prompts' => [
'<string>'
],
'relight' => [
]
],
'output' => [
'type' => 'download',
'repo_id' => '<string>',
'private' => true
],
'model' => '<string>',
'reference_images' => [
[
'data' => '<string>',
'camera' => '<string>',
'media_type' => 'image/jpeg'
]
],
'webhook_metadata' => [
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.kiteml.com/v1/augmentations"
payload := strings.NewReader("{\n \"source\": {\n \"repo_id\": \"<string>\",\n \"type\": \"huggingface\"\n },\n \"instructions\": \"<string>\",\n \"config\": {\n \"episode_count\": 3,\n \"variation_prompts\": [\n \"<string>\"\n ],\n \"relight\": {}\n },\n \"output\": {\n \"type\": \"download\",\n \"repo_id\": \"<string>\",\n \"private\": true\n },\n \"model\": \"<string>\",\n \"reference_images\": [\n {\n \"data\": \"<string>\",\n \"camera\": \"<string>\",\n \"media_type\": \"image/jpeg\"\n }\n ],\n \"webhook_metadata\": {}\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
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")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"source\": {\n \"repo_id\": \"<string>\",\n \"type\": \"huggingface\"\n },\n \"instructions\": \"<string>\",\n \"config\": {\n \"episode_count\": 3,\n \"variation_prompts\": [\n \"<string>\"\n ],\n \"relight\": {}\n },\n \"output\": {\n \"type\": \"download\",\n \"repo_id\": \"<string>\",\n \"private\": true\n },\n \"model\": \"<string>\",\n \"reference_images\": [\n {\n \"data\": \"<string>\",\n \"camera\": \"<string>\",\n \"media_type\": \"image/jpeg\"\n }\n ],\n \"webhook_metadata\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.kiteml.com/v1/augmentations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"source\": {\n \"repo_id\": \"<string>\",\n \"type\": \"huggingface\"\n },\n \"instructions\": \"<string>\",\n \"config\": {\n \"episode_count\": 3,\n \"variation_prompts\": [\n \"<string>\"\n ],\n \"relight\": {}\n },\n \"output\": {\n \"type\": \"download\",\n \"repo_id\": \"<string>\",\n \"private\": true\n },\n \"model\": \"<string>\",\n \"reference_images\": [\n {\n \"data\": \"<string>\",\n \"camera\": \"<string>\",\n \"media_type\": \"image/jpeg\"\n }\n ],\n \"webhook_metadata\": {}\n}"
response = http.request(request)
puts response.read_body{
"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": {
"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": {}
}
}