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

# Download data from sandbox

export const SandboxConfigHint = () => {
  if (typeof document === "undefined") {
    return null;
  } else {
    return <Note>Before running the example code in this document, please ensure you have properly configured environment variables. For details, please refer to <a href="/guides/sandbox-your-first-agent-sandbox#configure-environment-variables">Configure Environment Variables</a>.</Note>;
  }
};

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

<SandboxConfigHint />

<CodeGroup>
  ```js JavaScript & TypeScript icon="js" theme={"system"}
  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()
  ```

  ```python Python icon="python" theme={"system"}
  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()
  ```
</CodeGroup>

## 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.

<CodeGroup>
  ```js JavaScript & TypeScript icon="js" theme={"system"}
  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()
  ```

  ```python Python icon="python" theme={"system"}
  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()
  ```
</CodeGroup>
