sandpi/ platform

Core concepts

Environments

Initialize repositories and manage persistent workspace lifecycle.

On this page

Create a workspace

An Environment owns a persistent writable RootFS and a /workspace directory. Sessions share its files, tools, instructions and configuration. Use one Environment for work that should share state; use forks for independent workspaces.

Create a managed Environment

POST /v1/environments

Optional networkPolicy is stored before Sandbox provisioning and repository initialization. If omitted, outbound access defaults to allow-all with no domain exceptions. Allow required repository and dependency hosts when initializing a restricted Environment; model connection URLs never automatically grant outbound access.

Authentication: Platform API bearer token

Request example

sh
curl -X POST \
    "https://api.sandpi.ai/v1/environments" \
    -H "Authorization: Bearer $SANDPI_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
  "name": "PR review workspace",
  "labels": {
    "repo": "sandpi",
    "purpose": "review"
  }
}'
Request body · required application/json
FieldType and constraintsRequiredDescription
namestring · min length 1; max length 100
Validation pattern.*\S.*
YesHuman-readable name for this resource.
repositoryobjectNoPublic HTTPS Git repository used to initialize the workspace.
repository.urlstring · format: uri; max length 2048
Validation pattern^https:\/\/.*
Yeswithin repositoryPublic HTTPS Git URL without credentials, a port, query, fragment, or private host.
repository.refstring
Validation pattern^(?!.*\.\.)[A-Za-z0-9][A-Za-z0-9._/-]{0,199}$
Nowithin repositoryOptional repository branch or tag to clone during initialization.
projectIdstring · min length 1NoOptional Project scope; must match the API token Project.
labelsobject · max 32 keysNoUser-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.
labels.{key}string · max length 256Noadditional keys—
networkPolicyobject · extra fields rejectedNoEnvironment-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.
networkPolicy.modestring · values: "allow-all" | "block-all"Yeswithin networkPolicyDefault for outbound traffic not matched by a domain exception or enabled credential destination.
networkPolicy.domainExceptionsarray · max 500 itemsYeswithin networkPolicyDomains allowed in block-all mode or denied in allow-all mode. Exact names do not automatically include subdomains.
networkPolicy.domainExceptions[]string · min length 1; max length 255Yeseach array itemExact domain or wildcard suffix such as *.example.com. URLs, paths, ports and IP literals are not supported. Names are normalized to lowercase and deduplicated.
Example
Example
{
  "name": "PR review workspace",
  "labels": {
    "repo": "sandpi",
    "purpose": "review"
  }
}

Responses

201 Created.
Response body application/json
FieldType and constraintsRequiredDescription
dataobjectYesRun 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.idstringYeswithin dataResource identifier used to read or manage this resource.
data.namestringYeswithin dataHuman-readable name for this resource.
data.statusstring · values: "ready" | "updating" | "error"Yeswithin dataCurrent resource state; inspect the allowed values and the operation’s lifecycle notes.
data.platformobject · extra fields rejectedYeswithin dataPlatform checkpoint, workspace revision and initialization metadata.
data.platform.initialCheckpointStatusstring · values: "pending" | "ready" | "failed"Yeswithin dataInitialization checkpoint state. Wait for ready before submitting work.
data.platform.initialCheckpointSnapshotIdstringNowithin dataInitial immutable RootFS checkpoint identifier, present after capture succeeds.
data.platform.initialCheckpointErrorstringNowithin dataDiagnostic text for initialization checkpoint failure.
data.platform.workspaceRevisioninteger · ≥ -9007199254740991; ≤ 9007199254740991Yeswithin dataObserved workspace revision used to fence conflicting changes and fork operations.
data.platform.forkedFromobject · extra fields rejectedNowithin dataSource Environment and selected fork boundary; present for forked workspaces.
data.platform.forkedFrom.environmentIdstringYeswithin dataEnvironment identifier. It must belong to the caller’s account or Project.
data.platform.forkedFrom.modestring · values: "current" | "checkpoint"Yeswithin dataWhether the fork copied current workspace files or a selected immutable checkpoint.
data.platform.forkedFrom.snapshotIdstringNowithin dataSandbox0 checkpoint identifier. Use a returned initial or Run checkpoint when pinning a fork.
data.platform.forkedFrom.revisioninteger · ≥ -9007199254740991; ≤ 9007199254740991Yeswithin dataSource Environment Run revision observed when the fork was created.
data.platform.repositoryobject · extra fields rejectedNowithin dataPublic HTTPS Git repository used to initialize the workspace.
data.platform.repository.urlstring · format: uriYeswithin dataPublic HTTPS Git URL used to initialize the workspace.
data.platform.repository.refstringNowithin dataOptional repository branch or tag to clone during initialization.
data.platform.repository.initializedbooleanYeswithin dataWhether repository initialization has finished.
data.labelsobject · max 32 keysYeswithin dataUser-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 256Noadditional keys—
data.labelsRevisioninteger · ≥ 0; ≤ 2147483647Yeswithin dataIndependent labels revision. Supply the last read revision when replacing labels; a stale revision returns 409.
data.networkPolicyobject · extra fields rejectedYeswithin dataEnvironment-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.modestring · values: "allow-all" | "block-all"Yeswithin dataDefault for outbound traffic not matched by a domain exception or enabled credential destination.
data.networkPolicy.domainExceptionsarray · max 500 itemsYeswithin dataDomains 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 255Yeseach array itemExact 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}anyNoadditional keys—
Example
Example
{
  "data": {
    "id": "",
    "name": "",
    "status": "ready",
    "platform": {
      "initialCheckpointStatus": "pending",
      "workspaceRevision": -9007199254740991
    },
    "labels": {},
    "labelsRevision": 0,
    "networkPolicy": {
      "mode": "allow-all",
      "domainExceptions": [
        "example"
      ]
    }
  }
}
Error responses
400 Invalid request.

application/json

401 Missing or invalid Platform API token.

application/json

402 Insufficient Platform credit.

application/json

403 Token cannot create in the requested Project.

application/json

415 Unsupported request media type.

application/json

503 Platform execution is unavailable.

application/json

default Sandpi error.
Error body application/json

Standard error envelope containing a stable code, diagnostic message and request identity.

FieldType and constraintsRequiredDescription
errorobject · extra fields rejectedYesStructured failure information. Inspect the stable code and retain the request ID for investigation.
error.codestringYeswithin errorStable error code used to distinguish failures programmatically.
error.messagestringYeswithin errorHuman-readable diagnostic text.
error.requestIdstringYeswithin errorRequest identifier for correlating diagnostics and support investigations.
error.detailsanyNowithin errorOptional structured error context. Its shape is specific to the service failure.
error.loginUrlstringNowithin errorAuthentication URL supplied when a browser login is required.
error.registrationOpenbooleanNowithin errorWhether new account registration is enabled for this deployment.
Example
Example
{
  "error": {
    "code": "platform_balance_insufficient",
    "message": "Top up Platform credits before submitting a Run.",
    "requestId": "req_example"
  }
}

An optional public HTTPS Git repository is cloned into /workspace/project before the initial checkpoint. Repository credentials and private hosts are not accepted during initialization. Set networkPolicy at creation to restrict access before initialization. Allow required repository hosts, then manage outbound network access and egress credentials separately.

Wait for initialization

Save the returned Environment ID and poll its state. Wait for both the Environment status and platform.initialCheckpointStatus to be ready before submitting work.

Get a managed Environment

GET /v1/environments/{environmentId}

Authentication: Platform API bearer token

Parameters and headers
FieldType and constraintsRequiredDescription
path: environmentIdstring · min length 1YesEnvironment identifier. It must belong to the caller’s account or Project.

Request example

sh
curl \
    "https://api.sandpi.ai/v1/environments/$ENVIRONMENT_ID" \
    -H "Authorization: Bearer $SANDPI_API_TOKEN"

No request body.

Responses

200 Successful response.
Response body application/json
FieldType and constraintsRequiredDescription
dataobjectYesRun 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.idstringYeswithin dataResource identifier used to read or manage this resource.
data.namestringYeswithin dataHuman-readable name for this resource.
data.statusstring · values: "ready" | "updating" | "error"Yeswithin dataCurrent resource state; inspect the allowed values and the operation’s lifecycle notes.
data.platformobject · extra fields rejectedYeswithin dataPlatform checkpoint, workspace revision and initialization metadata.
data.platform.initialCheckpointStatusstring · values: "pending" | "ready" | "failed"Yeswithin dataInitialization checkpoint state. Wait for ready before submitting work.
data.platform.initialCheckpointSnapshotIdstringNowithin dataInitial immutable RootFS checkpoint identifier, present after capture succeeds.
data.platform.initialCheckpointErrorstringNowithin dataDiagnostic text for initialization checkpoint failure.
data.platform.workspaceRevisioninteger · ≥ -9007199254740991; ≤ 9007199254740991Yeswithin dataObserved workspace revision used to fence conflicting changes and fork operations.
data.platform.forkedFromobject · extra fields rejectedNowithin dataSource Environment and selected fork boundary; present for forked workspaces.
data.platform.forkedFrom.environmentIdstringYeswithin dataEnvironment identifier. It must belong to the caller’s account or Project.
data.platform.forkedFrom.modestring · values: "current" | "checkpoint"Yeswithin dataWhether the fork copied current workspace files or a selected immutable checkpoint.
data.platform.forkedFrom.snapshotIdstringNowithin dataSandbox0 checkpoint identifier. Use a returned initial or Run checkpoint when pinning a fork.
data.platform.forkedFrom.revisioninteger · ≥ -9007199254740991; ≤ 9007199254740991Yeswithin dataSource Environment Run revision observed when the fork was created.
data.platform.repositoryobject · extra fields rejectedNowithin dataPublic HTTPS Git repository used to initialize the workspace.
data.platform.repository.urlstring · format: uriYeswithin dataPublic HTTPS Git URL used to initialize the workspace.
data.platform.repository.refstringNowithin dataOptional repository branch or tag to clone during initialization.
data.platform.repository.initializedbooleanYeswithin dataWhether repository initialization has finished.
data.labelsobject · max 32 keysYeswithin dataUser-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 256Noadditional keys—
data.labelsRevisioninteger · ≥ 0; ≤ 2147483647Yeswithin dataIndependent labels revision. Supply the last read revision when replacing labels; a stale revision returns 409.
data.networkPolicyobject · extra fields rejectedYeswithin dataEnvironment-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.modestring · values: "allow-all" | "block-all"Yeswithin dataDefault for outbound traffic not matched by a domain exception or enabled credential destination.
data.networkPolicy.domainExceptionsarray · max 500 itemsYeswithin dataDomains 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 255Yeseach array itemExact 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}anyNoadditional keys—
Example
Example
{
  "data": {
    "id": "",
    "name": "",
    "status": "ready",
    "platform": {
      "initialCheckpointStatus": "pending",
      "workspaceRevision": -9007199254740991
    },
    "labels": {},
    "labelsRevision": 0,
    "networkPolicy": {
      "mode": "allow-all",
      "domainExceptions": [
        "example"
      ]
    }
  }
}
Error responses
400 Invalid request.

application/json

401 Missing or invalid Platform API token.

application/json

404 Resource not found or outside token scope.

application/json

default Sandpi error.
Error body application/json

Standard error envelope containing a stable code, diagnostic message and request identity.

FieldType and constraintsRequiredDescription
errorobject · extra fields rejectedYesStructured failure information. Inspect the stable code and retain the request ID for investigation.
error.codestringYeswithin errorStable error code used to distinguish failures programmatically.
error.messagestringYeswithin errorHuman-readable diagnostic text.
error.requestIdstringYeswithin errorRequest identifier for correlating diagnostics and support investigations.
error.detailsanyNowithin errorOptional structured error context. Its shape is specific to the service failure.
error.loginUrlstringNowithin errorAuthentication URL supplied when a browser login is required.
error.registrationOpenbooleanNowithin errorWhether new account registration is enabled for this deployment.
Example
Example
{
  "error": {
    "code": "platform_balance_insufficient",
    "message": "Top up Platform credits before submitting a Run.",
    "requestId": "req_example"
  }
}

Do not treat an accepted creation response as proof that the repository and checkpoint are ready. If initialization fails, inspect its diagnostic state before creating a replacement.

Pause and resume

After execution and checkpoint work settle, a Platform Sandbox pauses immediately with a memory checkpoint. Queued Runs continue without pausing between them. A Run, rollback or file operation resumes it when needed. Runtime access has a one-minute inactivity fallback; the interactive TUI has its own fifteen-minute idle policy.

If memory restoration definitively fails, Sandpi automatically requests a durable cold restart from committed RootFS files when the stopped source qualifies for recovery. Processes and PTYs restart; retained memory and uncommitted writes can be lost. A queued Run waits for this recovery instead of being rejected solely because cold recovery is pending. An already executing Run is never silently replayed when its original process is lost. Timeouts, capacity waits, and uncertain replies continue reconciling the original memory operation. Recovery still requires quota, writable storage and credential qualification.

Pause preserves workspace files and native Session state. Closing your browser or SSE stream does not stop a Run. The Environment lifecycle lock prevents pause from racing execution or file operations. Failed checkpoints and pauses remain durable for retry.

Configure shared capabilities

Use the console’s Environment Configuration tab or the corresponding APIs for agents.md, Skills, MCP servers, credentials, schedules and webhooks.

Organize with labels

Labels are user-defined key/value pairs for grouping workspaces by repository, stage, purpose or an external task ID. Set them when creating an Environment, then edit them in the console’s Configuration tab or replace the entire map through the API below. Read the Environment first and supply its labels revision; a concurrent edit returns a conflict instead of overwriting another user’s labels. Remove all entries to clear the map.

Replace Environment labels

PUT /v1/environments/{environmentId}/labels

Replace the entire label map; {} clears it. Labels are product metadata outside RootFS checkpoints, do not resume a paused Sandbox, and may be changed during a Run. Read labelsRevision from the Environment first. Concurrent stale updates return 409. Forks copy the source labels once at target creation; later edits and RootFS rollback do not propagate labels.

Authentication: Platform API bearer token

Parameters and headers
FieldType and constraintsRequiredDescription
path: environmentIdstring · min length 1YesEnvironment identifier. It must belong to the caller’s account or Project.

Request example

sh
curl -X PUT \
    "https://api.sandpi.ai/v1/environments/$ENVIRONMENT_ID/labels" \
    -H "Authorization: Bearer $SANDPI_API_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
  "labels": {
    "repo": "sandpi",
    "stage": "dev"
  },
  "labelsRevision": 0
}'
Request body · required application/json
FieldType and constraintsRequiredDescription
labelsobject · max 32 keysYesUser-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.
labels.{key}string · max length 256Noadditional keys—
labelsRevisioninteger · ≥ 0; ≤ 2147483647YesIndependent labels revision. Supply the last read revision when replacing labels; a stale revision returns 409.
Example
Example
{
  "labels": {
    "repo": "sandpi",
    "stage": "dev"
  },
  "labelsRevision": 0
}

Responses

200 Environment labels and their current revision.
Response body application/json
FieldType and constraintsRequiredDescription
dataobject · extra fields rejectedYes—
data.labelsobject · max 32 keysYeswithin dataUser-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 256Noadditional keys—
data.labelsRevisioninteger · ≥ 0; ≤ 2147483647Yeswithin dataIndependent labels revision. Supply the last read revision when replacing labels; a stale revision returns 409.
Example
Example
{
  "data": {
    "labels": {},
    "labelsRevision": 0
  }
}
Error responses
400 Invalid request.

application/json

401 Missing or invalid Platform API token.

application/json

404 Resource not found or outside token scope.

application/json

409 Labels were edited since the supplied revision, or Environment deletion is pending. Read the Environment again before retrying.

application/json

415 Unsupported request media type.

application/json

default Sandpi error.
Error body application/json

Standard error envelope containing a stable code, diagnostic message and request identity.

FieldType and constraintsRequiredDescription
errorobject · extra fields rejectedYesStructured failure information. Inspect the stable code and retain the request ID for investigation.
error.codestringYeswithin errorStable error code used to distinguish failures programmatically.
error.messagestringYeswithin errorHuman-readable diagnostic text.
error.requestIdstringYeswithin errorRequest identifier for correlating diagnostics and support investigations.
error.detailsanyNowithin errorOptional structured error context. Its shape is specific to the service failure.
error.loginUrlstringNowithin errorAuthentication URL supplied when a browser login is required.
error.registrationOpenbooleanNowithin errorWhether new account registration is enabled for this deployment.
Example
Example
{
  "error": {
    "code": "platform_balance_insufficient",
    "message": "Top up Platform credits before submitting a Run.",
    "requestId": "req_example"
  }
}

Label edits do not wake a paused Sandbox and can happen during a Run. Labels live outside RootFS checkpoints, so rollback retains their current values. A fork copies its source’s labels once when the child’s metadata is created; subsequent edits are independent. Labels do not grant access or change Project scope.

Remove an Environment

Deletion cleans online workspace content asynchronously and fences new operations. Save the deletion receipt and follow it to completion. Completed forks remain independent. See retention and deletion.

List your Environments

Use the token’s account or Project scope to list workspaces before selecting one.

List managed Environments

GET /v1/environments

Authentication: Platform API bearer token

Parameters and headers
FieldType and constraintsRequiredDescription
query: qstring · max length 200NoCase-insensitive literal substring of the Environment name, ID or initialization repository URL.
query: statusstring · values: "ready" | "updating" | "error"NoEnvironment provisioning status; separate from the Sandbox running/paused state.
query: labelarray · max 32 itemsNoRepeat 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: limitinteger · ≥ 1; ≤ 100NoOpt into pagination with a page size of 1–100. Omit to preserve the complete-list behavior. A paginated response may include nextCursor.
query: beforestring · min length 1; max length 200NonextCursor from the prior page. Requires limit and the same search/filter conditions.

Request example

sh
curl \
    "https://api.sandpi.ai/v1/environments" \
    -H "Authorization: Bearer $SANDPI_API_TOKEN"

No request body.

Responses

200 Successful response.
Response body application/json
FieldType and constraintsRequiredDescription
dataarrayYesSuccessful result wrapped by the API. The child fields describe its content.
data[]objectYeseach array itemRun 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[].idstringYeseach array itemResource identifier used to read or manage this resource.
data[].namestringYeseach array itemHuman-readable name for this resource.
data[].statusstring · values: "ready" | "updating" | "error"Yeseach array itemCurrent resource state; inspect the allowed values and the operation’s lifecycle notes.
data[].platformobject · extra fields rejectedYeseach array itemPlatform checkpoint, workspace revision and initialization metadata.
data[].platform.initialCheckpointStatusstring · values: "pending" | "ready" | "failed"Yeseach array itemInitialization checkpoint state. Wait for ready before submitting work.
data[].platform.initialCheckpointSnapshotIdstringNoeach array itemInitial immutable RootFS checkpoint identifier, present after capture succeeds.
data[].platform.initialCheckpointErrorstringNoeach array itemDiagnostic text for initialization checkpoint failure.
data[].platform.workspaceRevisioninteger · ≥ -9007199254740991; ≤ 9007199254740991Yeseach array itemObserved workspace revision used to fence conflicting changes and fork operations.
data[].platform.forkedFromobject · extra fields rejectedNoeach array itemSource Environment and selected fork boundary; present for forked workspaces.
data[].platform.forkedFrom.environmentIdstringYeseach array itemEnvironment identifier. It must belong to the caller’s account or Project.
data[].platform.forkedFrom.modestring · values: "current" | "checkpoint"Yeseach array itemWhether the fork copied current workspace files or a selected immutable checkpoint.
data[].platform.forkedFrom.snapshotIdstringNoeach array itemSandbox0 checkpoint identifier. Use a returned initial or Run checkpoint when pinning a fork.
data[].platform.forkedFrom.revisioninteger · ≥ -9007199254740991; ≤ 9007199254740991Yeseach array itemSource Environment Run revision observed when the fork was created.
data[].platform.repositoryobject · extra fields rejectedNoeach array itemPublic HTTPS Git repository used to initialize the workspace.
data[].platform.repository.urlstring · format: uriYeseach array itemPublic HTTPS Git URL used to initialize the workspace.
data[].platform.repository.refstringNoeach array itemOptional repository branch or tag to clone during initialization.
data[].platform.repository.initializedbooleanYeseach array itemWhether repository initialization has finished.
data[].labelsobject · max 32 keysYeseach array itemUser-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 256Noadditional keys—
data[].labelsRevisioninteger · ≥ 0; ≤ 2147483647Yeseach array itemIndependent labels revision. Supply the last read revision when replacing labels; a stale revision returns 409.
data[].networkPolicyobject · extra fields rejectedYeseach array itemEnvironment-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.modestring · values: "allow-all" | "block-all"Yeseach array itemDefault for outbound traffic not matched by a domain exception or enabled credential destination.
data[].networkPolicy.domainExceptionsarray · max 500 itemsYeseach array itemDomains 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 255Yeseach array itemExact 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}anyNoadditional keys—
nextCursorstringNoPresent only when more matching Environments remain. Use as before with the same filters and limit.
Example
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.

FieldType and constraintsRequiredDescription
errorobject · extra fields rejectedYesStructured failure information. Inspect the stable code and retain the request ID for investigation.
error.codestringYeswithin errorStable error code used to distinguish failures programmatically.
error.messagestringYeswithin errorHuman-readable diagnostic text.
error.requestIdstringYeswithin errorRequest identifier for correlating diagnostics and support investigations.
error.detailsanyNowithin errorOptional structured error context. Its shape is specific to the service failure.
error.loginUrlstringNowithin errorAuthentication URL supplied when a browser login is required.
error.registrationOpenbooleanNowithin errorWhether new account registration is enabled for this deployment.
Example
Example
{
  "error": {
    "code": "platform_balance_insufficient",
    "message": "Top up Platform credits before submitting a Run.",
    "requestId": "req_example"
  }
}

The list operation supports keyword search over the name, ID and repository URL, provisioning status, and repeated exact-match label conditions. All label conditions must match; values are case-sensitive. Console filters run on the server and stay in the page URL so the filtered view can be bookmarked or shared.

Pagination is optional for existing clients: pass a page size to receive bounded pages, then reuse the returned cursor with the same search/filter conditions. Omitting a page size preserves the complete-list behavior.