نفّذ الكود بأكثر من 42 لغة باستدعاء API واحد. إليك كيفية البدء:
احصل على مفتاح API الخاص بك
سجّل في unsandbox.com/console للحصول على بيانات اعتماد API الخاصة بك.
أرسل أول طلب لك
أرسل الكود إلى نقطة نهاية التنفيذ واحصل على النتائج فورًا.
ابنِ شيئًا مذهلاً
استخدم تنفيذنا المعزول لوكلاء التعلم الآلي وساحات تجريب الكود والأدوات التعليمية والمزيد.
تحميل
# Linux x86_64
wget https://unsandbox.com/downloads/un
chmod +x un
# Move to PATH (optional)
sudo mv un /usr/local/bin/
البناء من المصدر
# Requirements: GCC, libcurl, libwebsockets
sudo apt-get install build-essential libcurl4-openssl-dev libwebsockets-dev
# Compile
wget https://unsandbox.com/downloads/un.c
gcc -Wall -O2 -o un un.c -lcurl -lwebsockets
مكتبات SDK (un-inception)
للغات التي تحتاج وصولاً برمجيًا، استخدم تطبيقات SDK الخاصة بنا:
# Python - download un.py
wget https://unsandbox.com/cli/inception/un.py
python un.py script.py
# JavaScript - download un.js
wget https://unsandbox.com/cli/inception/un.js
node un.js script.py
# Go - download un.go
wget https://unsandbox.com/cli/inception/un.go
go run un.go script.py
تتطلب جميع طلبات API مصادقة توقيع HMAC-SHA256 للأمان.
الترويسات المطلوبة
| Header | Description |
|---|---|
Authorization |
Bearer <public_key> (your unsb-pk-xxxx key) |
X-Timestamp |
Unix timestamp in seconds (±5 min tolerance) |
X-Signature |
HMAC-SHA256 signature (lowercase hex) |
Content-Type |
application/json |
صيغة التوقيع
HMAC-SHA256(secret_key, timestamp:METHOD:path:body)
مثال على سلسلة التوقيع:
1699564800:POST:/execute:{"language":"python","code":"print('hi')"}
لا يتم إرسال مفتاحك السري أبدًا. يتحقق الخادم من التوقيعات باستخدام مفتاحك المشفر.
شغّل أي ملف كود. يتم اكتشاف اللغة تلقائيًا من امتداد الملف أو shebang.
الاستخدام الأساسي
# Python
un hello.py
# JavaScript
un app.js
# Rust (compiles and runs)
un main.rs
# C (compiles and runs)
un program.c
# Go
un main.go
مع الخيارات
# Extended timeout (5 minutes)
un --ttl 300 long_script.py
# With more CPU/RAM (4 vCPUs, 8GB RAM)
un -v 4 heavy_compute.py
# Maximum resources (8 vCPUs, 16GB RAM)
un --vcpu 8 ml_training.py
الاستجابة
يتدفق الناتج مباشرة إلى طرفيتك:
$ un hello.py
Hello from unsandbox!
$ echo $?
0
معادل API
POST /execute
{
"success": true,
"stdout": "Hello from unsandbox!\n",
"stderr": "",
"exit_code": 0,
"language": "python",
"total_time_ms": 127
}
شغّل مقتطفات الكود مباشرة من سطر الأوامر باستخدام خيار -s.
الاستخدام الأساسي
# Python
un -s python 'print("Hello World")'
# Bash
un -s bash 'echo "Hello" && date'
# JavaScript
un -s javascript 'console.log(Math.PI)'
# Ruby
un -s ruby 'puts 2 ** 100'
# Go (full program)
un -s go 'package main; import "fmt"; func main() { fmt.Println("Hi") }'
كود متعدد الأسطر
# Using heredoc
un -s python <<'EOF'
import json
data = {"name": "unsandbox", "version": 2}
print(json.dumps(data, indent=2))
EOF
اللغات المدعومة
أي من اللغات الـ 42 المدعومة تعمل مع -s:
un -s python 'print(42)'
un -s javascript 'console.log(42)'
un -s typescript 'console.log(42 as number)'
un -s ruby 'puts 42'
un -s php '<?php echo 42;'
un -s perl 'print 42'
un -s lua 'print(42)'
un -s rust 'fn main() { println!("42"); }'
un -s c 'int main() { printf("42"); return 0; }'
un -s cpp 'int main() { std::cout << 42; }'
un -s java 'class M { public static void main(String[] a) { System.out.println(42); }}'
un -s kotlin 'fun main() = println(42)'
un -s go 'package main; import "fmt"; func main() { fmt.Println(42) }'
un -s haskell 'main = print 42'
un -s elixir 'IO.puts 42'
un -s julia 'println(42)'
un -s r 'print(42)'
مرر متغيرات البيئة إلى الكود الخاص بك باستخدام خيار -e.
متغير واحد
un -e DEBUG=1 script.py
un -e API_KEY=secret app.js
متغيرات متعددة
un -e DEBUG=1 -e NAME=World -e COUNT=42 script.py
مع كود مضمّن
un -e NAME=Claude -s python 'import os; print(f"Hello {os.environ[\"NAME\"]}")'
un -e X=10 -e Y=20 -s bash 'echo "Sum: $((X + Y))"'
مثال
# config_demo.py
import os
debug = os.environ.get('DEBUG', '0')
name = os.environ.get('NAME', 'World')
if debug == '1':
print(f"Debug mode enabled")
print(f"Hello {name}!")
شغّله
$ un -e DEBUG=1 -e NAME=unsandbox config_demo.py
Debug mode enabled
Hello unsandbox!
انقل الملفات إلى الحاوية المعزولة. يستخدم CLI خيار -f؛ يستخدم API مصفوفة input_files.
استخدام CLI
# Single file
un -f data.csv process.py
# Multiple files
un -f data.csv -f config.json -f image.png script.py
# Large files (skip confirmation)
un -f large_dataset.parquet -y ml_training.py
الحدود
- الحد الأقصى للملفات
- الحد الأقصى للحجم الإجمالي
- الحد الأقصى للملف الواحد
# Files are placed in working directory
un -f data.csv -s python 'print(open("data.csv").read())'
# Process multiple input files
un -f input.json -f config.yaml script.py
{
"language": "python",
"code": "print(open('data.csv').read())",
"input_files": [
{
"filename": "data.csv",
"content": "bmFtZSxhZ2UKQWxpY2UsMzAKQm9iLDI1"
}
]
}
يجب أن يكون المحتوى بترميز Base64.
يتم وضع الملفات في دليل العمل:
- Python:
open('data.csv') - Node.js:
fs.readFileSync('data.csv') - Ruby:
File.read('data.csv') - Go:
os.ReadFile("data.csv") - Bash:
cat data.csv
انقل الملفات خارج الحاوية المعزولة. استخدم -a لجمع المخرجات من /tmp/artifacts/ أو الحصول على الملفات الثنائية المترجمة.
جمع الملفات المُولّدة
# Files in /tmp/artifacts/ are collected
un -a -o ./outputs script.py
ملف ثنائي مُجمَّع مسبقاً
# Compile C and get the binary
un -a -o ./bin main.c
# Compile Rust and get the binary
un -a -o ./bin main.rs
# Compile Go and get the binary
un -a -o ./bin main.go
ترجمة WebAssembly
# Compile to WASM (supported languages)
un --wasm -o ./wasm main.c
un --wasm -o ./wasm main.rs
مثال: التوليد والجمع
# generate_report.py
import json
import os
os.makedirs('/tmp/artifacts', exist_ok=True)
data = {"users": 100, "revenue": 50000}
with open('/tmp/artifacts/report.json', 'w') as f:
json.dump(data, f, indent=2)
print("Report generated!")
شغّله
$ un -a -o ./reports generate_report.py
Report generated!
$ ls ./reports
report.json
Zero Trust (افتراضي)
عزل شبكي كامل. لا وصول للإنترنت.
# Default - no network
un script.py
شبه موثوق
وصول للإنترنت عبر وكيل الخروج.
# Enable network access
un -n semitrusted script.py
# Or with sessions
un session -n semitrusted
حالات الاستخدام
# Zero Trust - safe for untrusted code
un -s python 'print("Isolated execution")'
# Semi-Trusted - when you need network
un -n semitrusted -s python '
import requests
r = requests.get("https://api.github.com")
print(r.status_code)
'
# Semi-Trusted session for development
un session -n semitrusted --shell bash
ابدأ جلسة واجهة أوامر تفاعلية في حاوية معزولة.
جلسة أساسية
# Default bash shell
un session
# Choose your shell
un session --shell zsh
un session --shell fish
جلسات REPL
# Python REPL
un session --shell python3
un session --shell ipython
un session --shell bpython
# Node.js REPL
un session --shell node
# Ruby REPL
un session --shell irb
# Other REPLs
un session --shell julia
un session --shell ghci # Haskell
un session --shell iex # Elixir
خيارات الجلسة
# With network access
un session -n semitrusted
# With persistence (can reconnect)
un session --tmux
un session --screen
# With timeout (1 hour)
un session --ttl 3600
# Full audit recording
un session --audit -o ./logs
معادل API
POST /sessions
{
"session_id": "sess_xyz789",
"websocket_url": "wss://api.unsandbox.com/sessions/sess_xyz789/shell",
"status": "running"
}
قائمة المهام النشطة
un session --list
الناتج
Active sessions: 2
SESSION ID CONTAINER SHELL TTL STATUS
sess_abc123... unsb-vm-12345 python3 45m30s active
sess_def456... unsb-vm-67890 bash 1h2m active
الحصول على تفاصيل الجلسة
un session --info sess_abc123
معادل API
GET /sessions and GET /sessions/{id}
{
"sessions": [
{
"session_id": "sess_abc123",
"status": "running",
"network_mode": "zerotrust",
"shell": "python3"
}
]
}
إعادة الاتصال بالجلسات الدائمة (يتطلب --tmux أو --screen).
إنشاء جلسة دائمة
# With tmux (recommended)
un session --tmux
# With screen
un session --screen
فصل
# tmux: Press Ctrl+b then d
# screen: Press Ctrl+a then d
الخصم
# By session ID
un session --attach sess_abc123
# By container name
un session --attach unsb-vm-12345
إنهاء الجلسة
# Kill by ID
un session --kill sess_abc123
# Kill by container name
un session --kill unsb-vm-12345
معادل API
DELETE /sessions/{id}
{"status": "terminated"}
واجهات الأوامر وREPLs المتاحة للجلسات التفاعلية:
واجهات الأوامر
bash, dash, sh, zsh, fish, ksh
tcsh, csh, elvish, xonsh, ash
REPLs
# Python
python3, bpython, ipython
# JavaScript
node
# Ruby
ruby, irb
# Other
lua, php, perl, guile, scheme
ghci, erl, iex, sbcl, clisp
r, julia, clojure
معادل API
GET /shells يُرجع القائمة الكاملة لواجهات الأوامر المتاحة.
جمّد الجلسات لتوفير الموارد مع الحفاظ على الحالة.
تجميد الجلسة
un session --freeze sess_abc123
إلغاء تجميد الجلسة
un session --unfreeze sess_abc123
معادل API
POST /sessions/{id}/freeze
{"status": "frozen"}
POST /sessions/{id}/unfreeze
{"status": "running", "unfreeze_time_ms": 1250}
أنشئ لقطات لحظية لحالة الجلسة.
إنشاء لقطة
# With name
un session --snapshot sess_abc123 --name "before-upgrade"
# Quick snapshot (auto-generated name)
un session --snapshot sess_abc123
الاستعادة من لقطة
un session --restore snap_xyz789
معادل API
POST /sessions/{id}/snapshot
{
"snapshot_id": "snap_abc123",
"name": "before-upgrade",
"size_bytes": 52428800
}
POST /sessions/{id}/restore
{"status": "restored"}
Create long-running services with automatic HTTPS at *.on.unsandbox.com. TLS certificates are provisioned automatically via Let's Encrypt. Custom domains supported via CNAME.
خدمة أساسية
# Simple web server
un service --name myapp --ports 80 --bootstrap "python -m http.server 80"
# With multiple ports
un service --name api --ports 80,443 --bootstrap "./start.sh"
مع الملفات
# Deploy app tarball
un service --name blog --ports 8000 \
-f app.tar.gz \
--bootstrap "tar xzf app.tar.gz && cd app && ./start.sh"
النطاقات المخصصة
un service --name api --ports 80 \
--domains api.example.com,www.api.example.com \
--bootstrap "./start.sh"
مستوى الخدمة:
# Web service (default)
un service --name web --ports 80
# Minecraft server
un service --name mc --type minecraft --bootstrap ./setup.sh
# Game server types
un service --name game --type mumble
un service --name game --type teamspeak
un service --name game --type source
معادل API
POST /services
{
"service_id": "svc_abc123",
"name": "myapp",
"url": "https://myapp.on.unsandbox.com",
"status": "starting",
"ports": [80]
}
قائمة الخدمات
un service --list
الحصول على معلومات الخدمة
un service --info svc_abc123
تجميد/إلغاء تجميد الخدمة
# Freeze (auto-unfreezes on HTTP request)
un service --freeze svc_abc123
# Manual unfreeze
un service --unfreeze svc_abc123
قفل/إلغاء القفل
# Prevent accidental deletion
un service --lock svc_abc123
# Allow deletion
un service --unlock svc_abc123
تدمير الخدمة
un service --destroy svc_abc123
تم الوصول إلى نقطة نهاية API
GET /services- قائمة جميع الخدماتGET /services/{id}- الحصول على تفاصيل الخدمةPOST /services/{id}/freeze- تجميد الخدمةPOST /services/{id}/unfreeze- إلغاء تجميد الخدمةPOST /services/{id}/lock- قفل الخدمةPOST /services/{id}/unlock- فتح القبوDELETE /services/{id}- تدمير الخدمة
إلغاء التجميد التلقائي
عند التفعيل، تستيقظ الخدمات المجمدة تلقائيًا عند تلقي طلب HTTP.
# Enable auto-unfreeze (default for new services)
un service --auto-unfreeze svc_abc123
# Disable auto-unfreeze
un service --no-auto-unfreeze svc_abc123
عرض صفحة التجميد
تحكم فيما يراه الزوار عند الوصول إلى خدمة مجمدة.
# Show HTML payment page (default)
un service --show-freeze-page svc_abc123
# Return JSON error instead
un service --no-show-freeze-page svc_abc123
معادل API
PATCH /services/{id}
# Enable auto-unfreeze
{"unfreeze_on_demand": true}
# Disable freeze page (return JSON error)
{"show_freeze_page": false}
سلوك صفحة التجميد
show_freeze_page: true- يعرض صفحة HTML مع خيارات الدفعshow_freeze_page: false- يُرجع JSON: {"error": "service_frozen"}
استخدم وضع JSON لخدمات API حيث استجابات HTML قد تُعطل العملاء.
عرض سجلات التمهيد
# All logs
un service --logs svc_abc123
# Last 9000 lines
un service --tail svc_abc123
تنفيذ الكود
# Run any command
un service --execute svc_abc123 'ls -la'
# Check service status
un service --execute svc_abc123 'systemctl status myapp'
# View application logs
un service --execute svc_abc123 'journalctl -u myapp -n 50'
عرض سكريبت التمهيد
# Print to stdout
un service --dump-bootstrap svc_abc123
# Save to file
un service --dump-bootstrap svc_abc123 backup.sh
معادل API
GET /services/{id}/logs
{"log": "Bootstrap started...\nInstalling...\nServer listening on port 80"}
POST /services/{id}/execute
{
"stdout": "...",
"stderr": "",
"exit_code": 0
}
تخزين مشفر لأسرار الخدمة. يتم حقن المتغيرات عند بدء الحاوية أو إلغاء تجميدها.
تعيين متغيرات البيئة
# Using the API (PUT /services/{id}/env)
# Content-Type: text/plain
# Body: .env format
DATABASE_URL=postgres://user:pass@host/db
API_SECRET=abc123
DEBUG=false
الحصول على حالة الخزنة
GET /services/{id}/env
{
"exists": true,
"variable_count": 3,
"updated_at": "2026-01-14T12:00:00Z"
}
تصدير الخزنة المفكوكة التشفير
POST /services/{id}/env/export
{"env": "DATABASE_URL=postgres://...\nAPI_SECRET=abc123\nDEBUG=false"}
حذف
DELETE /services/{id}/env
{"status": "deleted"}
إعادة تشغيل التمهيد
# Re-run existing bootstrap
un service --redeploy svc_abc123
# Redeploy with new bootstrap
un service --redeploy svc_abc123 --bootstrap ./new-setup.sh
إنشاء لقطة للخدمة
# Standard snapshot (pauses briefly)
un service --snapshot svc_abc123 --name "stable-v1.0"
# Hot snapshot (no pause)
un service --snapshot svc_abc123 --hot
معادل API
POST /services/{id}/redeploy
{"state": "redeploying"}
POST /services/{id}/snapshot
{
"snapshot_id": "snap_def456",
"name": "stable-v1.0",
"size_bytes": 104857600
}
قائمة جميع اللقطات
un snapshot --list
الناتج
Snapshots: 3
SNAPSHOT ID NAME SOURCE SIZE CREATED
snap_a1b2-c3d4-e5f6-g7h8 before-upgrade session 512 MB 2h ago
snap_i9j0-k1l2-m3n4-o5p6 stable-v1.0 service 1.2 GB 1d ago
snap_q7r8-s9t0-u1v2-w3x4 dev-checkpoint session 256 MB 3d ago
الحصول على معلومات اللقطة
un snapshot --info snap_a1b2-c3d4-e5f6-g7h8
حذف اللقطة
un snapshot --delete snap_a1b2-c3d4-e5f6-g7h8
معادل API
GET /snapshots
{
"snapshots": [
{
"snapshot_id": "snap_abc123",
"name": "before-upgrade",
"source_type": "session",
"size_bytes": 52428800
}
]
}
الاستعادة إلى الأصل
# Restore session from snapshot
un session --restore snap_abc123
# Restore service from snapshot
un service --restore snap_def456
استنساخ إلى حاوية جديدة
POST /snapshots/{id}/clone
# Clone to new session
{
"type": "session",
"shell": "bash"
}
# Clone to new service
{
"type": "service",
"name": "cloned-app"
}
الاستجابة
استنساخ إلى جلسة:
{"session_id": "sess_new123"}
استنساخ إلى خدمة:
{
"service_id": "svc_new456",
"url": "https://cloned-app.on.unsandbox.com"
}
قفل/إلغاء قفل اللقطات
POST /snapshots/{id}/lock - منع الحذف
POST /snapshots/{id}/unlock - السماح بالحذف
يجب إرسال جميع طلبات API إلى:
https://api.unsandbox.com
تدعم API وضعين للشبكة:
- zerotrust (default) — لا وصول للشبكة، تنفيذ معزول بالكامل
- semitrusted — وصول للشبكة عبر وكيل الخروج، يمكنه الوصول إلى الإنترنت
تتطلب أمثلة Objective-C أدناه المكتبات الخارجية التالية:
curl.h or NSURLSession
تأكد من تثبيت هذه الحزم في بيئتك قبل تشغيل الأمثلة.
نفّذ الكود فورًا وانتظر النتائج. الأفضل للسكريبتات السريعة والاستخدام التفاعلي.
معاملات الطلب
| 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 | |
vcpu |
integer | vCPUs 1-8 (each includes 2GB RAM) | |
input_files |
array | الملفات المراد رفعها (انظر ملفات الإدخال) |
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonHMAC.h>
NSString *getEnvOrDefault(NSString *name, NSString *defaultValue) {
const char *env = getenv([name UTF8String]);
return env ? [NSString stringWithUTF8String:env] : defaultValue;
}
NSString *hmacSha256Hex(NSString *key, NSString *data) {
const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSMutableString *hash = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[hash appendFormat:@"%02x", cHMAC[i]];
}
return hash;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *publicKey = getEnvOrDefault(@"UNSANDBOX_PUBLIC_KEY", @"unsb-pk-test-0000-0000-0001");
NSString *secretKey = getEnvOrDefault(@"UNSANDBOX_SECRET_KEY", @"unsb-sk-test0-vault-unlck-12345");
NSString *path = @"/execute";
NSDictionary *payload = @{
@"language": @"python",
@"code": @"print('Hello from unsandbox!')"
};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:payload options:0 error:nil];
NSString *body = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSString *timestamp = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
NSString *message = [NSString stringWithFormat:@"%@:POST:%@:%@", timestamp, path, body];
NSString *signature = hmacSha256Hex(secretKey, message);
NSString *urlString = [NSString stringWithFormat:@"https://api.unsandbox.com%@", path];
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"Bearer %@", publicKey] forHTTPHeaderField:@"Authorization"];
[request setValue:timestamp forHTTPHeaderField:@"X-Timestamp"];
[request setValue:signature forHTTPHeaderField:@"X-Signature"];
[request setHTTPBody:jsonData];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (data) {
NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", result);
}
dispatch_semaphore_signal(semaphore);
}];
[task resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
return 0;
}
{
"success": true,
"stdout": "Hello from unsandbox!\n",
"stderr": "",
"exit_code": 0,
"language": "python",
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"network_mode": "zerotrust",
"total_time_ms": 236
}
{
"success": false,
"stdout": "",
"stderr": "SyntaxError: invalid syntax\n",
"exit_code": 1,
"language": "python",
"job_id": "b2c3d4e5-f6a7-8901-bcde-f23456789012",
"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.
معاملات الطلب
| 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 | |
vcpu |
integer | vCPUs 1-8 (each includes 2GB RAM) | |
input_files |
array | الملفات المراد رفعها (انظر ملفات الإدخال) |
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonHMAC.h>
NSString *publicKey;
NSString *secretKey;
NSString *getEnvOrDefault(NSString *name, NSString *defaultValue) {
const char *env = getenv([name UTF8String]);
return env ? [NSString stringWithUTF8String:env] : defaultValue;
}
NSString *hmacSha256Hex(NSString *key, NSString *data) {
const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSMutableString *hash = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[hash appendFormat:@"%02x", cHMAC[i]];
}
return hash;
}
NSMutableURLRequest *createRequest(NSString *method, NSString *path, NSString *body) {
NSString *timestamp = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
NSString *message = [NSString stringWithFormat:@"%@:%@:%@:%@", timestamp, method, path, body ?: @""];
NSString *signature = hmacSha256Hex(secretKey, message);
NSString *urlString = [NSString stringWithFormat:@"https://api.unsandbox.com%@", path];
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:method];
[request setValue:[NSString stringWithFormat:@"Bearer %@", publicKey] forHTTPHeaderField:@"Authorization"];
[request setValue:timestamp forHTTPHeaderField:@"X-Timestamp"];
[request setValue:signature forHTTPHeaderField:@"X-Signature"];
return request;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
publicKey = getEnvOrDefault(@"UNSANDBOX_PUBLIC_KEY", @"unsb-pk-test-0000-0000-0001");
secretKey = getEnvOrDefault(@"UNSANDBOX_SECRET_KEY", @"unsb-sk-test0-vault-unlck-12345");
NSDictionary *payload = @{
@"language": @"rust",
@"code": @"fn main() { println!(\"Computing...\"); }",
@"ttl": @300
};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:payload options:0 error:nil];
NSString *body = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSMutableURLRequest *request = createRequest(@"POST", @"/execute/async", body);
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:jsonData];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (data) {
NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"Job submitted: %@", result);
// Parse job_id and poll for results
}
dispatch_semaphore_signal(semaphore);
}];
[task resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
return 0;
}
{
"job_id": "ba943906-4ea6-a61c-9980-445f459368d",
"status": "pending",
"message": "Job accepted for execution"
}
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 |
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonHMAC.h>
NSString *getEnvOrDefault(NSString *name, NSString *defaultValue) {
const char *env = getenv([name UTF8String]);
return env ? [NSString stringWithUTF8String:env] : defaultValue;
}
NSString *hmacSha256Hex(NSString *key, NSString *data) {
const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSMutableString *hash = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[hash appendFormat:@"%02x", cHMAC[i]];
}
return hash;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *publicKey = getEnvOrDefault(@"UNSANDBOX_PUBLIC_KEY", @"unsb-pk-test-0000-0000-0001");
NSString *secretKey = getEnvOrDefault(@"UNSANDBOX_SECRET_KEY", @"unsb-sk-test0-vault-unlck-12345");
NSString *path = @"/run";
NSString *code = @"#!/usr/bin/env python3\nprint(\"Language auto-detected!\")";
NSString *timestamp = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
NSString *message = [NSString stringWithFormat:@"%@:POST:%@:%@", timestamp, path, code];
NSString *signature = hmacSha256Hex(secretKey, message);
NSString *urlString = [NSString stringWithFormat:@"https://api.unsandbox.com%@", path];
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:@"text/plain" forHTTPHeaderField:@"Content-Type"];
[request setValue:[NSString stringWithFormat:@"Bearer %@", publicKey] forHTTPHeaderField:@"Authorization"];
[request setValue:timestamp forHTTPHeaderField:@"X-Timestamp"];
[request setValue:signature forHTTPHeaderField:@"X-Signature"];
[request setHTTPBody:[code dataUsingEncoding:NSUTF8StringEncoding]];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (data) {
NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", result);
}
dispatch_semaphore_signal(semaphore);
}];
[task resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
return 0;
}
{
"success": true,
"stdout": "Language auto-detected!\n",
"stderr": "",
"exit_code": 0,
"language": "python",
"detected_language": "python",
"job_id": "f6a7b8c9-d0e1-2345-fghi-678901234567",
"network_mode": "zerotrust"
}
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 |
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonHMAC.h>
NSString *publicKey;
NSString *secretKey;
NSString *getEnvOrDefault(NSString *name, NSString *defaultValue) {
const char *env = getenv([name UTF8String]);
return env ? [NSString stringWithUTF8String:env] : defaultValue;
}
NSString *hmacSha256Hex(NSString *key, NSString *data) {
const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSMutableString *hash = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[hash appendFormat:@"%02x", cHMAC[i]];
}
return hash;
}
NSMutableURLRequest *createRequest(NSString *method, NSString *path, NSString *body) {
NSString *timestamp = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
NSString *message = [NSString stringWithFormat:@"%@:%@:%@:%@", timestamp, method, path, body ?: @""];
NSString *signature = hmacSha256Hex(secretKey, message);
NSString *urlString = [NSString stringWithFormat:@"https://api.unsandbox.com%@", path];
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:method];
[request setValue:[NSString stringWithFormat:@"Bearer %@", publicKey] forHTTPHeaderField:@"Authorization"];
[request setValue:timestamp forHTTPHeaderField:@"X-Timestamp"];
[request setValue:signature forHTTPHeaderField:@"X-Signature"];
return request;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
publicKey = getEnvOrDefault(@"UNSANDBOX_PUBLIC_KEY", @"unsb-pk-test-0000-0000-0001");
secretKey = getEnvOrDefault(@"UNSANDBOX_SECRET_KEY", @"unsb-sk-test0-vault-unlck-12345");
NSString *code = @"#!/usr/bin/env ruby\nputs \"Running async with auto-detect!\"";
NSMutableURLRequest *request = createRequest(@"POST", @"/run/async", code);
[request setValue:@"text/plain" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:[code dataUsingEncoding:NSUTF8StringEncoding]];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (data) {
NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"Job submitted: %@", result);
// Parse job_id and poll for results
}
dispatch_semaphore_signal(semaphore);
}];
[task resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
return 0;
}
{
"job_id": "ba943906-4ea6-a61c-9980-445f459368d",
"status": "pending",
"detected_language": "python",
"message": "Job accepted for execution"
}
Via GET /jobs/{id}
{
"job_id": "a7b8c9d0-e1f2-3456-ghij-789012345678",
"status": "completed",
"created_at": "2025-01-11T12:00:00Z",
"started_at": "2025-01-11T12:00:01Z",
"completed_at": "2025-01-11T12:00:02Z",
"success": true,
"stdout": "Running async with auto-detect!\n",
"stderr": "",
"exit_code": 0,
"language": "ruby",
"network_mode": "zerotrust",
"total_time_ms": 1234
}
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 |
Possible Status Values
pending- Job queued, waiting to executerunning- Job currently executingcompleted- Job finished successfullyfailed- Job execution failedtimeout- Job exceeded TTL limitcancelled- Job was cancelled via DELETE
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonHMAC.h>
NSString *getEnvOrDefault(NSString *name, NSString *defaultValue) {
const char *env = getenv([name UTF8String]);
return env ? [NSString stringWithUTF8String:env] : defaultValue;
}
NSString *hmacSha256Hex(NSString *key, NSString *data) {
const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSMutableString *hash = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[hash appendFormat:@"%02x", cHMAC[i]];
}
return hash;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *publicKey = getEnvOrDefault(@"UNSANDBOX_PUBLIC_KEY", @"unsb-pk-test-0000-0000-0001");
NSString *secretKey = getEnvOrDefault(@"UNSANDBOX_SECRET_KEY", @"unsb-sk-test0-vault-unlck-12345");
NSString *jobId = @"job_1234567890_abc";
NSString *path = [NSString stringWithFormat:@"/jobs/%@", jobId];
NSString *timestamp = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
NSString *message = [NSString stringWithFormat:@"%@:GET:%@:", timestamp, path];
NSString *signature = hmacSha256Hex(secretKey, message);
NSString *urlString = [NSString stringWithFormat:@"https://api.unsandbox.com%@", path];
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
[request setValue:[NSString stringWithFormat:@"Bearer %@", publicKey] forHTTPHeaderField:@"Authorization"];
[request setValue:timestamp forHTTPHeaderField:@"X-Timestamp"];
[request setValue:signature forHTTPHeaderField:@"X-Signature"];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (data) {
NSDictionary *job = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", job);
}
dispatch_semaphore_signal(semaphore);
}];
[task resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
return 0;
}
{
"job_id": "c3d4e5f6-a7b8-9012-cdef-345678901234",
"status": "completed",
"created_at": "2025-01-11T12:00:00Z",
"started_at": "2025-01-11T12:00:01Z",
"completed_at": "2025-01-11T12:00:05Z",
"success": true,
"stdout": "Hello from unsandbox!\n",
"stderr": "",
"exit_code": 0,
"language": "python",
"network_mode": "zerotrust",
"total_time_ms": 4021
}
List all active (pending or running) jobs for your API key. Useful for monitoring multiple async executions.
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonHMAC.h>
NSString *getEnvOrDefault(NSString *name, NSString *defaultValue) {
const char *env = getenv([name UTF8String]);
return env ? [NSString stringWithUTF8String:env] : defaultValue;
}
NSString *hmacSha256Hex(NSString *key, NSString *data) {
const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSMutableString *hash = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[hash appendFormat:@"%02x", cHMAC[i]];
}
return hash;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *publicKey = getEnvOrDefault(@"UNSANDBOX_PUBLIC_KEY", @"unsb-pk-test-0000-0000-0001");
NSString *secretKey = getEnvOrDefault(@"UNSANDBOX_SECRET_KEY", @"unsb-sk-test0-vault-unlck-12345");
NSString *path = @"/jobs";
NSString *timestamp = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
NSString *message = [NSString stringWithFormat:@"%@:GET:%@:", timestamp, path];
NSString *signature = hmacSha256Hex(secretKey, message);
NSString *urlString = [NSString stringWithFormat:@"https://api.unsandbox.com%@", path];
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
[request setValue:[NSString stringWithFormat:@"Bearer %@", publicKey] forHTTPHeaderField:@"Authorization"];
[request setValue:timestamp forHTTPHeaderField:@"X-Timestamp"];
[request setValue:signature forHTTPHeaderField:@"X-Signature"];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (data) {
NSArray *jobs = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", jobs);
}
dispatch_semaphore_signal(semaphore);
}];
[task resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
return 0;
}
[
{
"job_id": "ba943906-4ea6-a61c-9980-445f459368d",
"status": "completed",
"language": "python",
"network_mode": "zerotrust",
"created_at": "2025-01-11T12:00:00Z"
},
{
"job_id": "c1d2e3f4-5678-90ab-cdef-1234567890ab",
"status": "running",
"language": "rust",
"network_mode": "zerotrust",
"created_at": "2025-01-11T12:01:00Z"
}
]
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 |
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonHMAC.h>
NSString *getEnvOrDefault(NSString *name, NSString *defaultValue) {
const char *env = getenv([name UTF8String]);
return env ? [NSString stringWithUTF8String:env] : defaultValue;
}
NSString *hmacSha256Hex(NSString *key, NSString *data) {
const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];
const char *cData = [data cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
NSMutableString *hash = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[hash appendFormat:@"%02x", cHMAC[i]];
}
return hash;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *publicKey = getEnvOrDefault(@"UNSANDBOX_PUBLIC_KEY", @"unsb-pk-test-0000-0000-0001");
NSString *secretKey = getEnvOrDefault(@"UNSANDBOX_SECRET_KEY", @"unsb-sk-test0-vault-unlck-12345");
NSString *jobId = @"job_1234567890_abc";
NSString *path = [NSString stringWithFormat:@"/jobs/%@", jobId];
NSString *timestamp = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
NSString *message = [NSString stringWithFormat:@"%@:DELETE:%@:", timestamp, path];
NSString *signature = hmacSha256Hex(secretKey, message);
NSString *urlString = [NSString stringWithFormat:@"https://api.unsandbox.com%@", path];
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"DELETE"];
[request setValue:[NSString stringWithFormat:@"Bearer %@", publicKey] forHTTPHeaderField:@"Authorization"];
[request setValue:timestamp forHTTPHeaderField:@"X-Timestamp"];
[request setValue:signature forHTTPHeaderField:@"X-Signature"];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (data) {
NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@", result);
}
dispatch_semaphore_signal(semaphore);
}];
[task resume];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
return 0;
}
{
"job_id": "ba943906-4ea6-a61c-9980-445f459368d",
"status": "cancelled",
"message": "Job cancelled",
"completed_at": "2025-01-11T12:00:30Z",
"success": true,
"stdout": " Compiling hello v0.1.0 (/tmp)\n",
"artifacts": []
}
الصور هي لقطات حاويات مستقلة وقابلة للنقل تبقى بعد حذف الحاوية. على عكس اللقطات (المرتبطة بدورة حياة الحاوية)، يمكن للصور أن:
- منقولة بين مفاتيح API
- مشتركة مع مستخدمين محددين عبر الثقة
- جُعلت عامة للسوق
- تُستخدم لإنشاء خدمات جديدة
مستويات الرؤية
- private — المالك فقط يمكنه الرؤية/الاستخدام (افتراضي)
- unlisted — مخفية من القائمة، لكن يمكن مشاركتها عبر الثقة
- public — مرئية لجميع المستخدمين (السوق)
نشر صورة من خدمة أو لقطة.
نص الطلب
| Parameter | Type | Required | Description |
|---|---|---|---|
source_type |
string | ✓ | "service" or "snapshot" |
source_id |
string | ✓ | ID of service or snapshot |
name |
string | User-friendly name | |
description |
string | Optional description |
البيانات الوصفية للطلب:
{
"source_type": "service",
"source_id": "unsb-service-abc123",
"name": "my-app-v1.0",
"description": "Production-ready app image"
}
الاستجابة
{
"id": "unsb-image-xyz789",
"name": "my-app-v1.0",
"description": "Production-ready app image",
"source_type": "service",
"source_id": "unsb-service-abc123",
"fingerprint": "abc123def456...",
"size_bytes": 524288000,
"visibility": "private",
"locked": false,
"owner_api_key": "unsb-pk-xxxx-xxxx-xxxx-xxxx",
"created_at": "2025-01-11T12:00:00Z"
}
قائمة جميع الصور المملوكة أو المشتركة مع مفتاح API الخاص بك.
نقاط النهاية ذات الصلة
GET /images/public— قائمة صور السوقGET /images/owned— قائمة صورك فقطGET /images/shared— قائمة الصور المشتركة معك
الاستجابة
{
"images": [
{
"id": "unsb-image-xyz789",
"name": "my-app-v1.0",
"fingerprint": "abc123...",
"size_bytes": 524288000,
"visibility": "private",
"locked": false,
"created_at": "2025-01-11T12:00:00Z"
}
]
}
الحصول على معلومات تفصيلية حول صورة.
معاملات URL
| Parameter | Type | Description |
|---|---|---|
id |
string | Image ID (unsb-image-xxxx) |
الاستجابة
{
"id": "unsb-image-xyz789",
"name": "my-app-v1.0",
"description": "Production-ready app image",
"source_type": "service",
"source_id": "unsb-service-abc123",
"fingerprint": "abc123def456...",
"node": "cammy",
"size_bytes": 524288000,
"visibility": "private",
"locked": false,
"owner_api_key": "unsb-pk-xxxx-xxxx-xxxx-xxxx",
"trusted_keys": [],
"created_at": "2025-01-11T12:00:00Z"
}
أنشئ خدمة جديدة باستخدام هذه الصورة كأساس.
نص الطلب
| Parameter | Type | Required | Description |
|---|---|---|---|
name |
string | Service name | |
ports |
array | Ports to expose | |
network_mode |
string | "zerotrust" or "semitrusted" | |
bootstrap |
string | Optional bootstrap script |
البيانات الوصفية للطلب:
{
"name": "my-app-instance",
"ports": [8080],
"network_mode": "semitrusted"
}
الاستجابة
{
"service_id": "unsb-service-xyz789",
"name": "my-app-instance",
"source_image": "unsb-image-abc123",
"state": "starting"
}
الرؤية
POST /images/{id}/visibility
{"visibility": "unlisted"}
استنساخ الصورة
POST /images/{id}/clone
{
"name": "my-copy-of-app",
"description": "My personal copy"
}
قفل/إلغاء القفل
POST /images/{id}/lock— منع الحذفPOST /images/{id}/unlock— السماح بالحذف
حذف الصورة
DELETE /images/{id}
منح الوصول
POST /images/{id}/grant
{
"api_key": "unsb-pk-xxxx-xxxx-xxxx-xxxx"
}
إلغاء الوصول
POST /images/{id}/revoke
{
"api_key": "unsb-pk-xxxx-xxxx-xxxx-xxxx"
}
قائمة المفاتيح الموثوقة
GET /images/{id}/trusted
{
"trusted_keys": [
"unsb-pk-aaaa-bbbb-cccc-dddd",
"unsb-pk-1111-2222-3333-4444"
]
}
نقل الملكية
POST /images/{id}/transfer
{
"to_api_key": "unsb-pk-xxxx-xxxx-xxxx-xxxx"
}
تُرجع API رموز حالة HTTP قياسية مع معلومات خطأ مفصلة.
| Code | Status | Description |
|---|---|---|
200 |
OK | نجح الطلب (تحقق من حقل 'success' لنتيجة التنفيذ) |
400 |
Bad Request | نص طلب غير صالح أو معاملات مطلوبة مفقودة |
401 |
Unauthorized | مفتاح API أو التوقيع مفقود أو غير صالح |
403 |
Forbidden | الحساب معلق أو الميزة غير متاحة |
404 |
Not Found | معرّف المهمة غير موجود أو منتهي الصلاحية |
429 |
Too Many Requests | تم تجاوز حد المعدل |
500 |
Internal Error | خطأ في الخادم، يرجى إعادة المحاولة |
صيغة استجابة الخطأ
{
"error": "Invalid API key",
"code": "INVALID_KEY",
"details": "The provided public key does not exist"
}
يتم فرض حدود المعدل لكل مفتاح API وتختلف حسب الخطة. انظر التسعير لتفاصيل الخطة →
ترويسات حد المعدل
تتضمن ترويسات الاستجابة معلومات حد المعدل:
X-RateLimit-Limit— الحد الأقصى للطلبات في الدقيقةX-RateLimit-Remaining— الطلبات المتبقيةX-RateLimit-Reset— طابع Unix الزمني عند إعادة تعيين الحد
عند تجاوز حد المعدل، انتظر وقت إعادة التعيين أو قم بترقية خطتك لحدود أعلى.
تحقق من صحة زوج مفاتيح API الخاص بك واسترجع تهيئته بما في ذلك حدود المعدل وحدود التزامنية وحالة انتهاء الصلاحية.
هذا مفيد لـ:
- جارٍ التحقق من صلاحية زوج المفاتيح
- عرض حدودك الحالية
- بناء واجهات إدارة المفاتيح
- مراقبة انتهاء صلاحية المفتاح
المصادقة
يستخدم مصادقة HMAC القياسية (مثل جميع نقاط النهاية الأخرى).
# Sign the request
TIMESTAMP=$(date +%s)
PUBLIC_KEY="unsb-pk-xxxx-xxxx-xxxx-xxxx"
SECRET_KEY="unsb-sk-xxxxx-xxxxx-xxxxx-xxxxx"
BODY="{}"
MESSAGE="${TIMESTAMP}:POST:/keys/validate:${BODY}"
SIGNATURE=$(echo -n "$MESSAGE" | openssl dgst -sha256 -hmac "$SECRET_KEY" | cut -d' ' -f2)
# Make the request
curl -X POST https://api.unsandbox.com/keys/validate \
-H "Authorization: Bearer $PUBLIC_KEY" \
-H "X-Timestamp: $TIMESTAMP" \
-H "X-Signature: $SIGNATURE" \
-H "Content-Type: application/json" \
-d "$BODY"
{
"valid": true,
"public_key": "unsb-pk-xxxx-xxxx-xxxx-xxxx",
"rate_per_minute": 60,
"burst": 10,
"concurrency_limit": 5,
"expires_at": "2026-12-31T23:59:59Z",
"tier": "Tier 3"
}
يُرجع جميع لغات البرمجة المدعومة وأسمائها المستعارة.
الأسماء المستعارة الشائعة
node,js→javascriptts→typescriptlisp→commonlisp
الاستجابة
{
"languages": [
"python",
"javascript",
"typescript",
"ruby",
"go",
"rust",
"c",
"cpp"
],
"aliases": {
"js": "javascript",
"node": "javascript",
"ts": "typescript",
"lisp": "commonlisp"
},
"count": 42
}
يُرجع جميع واجهات الأوامر وREPLs المدعومة للجلسات التفاعلية، مجمعة حسب الفئة.
الفئات
- unix — bash, dash, sh, zsh, fish, ksh
- python — python, python3, ipython, bpython
- javascript — node
- ruby — ruby, irb
- lisp — scheme, guile, sbcl, clisp, clojure
- erlang — erl, iex
- data — r, julia, sqlite3
الاستجابة
{
"shells": [
"bash", "bpython", "clisp",
"clojure", "dash", "fish",
"ghci", "guile", "iex",
"ipython", "irb", "julia"
],
"categories": {
"unix": ["bash", "dash", "sh", "zsh", "fish"],
"python": ["python", "python3", "ipython", "bpython"],
"javascript": ["node"],
"ruby": ["ruby", "irb"],
"lisp": ["scheme", "guile", "sbcl", "clisp", "clojure"]
},
"count": 35
}
نقطة نهاية بسيطة لفحص الصحة. تُرجع حالة الخدمة.
الاستجابة
{"status": "ok"}
الحصول على معلومات حول مجمع الحاويات وحالة النظام.
أوضاع الشبكة
- zerotrust_only — Only isolated containers
- semitrusted_only — Only network-enabled containers
- hybrid — Both types available
الاستجابة
{
"mode": "pooled",
"pool_size": 288,
"allocated": 5,
"available": 280,
"spawning": 0,
"total_containers": 285,
"network_mode": "hybrid",
"network_breakdown": {
"zerotrust": {
"allocated": 2,
"available": 140,
"total": 142
},
"semitrusted": {
"allocated": 3,
"available": 140,
"services": 1,
"total": 143
}
}
}
الحصول على حالة جميع مجمعات الحاويات المسجلة (التوسع الأفقي).
الاستجابة
{
"pool_count": 2,
"total_capacity": 288,
"total_allocated": 8,
"total_available": 280,
"pools": [
{
"id": "pool_manager@cammy",
"allocated": 4,
"available": 140,
"total": 144
},
{
"id": "pool_manager@ai",
"allocated": 4,
"available": 140,
"total": 144
}
]
}
الحصول على إحصائيات النظام التفصيلية بما في ذلك مقاييس الحمل والحاويات.
الاستجابة
{
"containers": 285,
"load_1min": "2.15",
"load_5min": "1.89",
"load_15min": "1.45"
}
تطبيقات SDK كاملة مع مصادقة HMAC بـ 42 لغة. استخدمها عندما تحتاج وصولاً برمجيًا من الكود الخاص بك.
تصفح جميع تطبيقات اللغات الـ 42 →
نمط الاستخدام
# Download the SDK for your language
wget https://unsandbox.com/cli/inception/un.py
# Use it in your code
# un.py provides: execute_code(), create_session(), create_service()
# Or run it as a CLI
python un.py script.py
python un.py -s python 'print("Hello")'
هل أنت مستعد للبدء؟
احصل على مفتاح API مجاني وابدأ تنفيذ الكود في دقائق.