unsandbox.com
Anonymous remote code, compile, & execution API for humans & machine learning agents.
Docs 📚 View Pricing →The Erlang examples below require the following 3rd party libraries:
jsxhttpc (built-in)
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 |
Example (Erlang)
#!/usr/bin/env escript
%%! -pa _build/default/lib/jsx/ebin
main(_Args) ->
inets:start(),
ssl:start(),
ApiKey = case os:getenv("UNSANDBOX_API_KEY") of
false -> "unsb-sk-test0-vault-unlck-12345";
Val -> Val
end,
Url = "https://api.unsandbox.com/execute",
Headers = [
{"Content-Type", "application/json"},
{"Authorization", "Bearer " ++ ApiKey}
],
Body = "{\"language\":\"python\",\"code\":\"print('Hello from unsandbox!')\"}",
case httpc:request(post, {Url, Headers, "application/json", Body}, [], []) of
{ok, {{_, 200, _}, _, Response}} ->
Result = jsx:decode(list_to_binary(Response), [return_maps]),
ExitCode = maps:get(<<"exit_code">>, Result, 1),
case ExitCode of
0 ->
io:format("Output: ~s~n", [maps:get(<<"stdout">>, Result)]);
_ ->
io:format("Error: ~s~n", [maps:get(<<"stderr">>, Result)])
end;
{error, Reason} ->
io:format("Request failed: ~p~n", [Reason])
end.
Response (Success)
{
"success": true,
"stdout": "Hello from unsandbox!\n",
"stderr": "",
"error": null,
"language": "python",
"exit_code": 0
}
Response (Error)
{
"success": false,
"error": "Syntax error in code",
"stderr": "SyntaxError: invalid syntax\n"
}
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 |
Example (Erlang)
#!/usr/bin/env escript
main(_Args) ->
inets:start(),
ssl:start(),
ApiKey = case os:getenv("UNSANDBOX_API_KEY") of
false -> "unsb-sk-test0-vault-unlck-12345";
Val -> Val
end,
% Submit job
Url = "https://api.unsandbox.com/execute/async",
Headers = [
{"Content-Type", "application/json"},
{"Authorization", "Bearer " ++ ApiKey}
],
Body = "{\"language\":\"rust\",\"code\":\"fn main() { println!(\\\"Computing...\\\"); }\",\"ttl\":300}",
{ok, {{_, 200, _}, _, Response}} = httpc:request(post, {Url, Headers, "application/json", Body}, [], []),
Job = jsx:decode(list_to_binary(Response), [return_maps]),
JobId = maps:get(<<"job_id">>, Job),
io:format("Job submitted: ~s~n", [JobId]),
% Poll for results
poll(JobId).
poll(JobId) ->
ApiKey = case os:getenv("UNSANDBOX_API_KEY") of
false -> "unsb-sk-test0-vault-unlck-12345";
Val -> Val
end,
Headers = [{"Authorization", "Bearer " ++ ApiKey}],
StatusUrl = "https://api.unsandbox.com/jobs/" ++ binary_to_list(JobId),
{ok, {{_, 200, _}, _, Response}} = httpc:request(get, {StatusUrl, Headers}, [], []),
Status = jsx:decode(list_to_binary(Response), [return_maps]),
case maps:get(<<"status">>, Status) of
<<"completed">> ->
ExitCode = maps:get(<<"exit_code">>, Status, 1),
case ExitCode of
0 ->
io:format("Output: ~s~n", [maps:get(<<"stdout">>, Status)]);
_ ->
io:format("Error: ~s~n", [maps:get(<<"stderr">>, Status)])
end;
State when State == <<"timeout">>; State == <<"cancelled">> ->
io:format("Job ~s~n", [State]);
_ ->
timer:sleep(1000),
poll(JobId)
end.
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 (Erlang)
#!/usr/bin/env escript
%%! -pa _build/default/lib/jsx/ebin
main(_Args) ->
inets:start(),
ssl:start(),
ApiKey = case os:getenv("UNSANDBOX_API_KEY") of
false -> "unsb-sk-test0-vault-unlck-12345";
Val -> Val
end,
JobId = "job_1234567890_abc",
Url = "https://api.unsandbox.com/jobs/" ++ JobId,
Headers = [{"Authorization", "Bearer " ++ ApiKey}],
case httpc:request(get, {Url, Headers}, [], []) of
{ok, {{_, 200, _}, _, Response}} ->
Job = jsx:decode(list_to_binary(Response), [return_maps]),
io:format("Status: ~s~n", [maps:get(<<"status">>, Job)]),
case maps:get(<<"status">>, Job) of
<<"completed">> ->
Result = maps:get(<<"result">>, Job),
ExitCode = maps:get(<<"exit_code">>, Result, 1),
io:format("Exit code: ~p~n", [ExitCode]),
io:format("Output: ~s~n", [maps:get(<<"stdout">>, Result)]);
_ ->
ok
end;
{ok, {{_, 404, _}, _, _}} ->
io:format("Job not found~n");
{error, Reason} ->
io:format("Request failed: ~p~n", [Reason])
end.
Response (Completed)
{
"job_id": "job_1234567890_abc",
"status": "completed",
"result": {
"success": true,
"stdout": "Hello from unsandbox!\n",
"stderr": "",
"error": null,
"language": "python",
"exit_code": 0
}
}
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 (Erlang)
#!/usr/bin/env escript
%%! -pa _build/default/lib/jsx/ebin
main(_Args) ->
inets:start(),
ssl:start(),
ApiKey = case os:getenv("UNSANDBOX_API_KEY") of
false -> "unsb-sk-test0-vault-unlck-12345";
Val -> Val
end,
Url = "https://api.unsandbox.com/jobs",
Headers = [{"Authorization", "Bearer " ++ ApiKey}],
case httpc:request(get, {Url, Headers}, [], []) of
{ok, {{_, 200, _}, _, Response}} ->
Jobs = jsx:decode(list_to_binary(Response), [return_maps]),
lists:foreach(fun(Job) ->
JobId = maps:get(<<"job_id">>, Job),
Status = maps:get(<<"status">>, Job),
Language = maps:get(<<"language">>, Job),
io:format("~s: ~s (~s)~n", [JobId, Status, Language])
end, Jobs);
{error, Reason} ->
io:format("Request failed: ~p~n", [Reason])
end.
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 (Erlang)
#!/usr/bin/env escript
%%! -pa _build/default/lib/jsx/ebin
main(_Args) ->
inets:start(),
ssl:start(),
ApiKey = case os:getenv("UNSANDBOX_API_KEY") of
false -> "unsb-sk-test0-vault-unlck-12345";
Val -> Val
end,
JobId = "job_1234567890_abc",
Url = "https://api.unsandbox.com/jobs/" ++ JobId,
Headers = [{"Authorization", "Bearer " ++ ApiKey}],
case httpc:request(delete, {Url, Headers}, [], []) of
{ok, {{_, 200, _}, _, Response}} ->
Result = jsx:decode(list_to_binary(Response), [return_maps]),
io:format("Cancelled: ~s~n", [maps:get(<<"message">>, Result)]),
case maps:get(<<"result">>, Result, undefined) of
undefined ->
ok;
PartialResult ->
io:format("Partial output: ~s~n", [maps:get(<<"stdout">>, PartialResult)])
end;
{ok, {{_, 404, _}, _, _}} ->
io:format("Job not found or already deleted~n");
{error, Reason} ->
io:format("Request failed: ~p~n", [Reason])
end.
Response
{
"message": "Job cancelled",
"job_id": "job_1234567890_abc",
"result": {
"success": false,
"stdout": "Partial output before cancel...",
"stderr": "",
"error": "Job cancelled by user",
"exit_code": -1
}
}
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 (Erlang)
#!/usr/bin/env escript
%%! -pa _build/default/lib/jsx/ebin
main(_Args) ->
inets:start(),
ssl:start(),
ApiKey = case os:getenv("UNSANDBOX_API_KEY") of
false -> "unsb-sk-test0-vault-unlck-12345";
Val -> Val
end,
Url = "https://api.unsandbox.com/run",
Headers = [
{"Content-Type", "text/plain"},
{"Authorization", "Bearer " ++ ApiKey}
],
Code = "#!/usr/bin/env python3\nprint(\"Language auto-detected!\")",
case httpc:request(post, {Url, Headers, "text/plain", Code}, [], []) of
{ok, {{_, 200, _}, _, Response}} ->
Result = jsx:decode(list_to_binary(Response), [return_maps]),
io:format("Detected: ~s~n", [maps:get(<<"detected_language">>, Result)]),
io:format("Output: ~s~n", [maps:get(<<"stdout">>, Result)]);
{error, Reason} ->
io:format("Request failed: ~p~n", [Reason])
end.
Response
{
"success": true,
"stdout": "Language auto-detected!\n",
"stderr": "",
"error": null,
"detected_language": "python",
"exit_code": 0
}
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 (Erlang)
#!/usr/bin/env escript
main(_Args) ->
inets:start(),
ssl:start(),
ApiKey = case os:getenv("UNSANDBOX_API_KEY") of
false -> "unsb-sk-test0-vault-unlck-12345";
Val -> Val
end,
% Submit job
Url = "https://api.unsandbox.com/run/async",
Headers = [
{"Content-Type", "text/plain"},
{"Authorization", "Bearer " ++ ApiKey}
],
Code = "#!/usr/bin/env ruby\nputs \"Running async with auto-detect!\"",
{ok, {{_, 200, _}, _, Response}} = httpc:request(post, {Url, Headers, "text/plain", Code}, [], []),
Job = jsx:decode(list_to_binary(Response), [return_maps]),
JobId = maps:get(<<"job_id">>, Job),
io:format("Job submitted: ~s~n", [JobId]),
% Poll for results
poll(JobId).
poll(JobId) ->
ApiKey = case os:getenv("UNSANDBOX_API_KEY") of
false -> "unsb-sk-test0-vault-unlck-12345";
Val -> Val
end,
Headers = [{"Authorization", "Bearer " ++ ApiKey}],
StatusUrl = "https://api.unsandbox.com/jobs/" ++ binary_to_list(JobId),
case httpc:request(get, {StatusUrl, Headers}, [], []) of
{ok, {{_, 200, _}, _, Response}} ->
Status = jsx:decode(list_to_binary(Response), [return_maps]),
case maps:get(<<"status">>, Status) of
<<"completed">> ->
ExitCode = maps:get(<<"exit_code">>, Status, 1),
io:format("Detected: ~s~n", [maps:get(<<"detected_language">>, Status)]),
case ExitCode of
0 ->
io:format("Output: ~s~n", [maps:get(<<"stdout">>, Status)]);
_ ->
ok
end;
State when State == <<"timeout">>; State == <<"cancelled">> ->
io:format("Job ~s~n", [State]);
_ ->
timer:sleep(1000),
poll(JobId)
end;
{ok, {{_, 404, _}, _, _}} ->
io:format("Job not found~n");
{error, Reason} ->
io:format("Request failed: ~p~n", [Reason])
end.
Initial Response
{
"job_id": "job_1234567890_abc",
"status": "pending"
}
Job Result (via GET /jobs/{id})
{
"job_id": "job_1234567890_abc",
"status": "completed",
"result": {
"success": true,
"stdout": "Running async with auto-detect!\n",
"stderr": "",
"error": null,
"detected_language": "ruby",
"exit_code": 0
}
}