Skip to main content
Sandboxes support two networking features:
  1. Routing internet traffic into services running inside a sandbox through *.sandbox.tensorlake.ai
  2. Restricting the sandbox’s own outbound internet access

Sandbox Public URL

Every running sandbox is reachable through sandbox-specific ingress.
  • https://<sandbox-id-or-name>.sandbox.tensorlake.ai routes to the sandbox management API on port 9501
  • https://<port>-<sandbox-id-or-name>.sandbox.tensorlake.ai routes to a user service listening on <port> inside the sandbox
The proxy preserves the request path and query string, supports WebSocket upgrades, and forwards gRPC over HTTP/2. The hostname can use either the sandbox ID or a sandbox name. The proxy resolves names to the sandbox’s canonical ID before forwarding the request. These examples use the familiar *.sandbox.tensorlake.ai hostname pattern. The returned sandbox_url is the management URL on port 9501.

Route Traffic Into Sandbox Apps

There are two access modes for internet-facing sandbox traffic:
  1. Authenticated requests: the caller sends TensorLake auth credentials, and the proxy authorizes the request before forwarding it.
  2. Unauthenticated requests: the sandbox owner explicitly makes selected user ports public, and the proxy skips auth for those user ports.

Expose a User Port

Port 9501 is the built-in management API and is always routable through the bare sandbox hostname. For any other port, the proxy only forwards requests if that port is listed in exposed_ports.
allow_unauthenticated_access does not expose a port by itself. User ports still have to be present in exposed_ports.

Authenticated-Only Exposure with the HTTP API

Use this when a port should be routable from the internet but still require TensorLake auth on every request.

Unauthenticated Public Internet Access with the CLI

Use this when you want anyone on the internet to be able to reach a sandbox app without TensorLake credentials. Common cases include webhook receivers, demo apps, public APIs, browser clients, and temporary preview environments.
The CLI port expose workflow sets both:
  • exposed_ports
  • allow_unauthenticated_access=true
So traffic to that user port becomes publicly reachable from the internet without TensorLake auth.

Authenticated Requests

Authenticated routing is the default model for sandbox access.
  • The management URL on port 9501 always requires auth
  • User ports can also require auth when they are exposed but allow_unauthenticated_access=false
Verified against sandbox-proxy, the proxy accepts these auth modes:
  • API key: Authorization: Bearer <api-key>
  • Personal access token: Authorization: Bearer tl_pat... plus X-Forwarded-Organization-Id and X-Forwarded-Project-Id
  • Session cookie: tl.session_token or legacy tl-session, plus the same forwarded organization/project context
For browser WebSocket clients that cannot set custom X-Forwarded-* headers, the proxy also accepts organizationId and projectId in the query string.
You can use the same authenticated routing model for HTTP, gRPC, and WebSocket services:

Unauthenticated Requests

To make a user port public on the internet, both of these conditions must be true:
  • the port is in exposed_ports
  • allow_unauthenticated_access=true
When those are set, the proxy skips TensorLake auth for that user port.
After that, requests to the exposed user port can omit auth entirely:
Unauthenticated access only applies to user ports. The management API on port 9501 never becomes public.
If a named sandbox is suspended, the proxy can auto-resume it when a request arrives for an exposed port.

Outbound Internet Access

By default, sandboxes have outbound internet access enabled. Disable it for untrusted code:
In a verified public-cloud test, a sandbox created with allow_internet_access=False failed DNS resolution for https://example.com, confirming that outbound internet access was disabled. Setting allow_internet_access=false blocks all outbound traffic, including DNS requests. In the CLI, --no-internet (or -N) cannot be combined with --network-allow or --network-deny.

Allow Specific Destinations

Use allow_out when you want a sandbox to reach only selected destinations.
  • values can be domains, IPv4 addresses, or IPv4 CIDR ranges
  • deny_out takes precedence: a destination matched by both allow_out and deny_out is blocked
  • hostname rules are followed across DNS changes, so a CDN-backed domain keeps working as its IP addresses rotate
This allows DNS requests to the sandbox’s configured resolvers and traffic to the listed domain, IPv4 address, and IPv4 CIDR range. All other outbound traffic is blocked. The short form of --network-allow is -A.

Block Specific Destinations

In a verified public-cloud request, deny_out=["example.com"] blocked https://example.com while https://api.openai.com/v1/models still returned 401, confirming outbound connectivity was still available for destinations that were not denied. The short form of --network-deny is -D. You can combine -A and -D; deny rules take precedence when a destination matches both lists.

Update the Policy on a Running Sandbox

You can change a sandbox’s egress policy without recreating or suspending it. The new policy is applied to the running sandbox’s firewall as a single atomic swap, so there is no window where egress is unprotected. Already-established connections are not interrupted. The network argument is tri-state:
  • omit it to leave the current policy unchanged (you can update name or exposed ports without touching the network policy),
  • pass a policy to replace the whole policy, or
  • clear it to return the sandbox to unrestricted egress.
Each tl sbx update command replaces or clears the complete network policy. Repeat -A or -D to add multiple rules to the replacement policy. --no-internet is an absolute block-all mode and cannot be combined with either rule flag; --clear-network cannot be combined with any replacement-policy flag.
If a hostname in the new policy cannot be resolved, the update is rejected and the previous policy stays fully enforced — the sandbox keeps running under the policy it already had.
This is useful for phase-based agents: start a sandbox with a broad allowlist while it fetches dependencies, then tighten to a minimal policy (or block all egress) before running untrusted work.

Network Configuration Summary