- Web-service projects, use volumes for SQLite, file uploads, self-hosted-tool data dirs, anything you need to survive a redeploy. The dashboard’s Persistent disk toggle is the same thing under the hood: it provisions a
webvolume and attaches it for you. - Sandboxes, use volumes to keep a workspace directory alive across pause/resume and across whole sandbox tear-downs. See Sandboxes.
When to use a volume
Reach for a volume when:- You want files to survive a redeploy, a sandbox destroy, or a pause/resume cycle.
- You want to swap workloads in front of the same data (destroy one sandbox, attach the same volume to a fresh one).
- You don’t want the workload’s lifecycle to also be the data’s lifecycle.
- The work is throwaway and ephemeral disk is enough.
- You need a managed database with backups, point-in-time recovery, and engine-level tooling. Use managed databases instead.
Volume types
Pick the type at creation. It can’t be changed later.| Type | For | Notes |
|---|---|---|
web | Web-service projects | The default. Shows up in the Persistent disk attach picker on a project’s Configuration tab. |
sandbox | Sandboxes | Shows up in the sandbox-create flow’s volumeId selector. |
Create a volume
From the API:- Name is lowercase letters, digits, and hyphens, 1 to 40 chars. Unique per user; two volumes can’t share a name in your account.
- Size is 10 to 50 GB at the platform level; your plan may cap it lower.
- Region is permanently pinned at creation. Volumes can only attach to sandboxes or projects in the same region.
- Type defaults to
webif omitted. Picksandboxif you’ll use it from a sandbox.
Image needed: Create-volume modal in the dashboard, showing the name input, size dropdown, region selector, and type radio (Web / Sandbox).
Attach a volume
A volume attaches to one sandbox OR one project at a time. There’s no concurrent multi-attach; if you need the same volume from a second workload, detach it from the first.To a sandbox
PassvolumeId when creating the sandbox:
To a web-service project
From the dashboard: open the project’s Configuration tab, scroll to Persistent disk, and pick an existing volume from the dropdown (or toggle on a new one, which provisions a freshweb volume implicitly). The volume mounts at the mount path you set.
The toggle and the API path produce the same underlying volume; pick whichever fits the flow.
Detach a volume
There’s no explicit “detach” endpoint. Detaching happens as a side effect of removing the volume from its current workload:- Sandbox, destroy the sandbox. The volume is detached, not deleted.
- Project, toggle Persistent disk off in the project’s Configuration tab, or swap to a different volume.
List, get, delete
Lifecycle
Limitations
- Single-attach. One volume, one workload at a time. No concurrent reads from multiple sandboxes or projects.
- Region-pinned. A volume created in
fra1only attaches to workloads infra1. To work in another region, copy the data to a new volume in that region. - Type is fixed. A
webvolume can’t be attached to a sandbox, and vice versa. - Size is fixed once created. Resize isn’t supported today; create a larger volume and copy the data.
- Networked-storage shape. Reads and writes go over the storage backplane, not a local SSD. Throughput and latency are higher than ephemeral disk; fine for most workloads, slower for write-heavy databases. Use managed databases for those.
Pricing and plan caps
Volumes meter by GB-month at the same rate as the rest of persistent storage. The exact monthly cost for each size is shown in the dashboard when you create a volume. Each plan caps:- The maximum volume size you can create. Above-cap requests return
403with “Your plan allows volumes up to NN GB. Reduce size or upgrade.” - The maximum number of volumes per account. Above-cap creates return
403with “Your plan allows up to N volumes. Delete an existing one or upgrade.”
Next steps
- Persistent disk, the project-side toggle that uses a
webvolume under the hood. - Sandboxes, the sandbox flow that consumes
sandboxvolumes. - Sandbox API tab, the full REST contract for volume endpoints (
/volumesand/volumes/{volumeId}).