---
title: Python SDK Reference
description: Interact with Daytona Sandboxes using the Python SDK
---
The Daytona Python SDK provides two root clients for interacting with Daytona Sandboxes:
- `Daytona`: synchronous client; each call blocks until it completes
- `AsyncDaytona`: asynchronous client with the same methods; methods are coroutines and must be awaited
Every operation goes through a version namespace: `daytona.v2` for the Daytona v2 API, or `daytona.v0` for the Daytona v0 API. The root client is the only way to build a namespace client. Resource types such as `Sandbox` and `ImageBuilder` are imported from `daytona.v2`.
## Installation
Install the Daytona Python SDK using pip. The SDK requires Python 3.10 or later.
```bash
pip install daytona
```
Install the extras for OpenTelemetry request spans or the `daytona.v0` namespace:
```bash
pip install 'daytona[otel]'
pip install 'daytona[v0-sdk]'
```
## Getting Started
### Create a Sandbox
Create a Daytona Sandbox to run your code securely in an isolated environment. The following snippet is an example "Hello World" program that runs securely inside a Daytona Sandbox.
```python
from daytona import Daytona
def main():
# Initialize the SDK (reads DAYTONA_API_KEY from the environment)
with Daytona() as daytona:
# Create a new sandbox
sandbox = daytona.v2.create(wait_seconds=60)
# Execute a command
result = sandbox.exec("echo 'Hello, World!'")
print(result.output)
daytona.v2.delete(sandbox)
if __name__ == "__main__":
main()
```
```python
import asyncio
from daytona import AsyncDaytona
async def main():
# Initialize the SDK (reads DAYTONA_API_KEY from the environment)
async with AsyncDaytona() as daytona:
# Create a new sandbox
sandbox = await daytona.v2.create(wait_seconds=60)
# Execute a command
result = await sandbox.exec("echo 'Hello, World!'")
print(result.output)
await daytona.v2.delete(sandbox)
if __name__ == "__main__":
asyncio.run(main())
```
`with Daytona(...)` and `async with AsyncDaytona(...)` release the client's connections when the block ends. Close the root client, not `daytona.v2` directly: a namespace client closed on its own stays cached and fails on later calls.
## Configuration
The Daytona SDK can be configured using environment variables or by passing a `DaytonaConfig` to the constructor. Fields left unset are read from the environment. Configure exactly one credential: `api_key`, or `jwt_token` scoped with `project_id` for `daytona.v2` or `organization_id` for `daytona.v0`.
- `api_key`: a project API key; falls back to `DAYTONA_API_KEY`
- `jwt_token`: a signed-in user's JWT, exchanged for a short-lived project-scoped token; falls back to `DAYTONA_JWT_TOKEN`
- `project_id`: scopes `jwt_token` to a project for `daytona.v2`; falls back to `DAYTONA_PROJECT_ID`
- `organization_id`: scopes `jwt_token` to an organization for `daytona.v0`; falls back to `DAYTONA_ORGANIZATION_ID`
- `request_timeout`: per-request HTTP timeout in seconds for `daytona.v2`
- `connection_pool_maxsize`: maximum number of live and keep-alive HTTP connections
- `otel_enabled`: emits client spans when `daytona[otel]` is installed; falls back to `DAYTONA_OTEL_ENABLED`
`DaytonaConfig` has no API URL or region field, and passing `api_url` or `toolbox_url` raises a `TypeError`. Pass `region=` to each `daytona.v2` create. `DAYTONA_V2_API_URL`, else `DAYTONA_API_URL`, overrides the `daytona.v2` API endpoint; `daytona.v0` ignores both. The `target` field is deprecated and applies only to `daytona.v0`.
```python
from daytona import Daytona, DaytonaConfig
# Using environment variables (DAYTONA_API_KEY)
with Daytona() as daytona:
sandbox = daytona.v2.create()
# Using explicit configuration
config = DaytonaConfig(
api_key="YOUR_API_KEY",
request_timeout=30,
)
with Daytona(config) as daytona:
sandbox = daytona.v2.create(region="us")
```
```python
import asyncio
from daytona import AsyncDaytona, DaytonaConfig
async def main():
# Using environment variables (DAYTONA_API_KEY)
async with AsyncDaytona() as daytona:
sandbox = await daytona.v2.create()
# Using explicit configuration
config = DaytonaConfig(
api_key="YOUR_API_KEY",
request_timeout=30,
)
async with AsyncDaytona(config) as daytona:
sandbox = await daytona.v2.create(region="us")
if __name__ == "__main__":
asyncio.run(main())
```
For more information on configuring the Daytona SDK, see [authentication](/docs/v2/authentication). See the [`DaytonaConfig` reference](/docs/v2/python-sdk/daytona#daytonaconfig) for details.