DaytonaDocs

Object Stores

Object store CRUD and runtime mounts.

An object store is a named reference to your own S3-compatible bucket that sandboxes can mount at an arbitrary path. Credentials are referenced by secret name — create the secrets first; their values are never stored on the object-store record or returned by any endpoint. See the Object Stores guide.

POST /object-stores

Create an object-store reference. It is ready immediately.

Request

FieldTypeRequired / defaultDescription
namestringrequired1–128 chars of [A-Za-z0-9._-], unique per project.
bucketstringrequiredBucket name.
access_key_secretstringrequiredName of the project secret holding the S3 access key id.
secret_key_secretstringrequiredName of the project secret holding the S3 secret access key.
session_token_secretstringnoneName of the project secret holding an STS session token.
endpointstring""S3 endpoint URL (http(s)://...). Empty for AWS.
regionstring""S3 region.
prefixstring""Key prefix to mount (leading/trailing / trimmed).
path_styleboolfalseUse path-style addressing (MinIO and similar).
read_onlyboolfalseDefault read-only for attachments.
providerstring""Provider hint: AWS, Minio, Ceph, Cloudflare, Other, or empty.
dir_cache_secsint0Directory-listing cache TTL (0–86400 s); 0 uses the built-in default.
cURL
curl -X POST https://api.rl.trydaytona.com/object-stores \
  -H "Authorization: Bearer $RLP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "artifacts",
    "bucket": "my-artifacts",
    "provider": "Cloudflare",
    "endpoint": "https://abc123.r2.cloudflarestorage.com",
    "access_key_secret": "R2_ACCESS_KEY",
    "secret_key_secret": "R2_SECRET_KEY"
  }'
{
  "id": "e7a20c94-1f5b-4d38-8c62-0b9d47e1a3f5",
  "name": "artifacts",
  "endpoint": "https://abc123.r2.cloudflarestorage.com",
  "region": "",
  "bucket": "my-artifacts",
  "prefix": "",
  "path_style": false,
  "read_only": false,
  "provider": "Cloudflare",
  "dir_cache_secs": 0,
  "access_key_secret": "R2_ACCESS_KEY",
  "secret_key_secret": "R2_SECRET_KEY",
  "state": "ready",
  "created_at": "2026-07-31T10:15:00Z",
  "updated_at": "2026-07-31T10:15:00Z"
}

Errors

  • 400 — invalid name, missing bucket, unknown provider, non-http(s) endpoint, missing credential secret names, unknown secret name(s), or dir_cache_secs out of range.
  • 409 — an object store with this name already exists.

GET /object-stores

List the project's object stores, newest first. ?include_deleted=true also returns retired ones. Response: { "object_stores": [ ... ] } with items shaped like the create response.

cURL
curl https://api.rl.trydaytona.com/object-stores \
  -H "Authorization: Bearer $RLP_API_KEY"

GET /object-stores/:id_or_name

Fetch one object store by UUID or name.

cURL
curl https://api.rl.trydaytona.com/object-stores/artifacts \
  -H "Authorization: Bearer $RLP_API_KEY"

Errors

  • 400 — ambiguous ref (matches one store's id and another's name).
  • 404 — no matching object store.

DELETE /object-stores/:id_or_name

Retire an object store. Refused while any live sandbox has it mounted. The name is immediately reusable.

cURL
curl -X DELETE https://api.rl.trydaytona.com/object-stores/artifacts \
  -H "Authorization: Bearer $RLP_API_KEY"
{ "id": "e7a20c94-1f5b-4d38-8c62-0b9d47e1a3f5", "state": "deleted" }

Errors

  • 404 — no matching object store (or already deleted).
  • 409 — mounted by a sandbox; unmount or stop it first.

Runtime mounts

Mounts can be declared at create time (the object_store_mounts array on POST /vms) or attached/detached on a running sandbox. Mount paths follow the same rules as volumes: absolute, no .., no reserved paths, no duplicates, max 8 per sandbox. See Mounting Object Stores.

POST /vms/:id/object-store-mounts

Mount an object store on a running sandbox.

FieldTypeRequired / defaultDescription
object_storestringrequiredObject store id or name (must be ready).
mount_pathstringrequiredAbsolute path inside the sandbox.
read_onlyboolstore defaultOverride the store's default read-only for this mount.
cURL
curl -X POST https://api.rl.trydaytona.com/vms/us1-3kTMbBWbdML5UWJHfyPyhF/object-store-mounts \
  -H "Authorization: Bearer $RLP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "object_store": "artifacts", "mount_path": "/mnt/artifacts" }'
{ "mounted": "/mnt/artifacts" }
  • 404 — unknown sandbox or object store.
  • 409 — sandbox not running; mount_path already mounted; store not ready; or the sandbox rejected the mount.

GET /vms/:id/object-store-mounts

The sandbox's current mount list.

{
  "object_store_mounts": [
    {
      "object_store_id": "e7a20c94-1f5b-4d38-8c62-0b9d47e1a3f5",
      "name": "artifacts",
      "mount_path": "/mnt/artifacts",
      "read_only": false
    }
  ]
}

DELETE /vms/:id/object-store-mounts/:name

Unmount by store name on a running sandbox.

cURL
curl -X DELETE https://api.rl.trydaytona.com/vms/us1-3kTMbBWbdML5UWJHfyPyhF/object-store-mounts/artifacts \
  -H "Authorization: Bearer $RLP_API_KEY"
{ "unmounted": "artifacts" }
  • 404 — unknown sandbox.
  • 409 — sandbox not running, or the sandbox rejected the unmount.

On this page