unsandbox.com
Anonymous remote code, compile, & execution API for humans & machine learning agents.
Docs 📚 View Pricing →The Tcl examples below require the following 3rd party libraries:
http package (built-in)json package
Make sure these packages are installed in your environment before running the examples.
Execute code immediately and wait for results. Best for quick scripts and interactive use.
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
language |
string | ✓ | Programming language |
code |
string | ✓ | Source code to execute |
env |
object | Environment variables (key-value pairs) | |
network_mode |
string | "zerotrust" or "semitrusted" | |
ttl |
integer | Timeout 1-900s (default: 60) | |
return_artifact |
boolean | Return compiled binary | |
return_wasm_artifact |
boolean | Return WebAssembly binary | |
input_files |
array | Files to upload (see Input Files) |
Example (Tcl)
#!/usr/bin/env tclsh
package require http
# Try to load TLS for HTTPS support
if {[catch {package require tls}] == 0} {
::http::register https 443 ::tls::socket
}
# Manually construct JSON payload
set payload {{"language":"python","code":"print('Hello from unsandbox!')"}}
set token [::http::geturl https://api.unsandbox.com/execute \
-method POST \
-headers [list \
Content-Type "application/json" \
Authorization "Bearer [expr {[info exists env(UNSANDBOX_API_KEY)] ? $env(UNSANDBOX_API_KEY) : "unsb-sk-test0-vault-unlck-12345"}]"] \
-query $payload]
set status [::http::status $token]
if {$status ne "ok"} {
puts stderr "Request failed: $status"
exit 1
}
set response [::http::data $token]
::http::cleanup $token
# Simple JSON parsing - check exit_code
if {[regexp {"exit_code":(\d+)} $response -> exit_code] && $exit_code == 0} {
if {[regexp {"stdout":"([^"]*)"} $response -> stdout]} {
set stdout [string map {\\n \n \\t \t \\" "} $stdout]
puts "Output: $stdout"
}
} else {
if {[regexp {"stderr":"([^"]*)"} $response -> stderr]} {
set stderr [string map {\\n \n \\t \t \\" "} $stderr]
puts "Error: $stderr"
}
}
Response (Success)
{
"success": true,
"stdout": "Hello from unsandbox!\n",
"stderr": "",
"exit_code": 0,
"language": "python",
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"artifacts": [],
"execution_mode": "pooled",
"network_mode": "zerotrust",
"total_time_ms": 523
}
Response (Error)
{
"success": false,
"stdout": "",
"stderr": "SyntaxError: invalid syntax\n",
"exit_code": 1,
"language": "python",
"job_id": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
"artifacts": [],
"execution_mode": "pooled",
"network_mode": "zerotrust",
"total_time_ms": 312
}
Submit code for execution and receive a job ID to poll for results. Best for long-running scripts or when you need to decouple submission from execution.
Request Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
language |
string | ✓ | Programming language |
code |
string | ✓ | Source code to execute |
env |
object | Environment variables (key-value pairs) | |
network_mode |
string | "zerotrust" or "semitrusted" | |
ttl |
integer | Timeout 1-900s (default: 60) | |
return_artifact |
boolean | Return compiled binary | |
return_wasm_artifact |
boolean | Return WebAssembly binary | |
input_files |
array | Files to upload (see Input Files) |
Example (Tcl)
#!/usr/bin/env tclsh
package require http
# Try to load TLS for HTTPS support
if {[catch {package require tls}] == 0} {
::http::register https 443 ::tls::socket
}
# Submit job - manually construct JSON payload
set payload {{"language":"tcl","code":"puts \"Computing...\"","ttl":300}}
set token [::http::geturl https://api.unsandbox.com/execute/async \
-method POST \
-headers [list \
Content-Type "application/json" \
Authorization "Bearer [expr {[info exists env(UNSANDBOX_API_KEY)] ? $env(UNSANDBOX_API_KEY) : "unsb-sk-test0-vault-unlck-12345"}]"] \
-query $payload]
set response [::http::data $token]
::http::cleanup $token
# Extract job_id from JSON response
if {[regexp {"job_id":"([^"]+)"} $response -> job_id]} {
puts "Job submitted: $job_id"
} else {
puts stderr "Failed to get job_id"
exit 1
}
# Poll for results
while {1} {
set token [::http::geturl https://api.unsandbox.com/jobs/$job_id \
-headers [list Authorization "Bearer [expr {[info exists env(UNSANDBOX_API_KEY)] ? $env(UNSANDBOX_API_KEY) : "unsb-sk-test0-vault-unlck-12345"}]"]]
set status_response [::http::data $token]
::http::cleanup $token
# Extract status field
if {[regexp {"status":"([^"]+)"} $status_response -> state]} {
if {$state eq "completed"} {
# Extract stdout field
if {[regexp {"stdout":"([^"]*)"} $status_response -> stdout]} {
set stdout [string map {\\n \n \\t \t \\" "} $stdout]
puts $stdout
}
break
} elseif {$state eq "timeout" || $state eq "cancelled"} {
puts "Job $state"
break
}
}
after 1000
}
Initial Response
{
"job_id": "job_1234567890_abc",
"status": "pending"
}
Check the status and results of an asynchronous job. Poll this endpoint after submitting a job via /execute/async or /run/async.
URL Parameters
| Parameter | Type | Description |
|---|---|---|
id |
string | Job ID returned from async endpoint |
Example (Tcl)
#!/usr/bin/env tclsh
package require http
# Try to load TLS for HTTPS support
if {[catch {package require tls}] == 0} {
::http::register https 443 ::tls::socket
}
set token [::http::geturl https://api.unsandbox.com/jobs/job_1234567890_abc \
-headers [list Authorization "Bearer [expr {[info exists env(UNSANDBOX_API_KEY)] ? $env(UNSANDBOX_API_KEY) : "unsb-sk-test0-vault-unlck-12345"}]"]]
set status [::http::status $token]
if {$status ne "ok"} {
puts stderr "Request failed: $status"
exit 1
}
set response [::http::data $token]
::http::cleanup $token
puts $response
Response (Completed)
{
"job_id": "c3d4e5f6-a7b8-9012-cdef-345678901234",
"status": "completed",
"created_at": 1699564800,
"started_at": 1699564801,
"completed_at": 1699564805,
"result": {
"success": true,
"stdout": "Hello from unsandbox!\n",
"stderr": "",
"exit_code": 0,
"language": "python",
"artifacts": [],
"execution_mode": "pooled",
"network_mode": "zerotrust",
"total_time_ms": 4021
}
}
Possible Status Values
pending- Job queued, waiting to executerunning- Job currently executingcompleted- Job finished (check result field)timeout- Job exceeded TTL limitcancelled- Job was cancelled via DELETE
List all active (pending or running) jobs for your API key. Useful for monitoring multiple async executions.
Example (Tcl)
#!/usr/bin/env tclsh
package require http
# Try to load TLS for HTTPS support
if {[catch {package require tls}] == 0} {
::http::register https 443 ::tls::socket
}
set token [::http::geturl https://api.unsandbox.com/jobs \
-headers [list Authorization "Bearer [expr {[info exists env(UNSANDBOX_API_KEY)] ? $env(UNSANDBOX_API_KEY) : "unsb-sk-test0-vault-unlck-12345"}]"]]
set status [::http::status $token]
if {$status ne "ok"} {
puts stderr "Request failed: $status"
exit 1
}
set response [::http::data $token]
::http::cleanup $token
puts $response
Response
{
"jobs": [
{
"job_id": "job_1234567890_abc",
"status": "running",
"language": "python",
"submitted_at": "2024-01-15T10:30:00Z"
},
{
"job_id": "job_0987654321_xyz",
"status": "pending",
"language": "go",
"submitted_at": "2024-01-15T10:29:45Z"
}
]
}
Cancel a pending or running job. If the job is already executing, it will be terminated and partial output returned.
URL Parameters
| Parameter | Type | Description |
|---|---|---|
id |
string | Job ID to cancel |
Example (Tcl)
#!/usr/bin/env tclsh
package require http
# Try to load TLS for HTTPS support
if {[catch {package require tls}] == 0} {
::http::register https 443 ::tls::socket
}
set token [::http::geturl https://api.unsandbox.com/jobs/job_1234567890_abc \
-method DELETE \
-headers [list Authorization "Bearer [expr {[info exists env(UNSANDBOX_API_KEY)] ? $env(UNSANDBOX_API_KEY) : "unsb-sk-test0-vault-unlck-12345"}]"]]
set status [::http::status $token]
if {$status ne "ok"} {
puts stderr "Request failed: $status"
exit 1
}
set response [::http::data $token]
::http::cleanup $token
puts $response
Response
{
"message": "Job cancelled",
"job_id": "e5f6a7b8-c9d0-1234-efgh-567890123456",
"result": {
"success": false,
"stdout": "Partial output before cancel...",
"stderr": "",
"exit_code": -1,
"language": "python",
"artifacts": [],
"execution_mode": "pooled",
"network_mode": "zerotrust",
"total_time_ms": 1523
}
}
Execute code with automatic language detection via shebang. Send raw code as the request body with Content-Type: text/plain.
Request
- Content-Type:
text/plain - Body: Raw code with shebang (e.g.,
#!/usr/bin/env python3)
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
env |
string | URL-encoded JSON object with environment variables | |
network_mode |
string | "zerotrust" or "semitrusted" | |
ttl |
integer | Timeout 1-900s (default: 60) | |
return_artifact |
boolean | Return compiled binary | |
return_wasm_artifact |
boolean | Return WebAssembly binary |
Example (Tcl)
#!/usr/bin/env tclsh
package require http
# Try to load TLS for HTTPS support
if {[catch {package require tls}] == 0} {
::http::register https 443 ::tls::socket
}
set code {#!/usr/bin/env tclsh
puts "Language auto-detected!"}
set token [::http::geturl https://api.unsandbox.com/run \
-method POST \
-headers [list \
Content-Type "text/plain" \
Authorization "Bearer [expr {[info exists env(UNSANDBOX_API_KEY)] ? $env(UNSANDBOX_API_KEY) : "unsb-sk-test0-vault-unlck-12345"}]"] \
-query $code]
set status [::http::status $token]
if {$status ne "ok"} {
puts stderr "Request failed: $status"
exit 1
}
set response [::http::data $token]
::http::cleanup $token
# Simple JSON parsing - extract stdout field
if {[regexp {"stdout":"([^"]*)"} $response -> stdout]} {
puts $stdout
} else {
puts $response
}
Response
{
"success": true,
"stdout": "Language auto-detected!\n",
"stderr": "",
"exit_code": 0,
"language": "python",
"detected_language": "python",
"job_id": "f6a7b8c9-d0e1-2345-fghi-678901234567",
"artifacts": [],
"execution_mode": "pooled",
"network_mode": "zerotrust",
"total_time_ms": 412
}
Submit code with automatic language detection and receive a job ID. Combines the convenience of /run with the flexibility of async execution.
Request
- Content-Type:
text/plain - Body: Raw code with shebang (e.g.,
#!/usr/bin/env ruby)
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
env |
string | URL-encoded JSON object with environment variables | |
network_mode |
string | "zerotrust" or "semitrusted" | |
ttl |
integer | Timeout 1-900s (default: 60) | |
return_artifact |
boolean | Return compiled binary | |
return_wasm_artifact |
boolean | Return WebAssembly binary |
Example (Tcl)
#!/usr/bin/env tclsh
package require http
# Try to load TLS for HTTPS support
if {[catch {package require tls}] == 0} {
::http::register https 443 ::tls::socket
}
# Submit job
set code {#!/usr/bin/env tclsh
puts "Running async with auto-detect!"}
set token [::http::geturl https://api.unsandbox.com/run/async \
-method POST \
-headers [list \
Content-Type "text/plain" \
Authorization "Bearer [expr {[info exists env(UNSANDBOX_API_KEY)] ? $env(UNSANDBOX_API_KEY) : "unsb-sk-test0-vault-unlck-12345"}]"] \
-query $code]
set response [::http::data $token]
::http::cleanup $token
# Extract job_id from JSON response
if {[regexp {"job_id":"([^"]+)"} $response -> job_id]} {
puts "Job submitted: $job_id"
} else {
puts stderr "Failed to get job_id"
exit 1
}
# Poll for results
while {1} {
set token [::http::geturl https://api.unsandbox.com/jobs/$job_id \
-headers [list Authorization "Bearer [expr {[info exists env(UNSANDBOX_API_KEY)] ? $env(UNSANDBOX_API_KEY) : "unsb-sk-test0-vault-unlck-12345"}]"]]
set status_response [::http::data $token]
::http::cleanup $token
# Extract status field
if {[regexp {"status":"([^"]+)"} $status_response -> state]} {
if {$state eq "completed"} {
puts $status_response
break
} elseif {$state eq "timeout" || $state eq "cancelled"} {
puts "Job $state"
break
}
}
after 1000
}
Initial Response
{
"job_id": "job_1234567890_abc",
"status": "pending"
}
Job Result (via GET /jobs/{id})
{
"job_id": "a7b8c9d0-e1f2-3456-ghij-789012345678",
"status": "completed",
"created_at": 1699564800,
"started_at": 1699564801,
"completed_at": 1699564802,
"result": {
"success": true,
"stdout": "Running async with auto-detect!\n",
"stderr": "",
"exit_code": 0,
"language": "ruby",
"detected_language": "ruby",
"artifacts": [],
"execution_mode": "pooled",
"network_mode": "zerotrust",
"total_time_ms": 1234
}
}
Upload files to your sandbox execution. Files are written to the working directory and can be accessed directly by filename.
File Object Schema
| Field | Type | Required | Description |
|---|---|---|---|
filename |
string | Filename (e.g., "data.csv"). If omitted, file is named by index: "0", "1", etc. | |
content |
string | ✓ | Base64-encoded file content |
Example Request
{
"language": "python",
"code": "print(open('data.csv').read())",
"input_files": [
{
"filename": "data.csv",
"content": "bmFtZSxhZ2UKQWxpY2UsMzAKQm9iLDI1"
}
]
}
Limits
- Maximum files: 10 files per execution
- Maximum total size: 10MB (decoded)
- Maximum single file: 5MB (decoded)
- Filename length: 256 characters max
File Access
Files are placed in the working directory. Access them directly:
- Python:
open('data.csv') - Node.js:
fs.readFileSync('data.csv') - Ruby:
File.read('data.csv') - Go:
os.ReadFile("data.csv")
Security
- Files are isolated per execution
- Filenames cannot contain path separators (no
/or..) - Files are deleted after execution completes