Sandbox services now shareable via quick or named tunnels
Sandboxes can expose a service running inside the container on a public preview URL through the sandbox.tunnels namespace. The SDK uses cloudflared inside the sandbox so you can share a running service without configuring exposePort() or a custom domain.
By default, sandbox.tunnels.get(port) creates a quick tunnel on a zero-config *.trycloudflare.com URL — no Cloudflare account, DNS record, or custom domain required. This is perfect for quick development and for .workers.dev deployments.
-
JavaScript
<div><div><span>import </span><span>{</span><span><span> </span><span>getSandbox</span><span> </span></span><span>}</span><span> from </span><span>"@cloudflare/sandbox"</span><span>;</span></div></div><div><div> </div></div><div><div><span>const</span><span> </span><span>sandbox</span><span> </span><span>=</span><span> </span><span>getSandbox</span><span>(</span><span>env</span><span>.</span><span>Sandbox</span><span>,</span><span> </span><span>"my-sandbox"</span><span>)</span><span>;</span></div></div><div><div><span>await</span><span> </span><span>sandbox</span><span>.</span><span>startProcess</span><span>(</span><span>"python -m http.server 8080"</span><span>)</span><span>;</span></div></div><div><div> </div></div><div><div><span>const</span><span> </span><span>tunnel</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>sandbox</span><span>.</span><span>tunnels</span><span>.</span><span>get</span><span>(</span><span>8080</span><span>)</span><span>;</span></div></div><div><div><span>console</span><span>.</span><span>log</span><span>(</span><span>tunnel</span><span>.</span><span>url</span><span>)</span><span>;</span><span> </span><span>// → https://random-words-here.trycloudflare.com</span></div></div> -
TypeScript
<div><div><span>import </span><span>{</span><span><span> </span><span>getSandbox</span><span> </span></span><span>}</span><span> from </span><span>"@cloudflare/sandbox"</span><span>;</span></div></div><div><div> </div></div><div><div><span>const</span><span> </span><span>sandbox</span><span> </span><span>=</span><span> </span><span>getSandbox</span><span>(</span><span>env</span><span>.</span><span>Sandbox</span><span>,</span><span> </span><span>"my-sandbox"</span><span>)</span><span>;</span></div></div><div><div><span>await</span><span> </span><span>sandbox</span><span>.</span><span>startProcess</span><span>(</span><span>"python -m http.server 8080"</span><span>)</span><span>;</span></div></div><div><div> </div></div><div><div><span>const</span><span> </span><span>tunnel</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>sandbox</span><span>.</span><span>tunnels</span><span>.</span><span>get</span><span>(</span><span>8080</span><span>)</span><span>;</span></div></div><div><div><span>console</span><span>.</span><span>log</span><span>(</span><span>tunnel</span><span>.</span><span>url</span><span>)</span><span>;</span><span> </span><span>// → https://random-words-here.trycloudflare.com</span></div></div>
Named tunnels
For more control you can create a named tunnel through sandbox.tunnels.get(port, { name }). A named tunnel binds a hostname (<name>.<your-zone>) backed by a Cloudflare Tunnel and a CNAME record on your zone resulting in something like https://my-app-preview.example.com.
Unlike quick tunnels, which generate a new random URL each time, a named tunnel produces a persistent URL that survives container restarts. This makes named tunnels suitable for production use cases where you want control over the tunnel and it's origin.
-
JavaScript
<div><div><span>const</span><span> </span><span>tunnel</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>sandbox</span><span>.</span><span>tunnels</span><span>.</span><span>get</span><span>(</span><span>8080</span><span>,</span><span> </span><span>{</span><span> name</span><span>:</span><span> </span><span>"my-app-preview"</span><span> </span><span>}</span><span>)</span><span>;</span></div></div><div><div><span>console</span><span>.</span><span>log</span><span>(</span><span>tunnel</span><span>.</span><span>url</span><span>)</span><span>;</span><span> </span><span>// → https://my-app-preview.example.com</span></div></div> -
TypeScript
<div><div><span>const</span><span> </span><span>tunnel</span><span> </span><span>=</span><span> </span><span>await</span><span> </span><span>sandbox</span><span>.</span><span>tunnels</span><span>.</span><span>get</span><span>(</span><span>8080</span><span>,</span><span> </span><span>{</span><span> name</span><span>:</span><span> </span><span>"my-app-preview"</span><span> </span><span>}</span><span>)</span><span>;</span></div></div><div><div><span>console</span><span>.</span><span>log</span><span>(</span><span>tunnel</span><span>.</span><span>url</span><span>)</span><span>;</span><span> </span><span>// → https://my-app-preview.example.com</span></div></div>
Calling sandbox.destroy() tears down the Cloudflare Tunnel and the associated DNS record alongside the container, so you do not leave dangling tunnels or records behind.
Upgrade
To update to the latest version:
<span>npm</span><span> i @cloudflare/sandbox@latest</span>
<span>yarn</span><span> add @cloudflare/sandbox@latest</span>
<span>pnpm</span><span> add @cloudflare/sandbox@latest</span>
<span>bun</span><span> add @cloudflare/sandbox@latest</span>
For full API details, refer to the Sandbox tunnels reference.
Fetched June 1, 2026



