policies and you get one run back per policy, all training in parallel on their own GPUs so you can compare them.
Create a run
Request body
string
required
The dataset to train on: a Hugging Face LeRobot repo id such as
lerobot/pusht, or a gs:// path to a LeRobot dataset.string[]
required
Policy types to train, one run each. Between
1 and 8 entries. Fetch the list from GET /v1/training_policies.string
The GPU to train on. Defaults to
gcp_gpu_t4. Each policy declares a minimum tier — see GET /v1/hardware_tiers.integer
Training steps. Defaults to the policy’s own recommended value.
integer
Batch size. Defaults to the policy’s own recommended value.
integer
Save a checkpoint every N steps.
object
Maps your dataset’s camera keys to the policy’s image slots: each key is a camera key from your dataset, each value the slot to feed it into. Omit it and Kite maps them for you. See Inspect a dataset for your dataset’s camera keys and a worked example.
boolean
Push the trained policy to your connected Hugging Face account when the run finishes. Defaults to
false.string
The policy name to push under. The namespace is always your connected account.
object
Opaque data echoed back on the run and on its webhook events. Use it to tie a run to your own job id.
Response — 202 Accepted
group_id, so you can tell which ones were launched together even if their webhooks arrive out of order.
Common failures at create time:
400 policy_not_available— an unknown policy, or one that can’t currently be trained400 hardware_tier_too_small— the tier is below the policy’s minimum;details.min_hardware_tiertells you what it needs400 hardware_tier_not_available— an unknown or currently disabled tier;details.available_tierslists the usable ones402 insufficient_tokens— not enough credits for the whole request429 concurrency_limit_exceeded— you already have the maximum number of runs in flight429 capacity_exceeded— Kite is at GPU capacity; retry shortly503 service_unavailable— cloud GPU training is temporarily down
Idempotency
Pass a uniqueIdempotency-Key header to make retries safe. A repeated request with the same key returns the original runs instead of starting duplicates — so a dropped connection or a CI retry never double-charges you.
Reusing a key with a different payload returns
409 Conflict — the key is bound to the first request body it saw.Track progress
Poll the run to watch it move through its lifecycle.progress and metrics come straight from the running trainer.
status field moves through:
phase tells you what a processing run is doing right now — useful, because provisioning a GPU and training on it both look the same from status alone:
You can also poll any run through the uniform operations view, which works the same for every Kite resource:
Read the logs
tail lines of the trainer’s output, capped at 1000. Logs stay readable after the run finishes, so this is where you look when a run fails.
Get your policy
Whenstatus is succeeded, output describes what the run produced.
Response — output
/checkpoints. artifact_uri is the raw storage path, useful if you have your own access to the bucket; otherwise use download_url.
Download a checkpoint
List every checkpoint a run saved, oldest first:pretrained_model/ directory:
push_to_hub uploads. Kite streams the archive rather than building it up front, so a multi-GB policy downloads like any other file.
Checkpoints are paginated on step: pass the response’s next_cursor back as after, and stop when has_more is false. A run with a small save_freq can have thousands of them.
The result is a standard LeRobot policy checkpoint. It’s the same artifact the dashboard produces, so it loads anywhere LeRobot policies load. No proprietary output format, no lock-in.
Cancel a run
Stop a run at any time. Cancelling releases the GPU immediately.409 not_cancelable.
Discover policies and GPUs
Rather than hard-coding names, fetch what’s currently trainable. Both lists are small and never paginate.min_hardware_tier, min_vram_gb, and recommended default_steps and default_batch_size. A policy with "available": false can’t be trained right now.
tokens_per_hour rate. A tier with "available": false exists but is switched off.
Inspect a dataset
Check a dataset is trainable — and get its camera keys — before spending any credits.camera_keys is what cameras.rename maps from. To feed those two cameras into a policy’s top and wrist slots:
400 dataset_not_readable.
What a run costs
Every run reserves one GPU-hour of credits up front, at its tier’s rate. A run that trains for longer than an hour is not charged extra.
A request that starts several runs reserves for each of them, so training three policies on a T4 costs 1,500 tokens. A run whose GPU never starts — a submission failure — is not charged at all.
Preview the cost before committing:
GET /v1/usage under training.
List your runs
next_cursor as after to fetch the next page.
Runs you start through the API also appear in the Training section of the dashboard, alongside the ones you start there. It’s one set of runs on one set of GPUs, whichever way you launch them.