# Download Files from Novita Sandbox | Agent Sandbox Docs

> Learn how to download files from Novita Sandbox and manage outputs from AI agent sandbox sessions.

> For the complete documentation index, see [llms.txt](/llms.txt). Markdown is available with `Accept: text/markdown` and `.md` URL variants.

Source: /docs/guides/sandbox-filesystem-download

# Download data from sandbox

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

JavaScript & TypeScript

Python

```
import fs from 'fs'
import { Sandbox } from 'novita-sandbox/code-interpreter'

const sandbox = await Sandbox.create()

// Create a file in the sandbox for testing
const filePathInSandbox = '/tmp/test-file'
await sandbox.files.write(filePathInSandbox, "test-file-content")

// Read file from sandbox
const content = await sandbox.files.read(filePathInSandbox)

// Write file to local filesystem
const localFilePath = './local-test-file'
fs.writeFileSync(localFilePath, content)

await sandbox.kill()
```

```
from novita_sandbox.code_interpreter import Sandbox

sandbox = Sandbox.create()

# Create a file in the sandbox for testing
file_path_in_sandbox = '/tmp/test-file'
sandbox.files.write(file_path_in_sandbox, "test-file-content")

# Read file from sandbox
content = sandbox.files.read(file_path_in_sandbox)

# Write file to local filesystem
local_file_path = './local-test-file'
with open(local_file_path, 'w') as file:
file.write(content)

sandbox.kill()
```

##

[​](#download-with-pre-signed-url)

Download with pre-signed URL

Pre-signed download URLs allow users to download files securely from environments that do not hold Novita SDK credentials, such as web browsers.
Create the sandbox with the `secure: true` option, then use the SDK on your trusted backend to generate the download URL. Return it only to users authorized by your application, and set a short expiration time. The URL acts as a temporary bearer credential until it expires.

JavaScript & TypeScript

Python

```
import fs from 'fs'
import { Sandbox } from 'novita-sandbox/code-interpreter'

const sandbox = await Sandbox.create({ secure: true })

// Create a test file in the sandbox (requires SDK authentication)
const filePathInSandbox = '/tmp/test-file'
await sandbox.files.write(filePathInSandbox, 'test-file-content')

// Generate pre signed download URL (valid for 120 seconds, optional)
const publicDownloadUrl = await sandbox.downloadUrl(filePathInSandbox, {
useSignatureExpiration: 120, // optional, in seconds
})

// Simulate "browser/unauthorized environment": without API key, directly GET download
const res = await fetch(publicDownloadUrl)
if (!res.ok) {
throw new Error(`Download failed: ${res.status} ${await res.text()}`)
}
const content = await res.text()

// Write to local file
const localFilePath = './local-test-file'
fs.writeFileSync(localFilePath, content)
console.log(content)

await sandbox.kill()
```

```
from pathlib import Path

import requests
from novita_sandbox.code_interpreter import Sandbox

sandbox = Sandbox.create(secure=True)

# Create a test file in the sandbox (requires SDK authentication)
file_path_in_sandbox = '/tmp/test-file'
sandbox.files.write(file_path_in_sandbox, 'test-file-content')

# Generate pre signed download URL (valid for 120 seconds, optional)
signed_url = sandbox.download_url(
path=file_path_in_sandbox,
use_signature_expiration=120 # optional, in seconds
)

# Simulate "browser/unauthorized environment": without API key, directly GET download
response = requests.get(signed_url, timeout=60)
response.raise_for_status()
content = response.text

# Write to local file
local_file_path = Path('./local-test-file')
local_file_path.write_text(content)
print(content)

sandbox.kill()
```

Last modified on June 24, 2026
