Storage & Files API

Lightning AI provides storage for files, datasets, and model artifacts within Studios and Teamspaces.


Studio File System (Direct Upload/Download)

Files can be uploaded to and downloaded from a running Studio via signed URLs.

Upload File to Studio

To upload a file to a Studio, the SDK uses a multi-step process:

Step 1: Get a signed upload URL

POST /v1/projects/{projectId}/storage

Request body:

{
  "cloudspace_id": "studio-id",
  "cluster_id": "lightning-cloud",
  "path": "path/to/file.py",
  "file_size": 1024
}

Response:

{
  "upload_url": "https://storage.googleapis.com/bucket/...",
  "path": "path/to/file.py"
}

Step 2: Upload using the signed URL

curl -X PUT "${UPLOAD_URL}" \
  --upload-file /local/path/to/file.py

Step 3: Notify completion

POST /v1/projects/{projectId}/storage/complete

{
  "cloudspace_id": "studio-id",
  "path": "path/to/file.py"
}

Download File from Studio

GET /v1/projects/{projectId}/storage/download

Query parameters:

Parameter Description
path File path within the Studio
cloudspace_id Studio ID
cluster_id Cloud account ID

Response: Returns a signed download URL or redirects to the file.


List Files / Get Metadata

GET /v1/projects/{projectId}/storage/metadata

Returns metadata for files in the Studio storage.

Query parameters:

Parameter Description
cloudspace_id Studio ID
cluster_id Cloud account ID
path Directory path to list

Delete File

DELETE /v1/projects/{projectId}/storage

Query parameters:

Parameter Description
cloudspace_id Studio ID
cluster_id Cloud account ID
path Path to delete

Multi-Part Upload (Large Files)

For files > 5 GB, use multi-part upload:

Step 1: Start multi-part upload

POST /v1/projects/{projectId}/storage

With multipart: true in the body.

Step 2: Upload each part

POST /v1/projects/{projectId}/storage/uploads/{uploadId}

Step 3: Complete multi-part upload

POST /v1/projects/{projectId}/storage/complete


Folder Index

Get Folder Index

GET /v1/projects/{projectId}/cloudspaces/{id}/folder-index

Returns a file tree for the Studio’s working directory.

Response:

{
  "files": [
    {
      "path": "train.py",
      "size": 2048,
      "modified_at": "2024-01-15T10:00:00Z"
    }
  ]
}

Refresh Folder Index

POST /v1/projects/{projectId}/cloudspaces/{id}/index

Forces a re-scan of the Studio’s file system.


Artifact Pages

GET /v1/projects/{projectId}/cloudspaces/artifacts/{id}/page

Returns paginated artifacts for a Studio.

GET /v1/projects/{projectId}/storage/uploads/artifacts/page

Returns paginated upload artifacts.


Teamspace Storage (Drive)

Upload File to Teamspace Drive

POST /v1/projects/temporary_storage

Uploads a file to teamspace-shared storage (accessible by all Studios in the project).

POST /v1/projects/temporary_storage/uploads/{uploadId}

Multi-part upload parts for teamspace storage.

POST /v1/projects/temporary_storage/complete

Complete multi-part upload for teamspace storage.


Storage Transfers

Move or copy data between storage locations.

Base path: /v1/projects/{projectId}/storage-transfers

Create Transfer

POST /v1/projects/{projectId}/storage-transfers

Request body:

{
  "source": {
    "path": "/source/path",
    "cloudspace_id": "source-studio-id"
  },
  "destination": {
    "path": "/dest/path",
    "cloudspace_id": "dest-studio-id"
  }
}

List Transfers

GET /v1/projects/{projectId}/storage-transfers

Get Transfer

GET /v1/projects/{projectId}/storage-transfers/{id}

Pause Transfer

POST /v1/projects/{projectId}/storage-transfers/{id}/pause

Resume Transfer

POST /v1/projects/{projectId}/storage-transfers/{id}/resume

Abort Transfer

POST /v1/projects/{projectId}/storage-transfers/{id}/abort

Validate Transfer

POST /v1/projects/{projectId}/storage-transfers/validate


Datasets (Lit Datasets)

Lightning AI has a dataset versioning system for managing ML training data.

Base path: /v1/projects/{projectId}/lit-datasets

Create Dataset

POST /v1/projects/{projectId}/lit-datasets

List Datasets

GET /v1/projects/{projectId}/lit-datasets

Get Dataset by Name

GET /v1/projects/{projectOwnerName}/{projectName}/lit-datasets/{datasetName}

Get Dataset

GET /v1/projects/{projectId}/lit-datasets/{datasetId}/versions/{version}

Delete Dataset

DELETE /v1/projects/{projectId}/lit-datasets/{datasetId}

Update Dataset

PUT /v1/projects/{projectId}/lit-datasets/{datasetId}

Set Dataset Visibility

PUT /v1/projects/{projectId}/lit-datasets/{datasetId}/visibility

Dataset Versions

Create version: POST /v1/projects/{projectId}/lit-datasets/{datasetId}/versions

List versions: GET /v1/projects/{projectId}/lit-datasets/{datasetId}/versions

Get version files: GET /v1/projects/{projectId}/lit-datasets/{datasetId}/versions/{version}/files

Set default version: PUT /v1/projects/{projectId}/lit-datasets/{datasetId}/versions/{version}/default

Delete version: DELETE /v1/projects/{projectId}/lit-datasets/{datasetId}/versions/{version}

Dataset Upload (Multi-part)

Start upload: POST /v1/projects/{projectId}/lit-datasets/{datasetId}/versions/{version}/uploads

Upload parts: POST /v1/projects/{projectId}/lit-datasets/{datasetId}/versions/{version}/uploads/{uploadId}/parts

Complete upload: POST /v1/projects/{projectId}/lit-datasets/{datasetId}/versions/{version}/uploads/{uploadId}/complete

Complete version: POST /v1/projects/{projectId}/lit-datasets/{datasetId}/versions/{version}/complete


Models Store

Store and version ML models.

Base path: /v1/projects/{projectId}/models

Create Model

POST /v1/projects/{projectId}/models

List Models

GET /v1/projects/{projectId}/models

GET /v1/models — List all public models

Get Model

GET /v1/projects/{projectId}/models/{modelId}

Get Model by Name

GET /v1/projects/{projectOwnerName}/{projectName}/models/{modelName}

Delete Model

DELETE /v1/projects/{projectId}/models/{modelId}

Update Model

PUT /v1/projects/{projectId}/models/{modelId}

Set Model Visibility

PUT /v1/projects/{projectId}/models/{modelId}/visibility

Model Versions

Create version: POST /v1/projects/{projectId}/models/{modelId}/versions

List versions: GET /v1/projects/{projectId}/models/{modelId}/versions

Get version: GET /v1/projects/{projectId}/models/{modelId}/versions/{version}

Get version file: GET /v1/projects/{projectId}/models/{modelId}/versions/{version}/file

Get version files: GET /v1/projects/{projectId}/models/{modelId}/versions/{version}/files

Set default version: PUT /v1/projects/{projectId}/models/{modelId}/versions/{version}/default

Delete version: DELETE /v1/projects/{projectId}/models/{modelId}/versions/{version}

Model Upload (Multi-part)

Start upload: POST /v1/projects/{projectId}/models/{modelId}/versions/{version}/uploads

Upload parts: POST /v1/projects/{projectId}/models/{modelId}/versions/{version}/uploads/{uploadId}/parts

Complete upload: POST /v1/projects/{projectId}/models/{modelId}/versions/{version}/uploads/{uploadId}/complete

Complete version: POST /v1/projects/{projectId}/models/{modelId}/versions/{version}/complete


Secrets

Secrets are encrypted key-value pairs injected as environment variables into Studios and Jobs.

Base paths:

Create Secret (Project)

POST /v1/projects/{projectId}/secrets

Request body:

{
  "name": "MY_SECRET",
  "value": "super-secret-value"
}

List Secrets (Project)

GET /v1/projects/{projectId}/secrets

Returns secret names (not values).

Get Secret

GET /v1/projects/{projectId}/secrets/{id}

Update Secret

PUT /v1/projects/{projectId}/secrets/{id}

Delete Secret

DELETE /v1/projects/{projectId}/secrets/{id}

User-Scoped Secrets

Create: POST /v1/secrets List: GET /v1/secrets Get: GET /v1/secrets/{id} Update: PUT /v1/secrets/{id} Delete: DELETE /v1/secrets/{id}


Data Connections

Data Connections link external data sources (S3, GCS, etc.) to your Teamspace.

Base path: /v1/projects/{projectId}/data-connections

Create Data Connection

POST /v1/projects/{projectId}/data-connections

List Data Connections

GET /v1/projects/{projectId}/data-connections

Get Data Connection

GET /v1/projects/{projectId}/data-connections/{id}

Delete Data Connection

DELETE /v1/projects/{projectId}/data-connections/{id}

Update Data Connection

PUT /v1/projects/{projectId}/data-connections/{id}

Get Folder Index

GET /v1/projects/{projectId}/data-connections/{id}/folder-index

Get Temp Credentials

GET /v1/projects/{projectId}/data-connections/{id}/temp-bucket-credentials

Returns temporary cloud provider credentials for direct access.

Validate Data Connection

POST /v1/projects/{projectId}/data-connections/valid

Setup Data Connection

POST /v1/projects/{projectId}/data-connections/setup

Re-index Data Connection

POST /v1/projects/{projectId}/data-connections/{id}/index


File System View

The file system service provides a unified view of all storage types:

GET /v1/filesystem/{projectId}/cloudspaces/{currentId} — Studio files GET /v1/filesystem/{projectId}/datasets/{currentId} — Dataset files GET /v1/filesystem/{projectId}/jobs/{currentId} — Job artifacts GET /v1/filesystem/{projectId}/mmts/{currentId} — MMT artifacts GET /v1/filesystem/{projectId}/volumes — Volumes PUT /v1/filesystem/{projectId}/volumes — Update volumes


Python SDK Upload Example

from lightning_sdk import Studio

studio = Studio(
    name="my-studio",
    teamspace="my-team",
    org="my-org",
)

# Make sure studio is running
studio.start()

# Upload a single file
studio.upload_file("local_script.py", remote_path="scripts/train.py")

# Upload an entire folder
studio.upload_folder("./my_project", remote_path="my_project")

# Download a file
studio.download_file("outputs/model.pt", file_path="./model.pt")

# Download a folder
studio.download_folder("outputs/", target_path="./outputs")

# Run a command after uploading
output = studio.run("python scripts/train.py")
print(output)