Authentication
Daytona authenticates SDK, CLI, and API requests with a project API key. The key identifies the project that owns the sandboxes you create and carries the permissions a request may use.
Get an API key
Section titled “Get an API key”- Go to Daytona Dashboard ↗
- Click
- Enter
- Select permission
- Click
- Copy and save the API key as an environment variable
Environment variables
Section titled “Environment variables”Daytona resolves configuration in order of precedence:
- Configuration in code
- Environment variables
| Variable | Description |
|---|---|
DAYTONA_API_KEY | Your Daytona API key. Required unless DAYTONA_JWT_TOKEN is set |
DAYTONA_JWT_TOKEN | A JWT instead of an API key. Optional; needs DAYTONA_PROJECT_ID |
DAYTONA_PROJECT_ID | The project a JWT is scoped to. Required with DAYTONA_JWT_TOKEN |
DAYTONA_API_KEY=YOUR_API_KEYexport DAYTONA_API_KEY=YOUR_API_KEY$env:DAYTONA_API_KEY="YOUR_API_KEY"Authenticate the SDK
Section titled “Authenticate the SDK”Construct the client without arguments to read the environment variables, or pass the configuration in code. Every call made through the client sends the API key or, with a JWT, a short-lived project token the client exchanges the JWT for.
from daytona import Daytona, DaytonaConfig
# Using environment variablesdaytona = Daytona()
# Using explicit configurationconfig = DaytonaConfig(api_key="YOUR_API_KEY")
daytona = Daytona(config)
# Pick the region per createsandbox = daytona.v2.create(region="us")Each DaytonaConfig field falls back to its environment variable independently. The client has no API URL or region field: every create takes a region, and the API picks the project, organization, or platform default when it is omitted.
| Parameter | Type | Description |
|---|---|---|
api_key | str | Falls back to DAYTONA_API_KEY. When neither this nor jwt_token is set, the client constructor raises UnauthorizedError. |
jwt_token | str | A JWT instead of an API key. Falls back to DAYTONA_JWT_TOKEN. Needs project_id; setting both api_key and jwt_token raises BadRequestError. |
project_id | str | The project a JWT is scoped to. Falls back to DAYTONA_PROJECT_ID. |
request_timeout | float | Per-request HTTP timeout in seconds. 0 disables the timeout. |
import { Daytona } from '@daytona/sdk'
// Using environment variablesconst daytona = new Daytona()
// Using explicit configurationconst daytonaWithConfig = new Daytona({ apiKey: 'YOUR_API_KEY' })
// Pick the region per createconst sandbox = await daytonaWithConfig.v2.create({ region: 'us' })Each DaytonaConfig field falls back to its environment variable independently. The client has no API URL or region field: every create takes a region, and the API picks the project, organization, or platform default when it is omitted.
| Parameter | Type | Description |
|---|---|---|
apiKey | string | Falls back to DAYTONA_API_KEY. When neither this nor jwtToken is set, the constructor throws DaytonaAuthenticationError. |
jwtToken | string | A JWT instead of an API key. Falls back to DAYTONA_JWT_TOKEN. Needs projectId; setting both apiKey and jwtToken throws DaytonaValidationError. |
projectId | string | The project a JWT is scoped to. Falls back to DAYTONA_PROJECT_ID. |
requestTimeout | number | Per-request HTTP timeout in milliseconds. 0 disables the timeout. |
Authenticate the CLI
Section titled “Authenticate the CLI”Sign in once and the CLI saves the session in its active profile, so following commands need no key or flags. After a browser or device login, the CLI selects your personal organization and its default project the first time and remembers your last selection afterwards; sandbox commands then mint a short-lived project API key on your behalf, which expires with the session.
# Browser logindaytona login --api-url https://api.daytona.com
# Device-code login on a host without a browserdaytona login --device --api-url https://api.daytona.com
# Store an API key in the active profiledaytona login --token YOUR_API_KEY --api-url https://api.daytona.com
# Confirm who you are and what is selecteddaytona whoami
# Create a sandbox with the saved sessiondaytona sandbox create
# Remove the saved session from this machinedaytona logout# Using environment variables (DAYTONA_API_KEY, DAYTONA_API_URL)daytona sandbox create
# Using explicit flagsdaytona sandbox create --api-key YOUR_API_KEY --api-url https://api.daytona.com| Flag | Type | Description |
|---|---|---|
--api-key | string | Takes precedence over DAYTONA_API_KEY. Either one replaces the saved login for that command. |
--api-url | string | Takes precedence over DAYTONA_API_URL, and either one overrides the URL stored in the profile. |
--profile | string | Selects a profile other than the active one. DAYTONA_PROFILE does the same. |
Authenticate API requests
Section titled “Authenticate API requests”Send the API key as a bearer token in the authorization header of every request.
curl 'https://api.daytona.com/sandboxes' \ --request POST \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer YOUR_API_KEY' \ --data '{}'- Creating a sandbox needs the
write:sandboxespermission. - Creating a sandbox also needs the
read:secretspermission when the request attaches secrets.