Get started
Authentication
Create, scope, rotate and revoke Platform API keys.
On this page
Create an API key
Create keys in the console. A key is displayed once. Store it in your service’s secret manager and send it in the Authorization: Bearer header on authenticated Platform requests.
export SANDPI_API_TOKEN="your-platform-token"List managed Environments
/v1/environmentsAuthentication: Platform API bearer token
Parameters and headers
| Field | Type and constraints | Required | Description |
|---|---|---|---|
query: q | string · max length 200 | No | Case-insensitive literal substring of the Environment name, ID or initialization repository URL. |
query: status | string · values: "ready" | "updating" | "error" | No | Environment provisioning status; separate from the Sandbox running/paused state. |
query: label | array · max 32 items | No | Repeat label=key=value for case-sensitive exact matching. Every condition must match. Split each condition at its first equals sign. Conflicting values for one key are invalid. |
query: limit | integer · ≥ 1; ≤ 100 | No | Opt into pagination with a page size of 1–100. Omit to preserve the complete-list behavior. A paginated response may include nextCursor. |
query: before | string · min length 1; max length 200 | No | nextCursor from the prior page. Requires limit and the same search/filter conditions. |
Request example
curl \
"https://api.sandpi.ai/v1/environments" \
-H "Authorization: Bearer $SANDPI_API_TOKEN"No request body.
Responses
200 Successful response.Response body application/json
| Field | Type and constraints | Required | Description |
|---|---|---|---|
data | array | Yes | Successful result wrapped by the API. The child fields describe its content. |
data[] | object | Yeseach array item | Run completion settles the file diff and RootFS checkpoint, then immediately requests a memory pause when no Run, rollback, or checkpoint remains. File and other runtime access uses a one-minute inactivity fallback. Queued Runs continue without an intervening pause. The interactive TUI retains its separate fifteen-minute idle policy. On access after a confirmed memory restoration failure, Sandpi automatically requests a durable cold restart from committed files for a qualified stopped source. Processes restart and memory or uncommitted writes may be lost. Pending or uncertain restores retain their original operation. |
data[].id | string | Yeseach array item | Resource identifier used to read or manage this resource. |
data[].name | string | Yeseach array item | Human-readable name for this resource. |
data[].status | string · values: "ready" | "updating" | "error" | Yeseach array item | Current resource state; inspect the allowed values and the operation’s lifecycle notes. |
data[].platform | object · extra fields rejected | Yeseach array item | Platform checkpoint, workspace revision and initialization metadata. |
data[].platform.initialCheckpointStatus | string · values: "pending" | "ready" | "failed" | Yeseach array item | Initialization checkpoint state. Wait for ready before submitting work. |
data[].platform.initialCheckpointSnapshotId | string | Noeach array item | Initial immutable RootFS checkpoint identifier, present after capture succeeds. |
data[].platform.initialCheckpointError | string | Noeach array item | Diagnostic text for initialization checkpoint failure. |
data[].platform.workspaceRevision | integer · ≥ -9007199254740991; ≤ 9007199254740991 | Yeseach array item | Observed workspace revision used to fence conflicting changes and fork operations. |
data[].platform.forkedFrom | object · extra fields rejected | Noeach array item | Source Environment and selected fork boundary; present for forked workspaces. |
data[].platform.forkedFrom.environmentId | string | Yeseach array item | Environment identifier. It must belong to the caller’s account or Project. |
data[].platform.forkedFrom.mode | string · values: "current" | "checkpoint" | Yeseach array item | Whether the fork copied current workspace files or a selected immutable checkpoint. |
data[].platform.forkedFrom.snapshotId | string | Noeach array item | Sandbox0 checkpoint identifier. Use a returned initial or Run checkpoint when pinning a fork. |
data[].platform.forkedFrom.revision | integer · ≥ -9007199254740991; ≤ 9007199254740991 | Yeseach array item | Source Environment Run revision observed when the fork was created. |
data[].platform.repository | object · extra fields rejected | Noeach array item | Public HTTPS Git repository used to initialize the workspace. |
data[].platform.repository.url | string · format: uri | Yeseach array item | Public HTTPS Git URL used to initialize the workspace. |
data[].platform.repository.ref | string | Noeach array item | Optional repository branch or tag to clone during initialization. |
data[].platform.repository.initialized | boolean | Yeseach array item | Whether repository initialization has finished. |
data[].labels | object · max 32 keys | Yeseach array item | User-defined labels for exact-match filtering. Up to 32 entries. Keys are 1–64 ASCII letters, digits, dots, underscores, slashes or hyphens, beginning with a letter or digit; constructor and prototype are reserved. Values are case-sensitive strings of up to 256 characters, including empty strings. |
data[].labels.{key} | string · max length 256 | Noadditional keys | — |
data[].labelsRevision | integer · ≥ 0; ≤ 2147483647 | Yeseach array item | Independent labels revision. Supply the last read revision when replacing labels; a stale revision returns 409. |
data[].networkPolicy | object · extra fields rejected | Yeseach array item | Environment-wide outbound policy, enforced by Sandbox0. Domain exceptions allow destinations in block-all mode and deny destinations in allow-all mode. Enabled egress credentials also allow their destinations in block-all mode. This policy does not restrict HTTP methods, paths, or local commands. |
data[].networkPolicy.mode | string · values: "allow-all" | "block-all" | Yeseach array item | Default for outbound traffic not matched by a domain exception or enabled credential destination. |
data[].networkPolicy.domainExceptions | array · max 500 items | Yeseach array item | Domains allowed in block-all mode or denied in allow-all mode. Exact names do not automatically include subdomains. |
data[].networkPolicy.domainExceptions[] | string · min length 1; max length 255 | Yeseach array item | Exact domain or wildcard suffix such as *.example.com. URLs, paths, ports and IP literals are not supported. Names are normalized to lowercase and deduplicated. |
data[].{key} | any | Noadditional keys | — |
nextCursor | string | No | Present only when more matching Environments remain. Use as before with the same filters and limit. |
Example
{
"data": [
{
"id": "",
"name": "",
"status": "ready",
"platform": {
"initialCheckpointStatus": "pending",
"workspaceRevision": -9007199254740991
},
"labels": {},
"labelsRevision": 0,
"networkPolicy": {
"mode": "allow-all",
"domainExceptions": [
"example"
]
}
}
]
}Error responses
401 Missing or invalid Platform API token.application/json
default Sandpi error.Error body application/json
Standard error envelope containing a stable code, diagnostic message and request identity.
| Field | Type and constraints | Required | Description |
|---|---|---|---|
error | object · extra fields rejected | Yes | Structured failure information. Inspect the stable code and retain the request ID for investigation. |
error.code | string | Yeswithin error | Stable error code used to distinguish failures programmatically. |
error.message | string | Yeswithin error | Human-readable diagnostic text. |
error.requestId | string | Yeswithin error | Request identifier for correlating diagnostics and support investigations. |
error.details | any | Nowithin error | Optional structured error context. Its shape is specific to the service failure. |
error.loginUrl | string | Nowithin error | Authentication URL supplied when a browser login is required. |
error.registrationOpen | boolean | Nowithin error | Whether new account registration is enabled for this deployment. |
Example
{
"error": {
"code": "platform_balance_insufficient",
"message": "Top up Platform credits before submitting a Run.",
"requestId": "req_example"
}
}The public API uses Platform tokens. The console uses a browser login and internal cookie-authenticated routes; your server-to-server client does not need a browser cookie. Your Platform token authenticates requests to Sandpi. Separately, supply your own model API key and compatible provider or gateway base URL in the Session connection. Sandpi encrypts that connection; model requests go directly from the Sandbox to your endpoint.
Personal and Project scope
A personal key accesses its account’s personal resources. A Project key accesses one immutable Team Project scope. Use the same scope for Environment creation and all its subsequent operations. Resource paths do not need a separate Project parameter.
Resource IDs must also belong to the named parent Environment and Session. Inaccessible resources can return 404, so check key scope and parent IDs as well as whether a resource exists.
Public and trigger-authenticated operations
Webhook management uses your Platform token, but inbound event receivers use the trigger’s secret and selected authentication protocol. A webhook secret is separate from a Platform API key. See custom webhook authentication.
The API documentation shows each operation’s authentication requirements from the contract.
Rotate and revoke
Create a replacement key, update your integration, verify it can read the intended resources, then revoke the previous key in the console. Removing a Team member does not revoke existing Project keys; revoke them separately. Token revocation prevents new authenticated requests; it is not a Run stop operation. Use stop and rollback to control admitted work.