API نسخهٔ ۱ — پایدار

مرجع API تونل سرور اکسیت

ساخت و حذفِ کاربرانِ WireGuard-روی-TCP روی سرورِ اکسیتِ خودتان، از سامانهٔ خودتان. با فعال‌کردنِ اجرای خودکار، peer هم روی روترِ MikroTik شما ساخته می‌شود — بدونِ اینکه کسی دستوری را دستی اجرا کند.

https://servernet.cloud/developers/tunnel · ۱۴۰۵/۰۶/۰۳

GET /api/v1/tunnel/servers سرورهای اکسیت که تونل TCP دارند tunnel:read
GET /api/v1/tunnel/{service}/accounts فهرست کاربران و وضعیتشان tunnel:read
POST /api/v1/tunnel/{service}/accounts ساخت کاربر — کلید خصوصی فقط یک بار tunnel:write
DELETE /api/v1/tunnel/{service}/accounts/{name} حذف کاربر tunnel:write
GET /api/v1/tunnel/{service}/agent وضعیت اجرای خودکار روی روتر tunnel:read
POST /api/v1/tunnel/{service}/agent فعال‌سازی اجرای خودکار — توکن فقط یک بار tunnel:write

۱پیش‌نیاز و احراز هویت

این رابط فقط برای سرورهای اکسیتی کار می‌کند که تونلِ TCP رویشان راه‌اندازی شده است. سروری که چنین پروفایلی ندارد اصلاً در فهرست ظاهر نمی‌شود — پس لازم نیست بدانید کدام سرور قابل است؛ خودِ فهرست جواب است.

  1. در پنل کاربری خود به صفحهٔ امنیت بروید و یک توکن API بسازید.
  2. دو دسترسی tunnel:read و tunnel:write را تیک بزنید.
  3. در صورت نیاز، IP مجاز را روی همان توکن تعیین کنید تا فقط از سرور خودتان کار کند.
  4. توکن فقط یک بار نمایش داده می‌شود؛ همان‌جا ذخیره‌اش کنید.
curl -H "Authorization: Bearer sn_xxxxxxxx" \
     https://servernet.cloud/api/v1/tunnel/servers
محدودیت IP روی خودِ توکن می‌نشیند، نه روی حساب. اگر قواعد IP حساب را فعال کنید، خودتان را از مرورگر خودتان هم بیرون می‌اندازید.

۲شناسهٔ سرویس خود را بگیرید

همهٔ مسیرهای بعدی به یک شناسهٔ عددی نیاز دارند. آن را از این فراخوان بگیرید و در کد خود نگه دارید.

GET https://servernet.cloud/api/v1/tunnel/servers

{"ok": true, "data": [{
  "service_id": 49,
  "name": "blackwood-vip-1",
  "status": "active", "writable": true,
  "host": "sn-571100.servernet.cloud", "port": 8443,
  "subnet": "10.77.0.0/24", "next_ip": "10.77.0.5",
  "accounts": 7, "max": 100,
  "agent": {"installed": true, "alive": true,
            "last_seen_at": "2026-08-24T08:16:18+00:00",
            "pending_jobs": 0}
}]}
service_idشناسه‌ای که در همهٔ مسیرهای بعدی جای {service} می‌نشیند
hostنام یا آدرسی که کاربر نهایی به آن وصل می‌شود
subnetرنج داخلی سرور؛ آدرس هر کاربر از همین رنج داده می‌شود
next_ipاولین آدرس آزاد — اگر ip ندهید همین انتخاب می‌شود
writableاگر false باشد سرویس فعال نیست و اکانت تازه صادر نمی‌شود
agentوضعیت اجرای خودکار روی روتر — بخش بعد
این عدد با کد مشتری شما (مثل SN-571100) یکی نیست. کد مشتری شناسهٔ حساب است، نه شناسهٔ سرویس.

۳اجرای خودکار روی روتر

روتر شما از سمت ما قابل دسترسی نیست، پس ما به آن وصل نمی‌شویم — خودش می‌پرسد. با اجرای دو خط زیر روی روتر، یک اسکریپت و یک زمان‌بند نصب می‌شود که مرتب صف شما را می‌خواند و peerهای تازه را اعمال می‌کند. بدون این کار همه‌چیز کار می‌کند، فقط دستور روتر را باید خودتان اجرا کنید.

  1. با فراخوان زیر توکن ایجنت را بگیرید. پاسخ، همان دو خط آمادهٔ اجرا را هم می‌دهد.
  2. دو خط را در ترمینال روتر MikroTik خود اجرا کنید.
  3. بار اول چند ثانیه طول می‌کشد چون گواهی ریشه هم نصب می‌شود.
  4. پس از آن، وضعیت باید alive شود.
POST https://servernet.cloud/api/v1/tunnel/49/agent

{"ok": true, "data": {
  "token": "sna_49_xxxxxxxx",
  "replaced": false,
  "install": [
    "/tool fetch url=\"https://servernet.cloud/agent/tunnel/install\" http-header-field=\"X-Agent-Token: sna_49_xxxxxxxx\" dst-path=snet-agent.rsc",
    "/import file-name=snet-agent.rsc"
  ]
}}
هر بار که این فراخوان را بزنید، توکن قبلی همان لحظه باطل می‌شود و تا اجرای دو خط تازه روی روتر، اجرای خودکار قطع است. پس اول ترمینال روتر را باز کنید، بعد این را بزنید.

installed یعنی توکن صادر شده؛ alive یعنی روتر واقعاً در دقایق اخیر تماس گرفته. این دو عمداً جدا هستند: ایجنتی که نصب است ولی خاموش، از نظر شما کار نمی‌کند و یک برچسب واحد آن را پنهان می‌کرد.

GET https://servernet.cloud/api/v1/tunnel/49/agent

{"ok": true, "data": {
  "installed": true, "alive": true,
  "last_seen_at": "2026-08-24T08:16:18+00:00",
  "pending_jobs": 0
}}

سرور هرگز «دستور» به روتر نمی‌فرستد. پاسخ فقط سه مقدار دارد — نام، آدرس و کلید عمومی — و اسکریپت هرکدام را جداگانه اعتبارسنجی می‌کند و خودش دستور را می‌سازد. آدرس هم فقط از داخل رنج خود شما پذیرفته می‌شود.

۴ساخت کاربر

POST https://servernet.cloud/api/v1/tunnel/49/accounts
{"name": "ali-mobile"}

{"ok": true, "data": {
  "name": "ali-mobile", "ip": "10.77.0.5",
  "public_key": "...", "private_key": "...",
  "delivery": {"mode": "agent", "status": "pending",
               "job_id": 41, "agent_alive": true},
  "router_command": "/interface/wireguard/peers/add ...",
  "config": { ... sing-box ... }
}}

ورودی‌ها

nameاجباری — ۲ تا ۲۴ نویسهٔ لاتین کوچک، رقم، خط‌تیره یا زیرخط
ipاختیاری — ندهید تا آدرس آزاد بعدی خودکار انتخاب شود
formatاختیاری — singbox پیش‌فرض است؛ legacy برای اپ‌های قدیمی‌تر
کلید خصوصی فقط در همین یک پاسخ برمی‌گردد و هرگز ذخیره نمی‌شود. اگر نگهش ندارید، راهی برای بازیابی نیست و باید کاربر را حذف و دوباره بسازید.

میدان config یک کانفیگ کامل sing-box است؛ آن را مستقیم به کاربر نهایی بدهید تا با پسوند json ذخیره و در برنامه‌اش import کند. لازم نیست خودتان چیزی بسازید.

میدان delivery می‌گوید کار کجاست: mode برابر agent یعنی در صف روتر نشست و ظرف چند ثانیه ساخته می‌شود؛ mode برابر manual یعنی ایجنت نصب نیست و باید router_command را خودتان روی روتر اجرا کنید. router_command در هر دو حالت برمی‌گردد، چون ایجنت ممکن است خاموش باشد و آن خط تنها راه نجات در همان لحظه است.

کد ۲۰۱ به‌تنهایی یعنی «ثبت شد»، نه «کاربر وصل می‌شود». تا وقتی وضعیت اکانت به active نرسیده، آن کانفیگ کار نمی‌کند.

۵فهرست و وضعیت کاربران

هر کاربر یک میدان state دارد که همان چیزی را می‌گوید که کاربر نهایی تجربه می‌کند، نه یک برچسب داخلی.

GET https://servernet.cloud/api/v1/tunnel/49/accounts

{"ok": true, "data": {
  "service_id": 49, "next_ip": "10.77.0.6",
  "agent": {"installed": true, "alive": true, "pending_jobs": 0},
  "accounts": [
    {"name": "ali-mobile", "ip": "10.77.0.5",
     "public_key": "...", "issued_at": "...",
     "state": "active"}
  ]
}}
active روی روتر نشسته و کاربر وصل می‌شود pending هنوز در صف روتر است — چند ثانیه صبر کنید failed روتر نپذیرفت یا ایجنت اجرا نشد؛ لاگ روتر را ببینید

کاربرانی که پیش از راه‌اندازی این صف ساخته شده‌اند هیچ ردیف کاری ندارند و عمداً active گزارش می‌شوند، نه نامعلوم — همه‌شان سالم روی روتر نشسته‌اند.

۶حذف کاربر

DELETE https://servernet.cloud/api/v1/tunnel/49/accounts/ali-mobile

{"ok": true, "data": {
  "name": "ali-mobile",
  "delivery": {"mode": "agent", "status": "pending"},
  "router_command": "/interface/wireguard/peers/remove [find name=\"ali-mobile\"]"
}}
با ایجنت فعال، peer خودش از روتر برداشته می‌شود. بدون ایجنت، تا وقتی router_command حذف را اجرا نکنید آن کاربر همچنان وصل می‌شود — حذف از فهرست به‌تنهایی دسترسی را قطع نمی‌کند.

۷خطاها و سقف‌ها

پاسخ ناموفق همیشه یک کد ماشین‌خوان در میدان error دارد. به متن message تکیه نکنید؛ ممکن است عوض شود.

insufficient_scopeتوکن دسترسی لازم را ندارد
not_foundچنین سرور یا اکانتی در حساب شما نیست
service_not_activeسرویس تعلیق، منقضی یا لغو شده است
bad_nameنام با قالب مجاز نمی‌خواند
name_takenاکانتی با این نام از قبل هست
bad_ipآدرس از رنج داخلی همین سرور نیست
ip_takenاین آدرس قبلاً داده شده است
limit_reachedبه سقف تعداد اکانت رسیده‌اید

سقف نرخ

خواندن۱۲۰ / ۱ دقیقه
ساخت و حذف۲۰ / ۱ دقیقه
صدور توکن ایجنت۵ / ۱ دقیقه
حداکثر کاربر روی هر سرور۱۰۰

← مرجع API نمایندگی دامنه