Rayform

API reference

Exports

Write a slice in a training format, to your own bucket or to Rayform storage with signed URLs.

Rayform is in private preview. APIs, formats and the SDK described here may change before general availability.

The export object

JSON
{
  "id": "exp_01JA9B",
  "object": "export",
  "slice": "slc_7c1e04aa",
  "format": "lerobot",
  "options": { "cameras": ["cam0/rgb", "wrist/rgb"], "fps": 15, "action": "joints/position_delta", "frame": "ros" },
  "destination": { "type": "s3", "uri": "s3://my-bucket/rayform/mug-grasps/" },
  "status": "completed",
  "progress": 1.0,
  "bytes": 18210443264,
  "files": 1648,
  "created_at": "2026-10-15T09:42:10Z",
  "completed_at": "2026-10-15T10:07:52Z"
}
FieldTypeDescription
statusstringqueued, running, completed or failed
progressnumberFraction of segments written, from 0 to 1
destinationobjectWhere files were written; type is s3, gcs or rayform

Create an export

POST/v1/exports

Parameters

NameTypeRequiredDescription
slicestringyesSlice ID
formatstringyeslerobot, rlds, webdataset, mcap, usd or mjcf
optionsobjectnoSee export options
destinationstringnos3://bucket/prefix/ or gs://bucket/prefix/; omit to keep files in Rayform storage

Request

Shell
curl https://api.rayform.world/v1/exports \
  -H "Authorization: Bearer $RAYFORM_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: export-slc_7c1e04aa-lerobot-v1" \
  -d '{
    "slice": "slc_7c1e04aa",
    "format": "lerobot",
    "options": { "cameras": ["cam0/rgb", "wrist/rgb"], "fps": 15, "action": "joints/position_delta", "frame": "ros" },
    "destination": "s3://my-bucket/rayform/mug-grasps/"
  }'
Python
export = client.exports.create(
    "slc_7c1e04aa",
    format="lerobot",
    options={"cameras": ["cam0/rgb", "wrist/rgb"], "fps": 15, "action": "joints/position_delta", "frame": "ros"},
    destination="s3://my-bucket/rayform/mug-grasps/",
)
export.wait()

Response

Returns the export with status: "queued". If an export with the same slice, format, options and destination already completed, it is returned instead and nothing is written again.

Retrieve an export

GET/v1/exports/{id}

List an export's files

GET/v1/exports/{id}/files

For exports kept in Rayform storage, each file has a signed URL valid for 15 minutes. List again to get fresh URLs.

JSON
{
  "object": "list",
  "data": [
    { "path": "meta/info.json", "bytes": 4210, "url": "https://files.rayform.world/exp_01JA9B/meta/info.json?sig=..." },
    { "path": "data/chunk-000/episode_000000.parquet", "bytes": 1882301, "url": "https://files.rayform.world/...?sig=..." }
  ],
  "has_more": true,
  "next_cursor": "ZXhwXzAx"
}

Destinations

To export into your own bucket, allow Rayform's export role to write to the prefix. For S3:

bucket-policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::RAYFORM_ACCOUNT_ID:role/rayform-export" },
      "Action": ["s3:PutObject", "s3:AbortMultipartUpload"],
      "Resource": "arn:aws:s3:::my-bucket/rayform/*",
      "Condition": { "StringEquals": { "s3:ExternalId": "org_7Hq2" } }
    }
  ]
}

The exact account ID and external ID for your organisation are shown in the console under Settings → Export destinations.

Last updated October 18, 2026