> ## Documentation Index
> Fetch the complete documentation index at: https://e2b.manicule.dev/llms.txt
> Use this file to discover all available pages before exploring further.
> For every page in one file, fetch https://e2b.manicule.dev/llms-full.txt (large).
> To search and read these docs as tools, connect the MCP server at https://e2b.manicule.dev/api/mcp.
> Every agent surface: https://e2b.manicule.dev/.well-known/llms-manifest.json

# Download data from sandbox (/docs/filesystem/download)

<!-- agent-signals: reading_time_min: 2 · est_tokens: 554 · updated: 2026-07-30 -->
Related: [Get information about a file or directory](/docs/filesystem/info.md), [Attach custom metadata to files](/docs/filesystem/metadata.md), [Read & write files](/docs/filesystem/read-write.md), [Upload data to sandbox](/docs/filesystem/upload.md), [Watch sandbox directory for changes](/docs/filesystem/watch.md), [SSH access](/docs/sandbox/ssh-access.md)

You can download data from the sandbox using the `files.read()` method.

<CodeGroup>
```js title="JavaScript & TypeScript"
import fs from 'fs'
import { Sandbox } from 'e2b'

const sandbox = await Sandbox.create()

// Read file from sandbox
const content = await sandbox.files.read('/path/in/sandbox')
// Write file to local filesystem
fs.writeFileSync('/local/path', content)
```

```python title="Python"
from e2b import Sandbox

sandbox = Sandbox.create()

# Read file from sandbox
content = sandbox.files.read('/path/in/sandbox')
# Write file to local filesystem
with open('/local/path', 'w') as file:
  file.write(content)
```
</CodeGroup>

## Download with pre-signed URL

Sometimes, you may want to let users from unauthorized environments, like a browser, download files from the sandbox.
For this use case, you can use pre-signed URLs to let users download files securely.

All you need to do is create a sandbox with the `secure: true` option. A download URL will then be generated with a signature that allows only authorized users to access files.
You can optionally set an expiration time for the URL so that it will be valid only for a limited time.

<CodeGroup>
```js title="JavaScript & TypeScript"
import fs from 'fs'
import { Sandbox } from 'e2b'

// Start a secured sandbox (all operations must be authorized by default)
const sandbox = await Sandbox.create(template, { secure: true })

// Create a pre-signed URL for file download with a 10 second expiration
const publicUrl = await sandbox.downloadUrl(
  'demo.txt', {
    useSignatureExpiration: 10_000, // optional
  },
)

// Download a file with a pre-signed URL (this can be used in any environment, such as a browser)
const res = await fetch(publicUrl)
const content = await res.text()
```

```python title="Python"
from e2b import Sandbox

# Start a secured sandbox (all operations must be authorized by default)
sandbox = Sandbox.create(timeout=12_000, secure=True)

# Create a pre-signed URL for file download with a 10 second expiration
# The user only has to visit the URL to download the file, this also works in a browser.
signed_url = sbx.download_url(path="demo.txt", user="user", use_signature_expiration=10_000)
```
</CodeGroup>
