> ## Documentation Index
> Fetch the complete documentation index at: https://docs.novita.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Download

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

```js JavaScript & TypeScript icon="js" theme={"system"}
import fs from 'fs'
import { Novita } from 'novita-sandbox'

const novita = new Novita()
const sandbox = await novita.codeInterpreter.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()
```

```python Python icon="python" theme={"system"}
from novita_sandbox import Novita

novita = Novita()
sandbox = novita.code_interpreter.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

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.

```js JavaScript & TypeScript icon="js" theme={"system"}
import fs from 'fs'
import { Novita } from 'novita-sandbox'

const novita = new Novita()
const sandbox = await novita.codeInterpreter.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()
```

```python Python icon="python" theme={"system"}
from pathlib import Path

import requests
from novita_sandbox import Novita

novita = Novita()
sandbox = novita.code_interpreter.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()
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.