Console Playground

Objective-C وثائق API

بداية سريعة

نفّذ الكود بأكثر من 42 لغة باستدعاء API واحد. إليك كيفية البدء:

1

احصل على مفتاح API الخاص بك

سجّل في unsandbox.com/console للحصول على بيانات اعتماد API الخاصة بك.

2

أرسل أول طلب لك

أرسل الكود إلى نقطة نهاية التنفيذ واحصل على النتائج فورًا.

3

ابنِ شيئًا مذهلاً

استخدم تنفيذنا المعزول لوكلاء التعلم الآلي وساحات تجريب الكود والأدوات التعليمية والمزيد.

التثبيت

تحميل

# 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

عرض جميع حزم SDK الـ 42 لغة →

المصادقة

تتطلب جميع طلبات 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')"}

لا يتم إرسال مفتاحك السري أبدًا. يتحقق الخادم من التوقيعات باستخدام مفتاحك المشفر.

تم التنفيذ في (CLI)

شغّل أي ملف كود. يتم اكتشاف اللغة تلقائيًا من امتداد الملف أو 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
}
تنفيذ الكود (CLI)

شغّل مقتطفات الكود مباشرة من سطر الأوامر باستخدام خيار -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

واجهات الأوامر و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 - السماح بالحذف

عنوان URL الأساسي

يجب إرسال جميع طلبات API إلى:

https://api.unsandbox.com

تدعم API وضعين للشبكة:

  • zerotrust (default) — لا وصول للشبكة، تنفيذ معزول بالكامل
  • semitrusted — وصول للشبكة عبر وكيل الخروج، يمكنه الوصول إلى الإنترنت
التبعيات المطلوبة

تتطلب أمثلة Objective-C أدناه المكتبات الخارجية التالية:

  • curl.h or NSURLSession

تأكد من تثبيت هذه الحزم في بيئتك قبل تشغيل الأمثلة.

POST https://api.unsandbox.com/execute

نفّذ الكود فورًا وانتظر النتائج. الأفضل للسكريبتات السريعة والاستخدام التفاعلي.

معاملات الطلب

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
}
POST https://api.unsandbox.com/execute/async

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"
}
POST https://api.unsandbox.com/run

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"
}
POST https://api.unsandbox.com/run/async

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
}
GET https://api.unsandbox.com/jobs/{id}

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 execute
  • running - Job currently executing
  • completed - Job finished successfully
  • failed - Job execution failed
  • timeout - Job exceeded TTL limit
  • cancelled - 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
}
GET https://api.unsandbox.com/jobs

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"
  }
]
DELETE https://api.unsandbox.com/jobs/{id}

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 — مرئية لجميع المستخدمين (السوق)
POST https://api.unsandbox.com/images

نشر صورة من خدمة أو لقطة.

نص الطلب

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"
}
GET https://api.unsandbox.com/images

قائمة جميع الصور المملوكة أو المشتركة مع مفتاح 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"
    }
  ]
}
GET https://api.unsandbox.com/images/{id}

الحصول على معلومات تفصيلية حول صورة.

معاملات 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"
}
POST https://api.unsandbox.com/images/{id}/spawn

أنشئ خدمة جديدة باستخدام هذه الصورة كأساس.

نص الطلب

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 الزمني عند إعادة تعيين الحد

عند تجاوز حد المعدل، انتظر وقت إعادة التعيين أو قم بترقية خطتك لحدود أعلى.

POST https://api.unsandbox.com/keys/validate

تحقق من صحة زوج مفاتيح 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"
}
GET https://api.unsandbox.com/languages

يُرجع جميع لغات البرمجة المدعومة وأسمائها المستعارة.

الأسماء المستعارة الشائعة

  • node, jsjavascript
  • tstypescript
  • lispcommonlisp

الاستجابة

{
  "languages": [
    "python",
    "javascript",
    "typescript",
    "ruby",
    "go",
    "rust",
    "c",
    "cpp"
  ],
  "aliases": {
    "js": "javascript",
    "node": "javascript",
    "ts": "typescript",
    "lisp": "commonlisp"
  },
  "count": 42
}
GET https://api.unsandbox.com/shells

يُرجع جميع واجهات الأوامر و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
}
GET https://api.unsandbox.com/health

نقطة نهاية بسيطة لفحص الصحة. تُرجع حالة الخدمة.

الاستجابة

{"status": "ok"}
GET https://api.unsandbox.com/cluster

الحصول على معلومات حول مجمع الحاويات وحالة النظام.

أوضاع الشبكة

  • 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
    }
  }
}
GET https://api.unsandbox.com/pools

الحصول على حالة جميع مجمعات الحاويات المسجلة (التوسع الأفقي).

الاستجابة

{
  "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
    }
  ]
}
GET https://api.unsandbox.com/stats

الحصول على إحصائيات النظام التفصيلية بما في ذلك مقاييس الحمل والحاويات.

الاستجابة

{
  "containers": 285,
  "load_1min": "2.15",
  "load_5min": "1.89",
  "load_15min": "1.45"
}
مكتبات SDK (un-inception)

تطبيقات 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 مجاني وابدأ تنفيذ الكود في دقائق.

Export Vault

Enter a password to encrypt your exported vault. You'll need this password to import the vault on another device.

Import Vault

Select an exported vault file and enter the export password to decrypt it.