مرجع API Vitamin

از سایت، بات یا اسکریپت خودتان حساب‌های VPN و سرورهای مجازی بفروشید و مدیریت کنید.

نشانی پایهhttps://apiservice.vitamindata.net/api/v1

کلیدها در پنل خودتان ساخته می‌شوند. اگر این بخش را نمی‌بینید، از پشتیبانی بخواهید دسترسی API را برای حسابتان فعال کند.

1

در پنل خود یک کلید API بسازید و آن را در هر فراخوانی به‌صورت توکن bearer بفرستید.

2

برای اثبات کلید Ping را صدا بزنید، سپس قیمت‌هایتان را با ListPlans و GetVPSStorefront بگیرید.

3

با FUNDING_AUTO بفروشید: وقتی موجودی کافی باشد از موجودی پرداخت می‌شود، وقتی نباشد مشتری لینک پرداخت می‌گیرد.

احراز هویت

هر درخواست، کلید شما را به‌صورت توکن bearer حمل می‌کند. روی این میزبان کوکی وجود ندارد و توکن CSRF هم لازم نیست — کلید تمام هویت شماست.

Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

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

یک کلید را می‌توان به فهرستی از نشانی‌های مبدأ محدود کرد، برای آن محدودیت نرخ دقیقه‌ای جداگانه گذاشت و عملیات مشخصی را از آن گرفت. این‌ها را اپراتورهای ما تنظیم می‌کنند — اگر کلیدی می‌خواهید که مثلاً بتواند خرید کند اما هیچ سرویسی را حذف نکند، به پشتیبانی بگویید.

کلیدهای آزمایشی

کلیدی که با sk_test_ شروع می‌شود داده واقعی را می‌خواند، اما هر چیزی که پول خرج کند یا به یک ماشین واقعی دست بزند را رد می‌کند؛ بنابراین می‌توانید یکپارچه‌سازی خود را پیش از آنکه هزینه‌ای داشته باشد بسازید و بیازمایید.

یک خطا چه شکلی است

کلید ناشناخته و کلید حسابی که دسترسی API ندارد، هر دو دقیقاً یک 401 می‌گیرند، کلمه‌به‌کلمه: پاسخ هرگز تأیید نمی‌کند که کلیدی وجود دارد یا نه. استثنا کلید خودتان است که مهلت چرخشش گذشته — عمداً می‌گوید api key expired، چون شما از پیش می‌دانید آن کلید واقعی بوده و باید بدانید چرا از کار افتاد. خطاهای پرتکرار از یک نشانی محدود می‌شوند — محدودیت نرخ را ببینید.

پرداخت

هر چه می‌خرید — حساب VPN، تمدید، سرور، تجدید یا ارتقا — از یک قرارداد می‌گذرد. شما انتخاب می‌کنید هزینه از کجا تأمین شود:

fundingچه اتفاقی می‌افتد
FUNDING_AUTOپیشنهاد ما. اگر موجودی کافی باشد از موجودی کم می‌کند؛ در غیر این صورت فراخوانی همچنان موفق است و یک لینک پرداخت به شما می‌دهد. یک فراخوانی، بدون خطایی که لازم باشد تفسیر کنید.
FUNDING_BALANCEفقط موجودی. اگر موجودی کم باشد فراخوانی با insufficient_balance شکست می‌خورد (خطا هم یک لینک قابل پرداخت دارد).
FUNDING_INVOICEهمیشه لینک پرداخت برمی‌گرداند، حتی اگر موجودی شما کافی بود.

با FUNDING_AUTO فقط یک فیلد را بررسی می‌کنید:

{"order": {...}, "paid": true,  "status": "completed"}
{"order": {...}, "status": "payment_required",
 "invoice": {"invoice_id": "inv_9m2r4t",
             "pay_url": "https://pay.example.com/i/inv_9m2r4t",
             "price_usd": "11.90", "expires_at": "1785499200"}}

completed یعنی پول برداشته شده و تحویل آغاز شده است — GetOrder را بخوانید تا وضعیتش delivered شود. payment_required یعنی مشتری را به pay_url بفرستید؛ با پرداخت فاکتور، تحویل خودش شروع می‌شود.

قیمت‌ها همیشه از سمت ماست. می‌توانید expected_total_usd را به‌عنوان محافظ بفرستید: اگر قیمت تازه ما متفاوت باشد، فروش با price_changed و مبلغ جدید رد می‌شود، به‌جای آنکه مبلغی که مشتری هرگز ندیده از او گرفته شود.

تلاش مجدد بی‌خطر

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

Idempotency-Key: 8f14e45f-ea6d-4b3a-9c1b-2f0d5a7e91c3

برای هر عمل مشتری یک کلید تازه بگذارید (UUID ایده‌آل است). استفاده مجدد از یک کلید با بدنه متفاوت با idempotency_conflict رد می‌شود — این ترکیب یعنی یک باگ، و حدس زدن اینکه کدام درخواست را می‌خواستید بدتر از گفتنش به شماست.

محدودیت نرخ

هر پاسخ احراز هویت‌شده می‌گوید کلید شما کجا ایستاده است:

RateLimit-Limit: 6000
RateLimit-Remaining: 5987
RateLimit-Policy: 6000;w=60

محدودیت به‌ازای هر کلید و در هر دقیقه است و برای حساب شما تنظیم می‌شود — مقدار پیش‌فرض برای یک فروشگاه مناسب است؛ یک بات پرترافیک بهتر است درخواست افزایش بدهد تا آنکه خودش را کند کند. عبور از آن پاسخ 429 همراه Retry-After می‌دهد.

اگر درخواست‌های زیادی از یک نشانی در احراز هویت شکست بخورند هم 429 می‌بینید. این سهمیه شما نیست، محافظت در برابر حمله جست‌وجوی فراگیر است: خودش پاک می‌شود (سرآیند می‌گوید چه زمانی) و یک کلید سالم هرگز آن را فعال نمی‌کند.

خانواده X-Ratelimit-* را هم روی هر پاسخی می‌بینید، حتی پاسخ‌هایی که کلیدی در کارشان نیست. آن ترمزی درشت به‌ازای هر نشانی و جلوی کل API است، نه سهمیه کلید شما — سرعت خود را با RateLimit-Remaining تنظیم کنید و سرآیندهای X- را به خودتان مربوط ندانید.

خطاها

شکست‌ها به‌صورت یک وضعیت HTTP و بدنه JSON برمی‌گردند. code سطح بالا دسته انتقال است؛ message سطح بالا کد ماشینی پایدار را حمل می‌کند. جزئیات کامل — همان کد ماشینی، یک جمله امن، و هر داده عملیاتی دیگر — داخل details زیر debug می‌آید:

{"code": "failed_precondition",
 "message": "insufficient_balance",
 "details": [{"type": "neopay.seller.publicapi.v1.ErrorInfo",
              "value": "CgptZXNzYWdl…",
              "debug": {"code": "insufficient_balance",
                        "message": "insufficient balance",
                        "payUrl": "https://pay.example.com/i/inv_9m2r4t",
                        "orderId": "ord_8c3d1e",
                        "totalUsd": "11.90"}}]}

کانال خطا دو رفتار خاص دارد که ارزش دارد برای هر دو کد بنویسید: value همان protobuf کدگذاری‌شده با base64 است (نادیده‌اش بگیرید — debug را بخوانید)، و داخل debug فیلدهای اضافی به‌شکل lowerCamelCase هستند — payUrl، orderId، totalUsd، retryAfterSeconds — یک قرارداد Connect، برخلاف snake_case بقیه جاها. روی message سطح بالا یا روی debug.code شرط بگذارید؛ هرگز روی خودِ جمله نه.

ردها پیش از آنکه درخواست شما مجاز شود

درخواستی که هرگز به هندلری نمی‌رسد — بی‌کلید یا با کلید بد (401)، نشانی مبدأیی که کلید اجازه‌اش نمی‌دهد (403)، محدودیت نرخ (429)، از کار افتادن احراز هویت (503) — همان درِ ورودی ردش می‌کند، و درِ ورودی بدنه‌ای کوتاه‌تر برمی‌گرداند: یک code انتقال و یک جمله ساده، بدون details و بدون کد ماشینی.

{"code": "unauthenticated", "message": "invalid api key"}

پس برای این‌ها روی وضعیت HTTP شرط بگذارید (و به Retry-After در پاسخ 429 پایبند باشید)؛ کدهای ماشینی جدول پایین مال فراخوانی‌هایی است که تا هندلر پیش رفته‌اند. ترمز درشتِ به‌ازای هر نشانی از این هم قدیمی‌تر است و {"error":"rate_limited"} برمی‌گرداند — با کلید error، نه code.

کدمعنیچه کاری کنید
forbidden_scopeکلید دسترسی لازم این فراخوانی را ندارد، یا این عملیات از آن گرفته شده است.از پشتیبانی بخواهید دسترسی کلید را گسترده‌تر کند.
not_foundچنین شیئی برای این حساب وجود ندارد.شناسه را بررسی کنید. شناسه‌ای که مال شما نیست هم همین پاسخ را می‌گیرد — به‌طور عمدی.
invalid_requestیکی از فیلدها بدشکل است.اصلاح کنید و دوباره بفرستید؛ تکرار بدون تغییر کمکی نمی‌کند.
insufficient_balanceتأمین فقط از موجودی کافی نبود.از payUrl داخل جزئیات استفاده کنید، یا به FUNDING_AUTO بروید.
price_changedمقدار expected_total_usd شما دیگر مطابق نیست.قیمت را دوباره بگیرید و مبلغ جدید را با مشتری تأیید کنید.
idempotency_conflictآن کلید با بدنه‌ای متفاوت استفاده شده است.برای هر عمل یک کلید تازه بگذارید.
sandbox_unavailableکلید sk_test_ خواسته پول خرج کند یا به یک ماشین واقعی دست بزند.طبیعی است — برای آن فراخوانی از کلید زنده استفاده کنید. کلیدهای آزمایشی می‌خوانند، هرگز نمی‌خرند.
unpriceableپیکربندی‌ای که خواسته‌اید قابل فروش نیست — پلن یا گره بدون قیمت، یا سبدی که هیچ مدلی پوششش نمی‌دهد.پیش از خرید، فروشگاه را دوباره بخوانید و قیمت بگیرید؛ استعلام قیمت هم همین سبد را رد می‌کند.
upstream_unavailableیکی از سامانه‌هایی که به آن وابسته‌ایم از کار افتاده است.با تأخیر فزاینده دوباره تلاش کنید؛ خواندن‌ها ممکن است کمی قدیمی باشند.
order_failedتحویل پس از پرداخت شکست خورد.دوباره خرید نکنید. GetOrder را بخوانید؛ ما این‌ها را خودکار بازیابی می‌کنیم و پشتیبانی هم آن را می‌بیند.
internalچیزی سمت ما خراب شده که دسته‌بندی‌اش نکرده‌ایم.یک بار با تأخیر دوباره تلاش کنید؛ اگر تکرار شد، X-Request-Id را به پشتیبانی بدهید.

قواعد

  • انتقال. هر فراخوانی یک POST {base}/{Method} با بدنه JSON است — POST /api/v1/CreateVPNOrder. چیز دیگری وجود ندارد: هر متد HTTP دیگری پاسخ 405 می‌گیرد، نگاشت فعل‌های REST در کار نیست و پارامتر مسیر هم وجود ندارد.
  • پول رشته است. "19.99"، نه 19.99: عدد JSON در بیشتر زبان‌ها اعشاری شناور است و نمی‌تواند یک سنت را دقیق نگه دارد.
  • اعداد صحیح 64-بیتی به‌صورت رشته می‌آیند. هر شمار بایت و هر برچسب زمانی unix عددی 64-بیتی است و روی خط با گیومه ارسال می‌شود — "remaining_bytes": "96636764160". آن‌ها را به‌صورت عدد صحیح تجزیه کنید؛ در درخواست‌ها هر دو شکل پذیرفته می‌شود.
  • صفر حذف می‌شود. فیلدی که مقدارش 0، false یا خالی باشد اصلاً در پاسخ نمی‌آید. نبودن را صفر بگیرید — و یادتان باشد سقف روزانه 0 یعنی بدون سقف، نه «0 گیگابایت».
  • زمان‌ها ثانیه unix هستند، به‌جز بازه تراکنش‌ها که RFC3339 یا YYYY-MM-DD می‌گیرد و برمی‌گرداند.
  • ترافیک بر حسب بایت است، هرگز گیگابایت، در همه اعداد.
  • شناسه‌ها مبهم‌اند. acc_…، ord_…، vpn_…. هیچ‌گاه آن‌ها را تجزیه یا تولید نکنید و فرض نکنید پشت‌سرهم‌اند.
  • صفحه‌بندی با نشانگر مبهم انجام می‌شود: مقدار next_cursor پاسخ قبلی را برگردانید. next_cursor خالی یعنی همه چیز را گرفته‌اید.
  • جدول‌های فیلد از نشانه‌های کوتاه نوع استفاده می‌کنند. money — رشته اعشاری دقیق؛ unix — ثانیه unix (64-بیتی، پس رشته)؛ bytes — شمار بایت (64-بیتی، پس رشته)؛ int64 — هر 64-بیتی دیگر (رشته)؛ int — 32-بیتی، عدد ساده؛ cursor — دستگیره صفحه‌بندی مبهم؛ enum — دقیقاً یکی از مقدارهای فهرست‌شده.
  • فیلدهای تازه بدون اطلاع اضافه می‌شوند و معنی فیلدهای موجود عوض نمی‌شود. آنچه را نمی‌شناسید نادیده بگیرید.

شروع کار

نخستین فراخوانی: ثابت می‌کند کلید کار می‌کند و می‌گوید به کدام حساب تعلق دارد.

POST

Ping

هر کلیدی
https://apiservice.vitamindata.net/api/v1/Ping

شناسه حساب شما، اینکه کلید زنده است یا آزمایشی، و ساعت ما را برمی‌گرداند.

درخواست

بدون پارامتر — یک شیء خالی بفرستید، {}.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/Ping \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{}'
پاسخ200 · application/json
account_idstring

حساب متعلق به کلید — گواه اینکه کلید شناخته شد.

modeenum

چه نوع کلیدی فرستادید.

یکی از:livetest
server_timeunix

ساعت ما — برای دیدن انحراف ساعت پیش از آنکه امضاها یا بازه‌ها را بشکند مفید است.

نمونه پاسخ
{
  "account_id": "acc_9f3k2m7q",
  "mode": "live",
  "server_time": "1785412800"
}

حساب و موجودی

POST

GetAccount

read
https://apiservice.vitamindata.net/api/v1/GetAccount

ایمیل، وضعیت و زبان حساب شما و اینکه نشانی تأیید شده است یا نه.

درخواست

بدون پارامتر — یک شیء خالی بفرستید، {}.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/GetAccount \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{}'
پاسخ200 · application/json
accountobject

حساب شما.

account.account_idstring

شناسه عمومی (acc_…).

account.emailstring

نشانی ورود.

account.statusstring

active مگر اینکه حساب محدود شده باشد.

account.localestring

زبان حساب — نام کارت‌ها و اعلان‌ها به همین زبان بومی‌سازی می‌شوند.

account.email_verifiedbool

نشانی تأیید شده است.

account.created_atunix

زمان ساخت حساب.

نمونه پاسخ
{
  "account": {
    "account_id": "acc_9f3k2m7q",
    "email": "dev@example.com",
    "status": "active",
    "locale": "en",
    "email_verified": true,
    "created_at": "1769000000"
  }
}
POST

GetBalance

read
https://apiservice.vitamindata.net/api/v1/GetBalance

موجودی دفتر شما و مبلغی که یک خرید واقعاً می‌تواند از آن بردارد.

available_usd عددی است که پیش از خرید باید ببینید — مبلغی که سفارش در جریان قفل کرده در آن نیست.

درخواست

بدون پارامتر — یک شیء خالی بفرستید، {}.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/GetBalance \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{}'
پاسخ200 · application/json
balance_usdmoney

موجودی کامل دفتر.

available_usdmoney

موجودی منهای قفل‌ها — آنچه یک خرید همین حالا می‌تواند خرج کند.

as_ofstring

برچسب زمانی دفتر برای این اعداد، RFC3339.

نمونه پاسخ
{
  "balance_usd": "72.60",
  "available_usd": "60.70",
  "as_of": "2026-07-29T12:00:00Z"
}
POST

ListTransactions

read
https://apiservice.vitamindata.net/api/v1/ListTransactions

دفتر شما، تازه‌ترین اول.

به‌طور پیش‌فرض سه ماه گذشته. بازه بیشتر از 92 روز باریک می‌شود و پاسخ می‌گوید واقعاً از چه بازه‌ای استفاده کرده — پس پاسخ کوتاه هرگز مبهم نیست.

درخواست
limitintاختیاری

اندازه صفحه. پیش‌فرض 25، حداکثر 100.

cursorcursorاختیاری

مقدار next_cursor پاسخ قبلی. برای صفحه اول نفرستید.

kindstringاختیاری

فیلتر اختیاری جداشده با ویرگول روی مقدارهای kind پایین.

fromstringاختیاری

آغاز بازه، RFC3339 یا YYYY-MM-DD.

tostringاختیاری

پایان بازه. مقدار to فقط-تاریخ، کل همان روز را شامل می‌شود.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/ListTransactions \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"limit":25,"cursor":"","kind":"topup_credit,invoice_debit_reserved","from":"2026-05-01","to":"2026-07-30"}'
پاسخ200 · application/json
transactionsarray

سطرهای دفتر.

transactions[].idstring

شناسه سطر دفتر.

transactions[].tsstring

زمان، RFC3339.

transactions[].kindenum

چه چیزی پول را جابه‌جا کرد. topup_credit افزایش موجودیِ پرداخت‌شده است؛ دو نوع invoice_debit_* خرید هستند. قفل و آزادسازیِ داخلیِ سفارشِ در جریان بخشی از این فهرست نیست.

یکی از:topup_creditexternal_creditinvoice_debit_reservedinvoice_debit_externaloverpay_creditmanual_creditmanual_debitspend_debitspend_refundautomated_correction
transactions[].amount_usdmoney

علامت‌دار — در برداشت‌ها منفی.

transactions[].balance_after_usdmoney

موجودی جاری پس از این سطر.

transactions[].ref_invoice_idstring

فاکتور پشت این جابه‌جایی — آن را به GetInvoice بدهید تا داستان کامل را ببینید.

transactions[].descriptionstring

برچسب کوتاه انسانی. فقط برای نمایش؛ هرگز روی آن شرط نگذارید.

next_cursorcursor

برای صفحه بعد آن را به‌عنوان cursor برگردانید. نبودن/خالی = همه چیز را گرفته‌اید.

has_morebool

سطرهای بیشتری بعد از این صفحه هست.

fromstring

بازه‌ای که واقعاً اعمال شد (RFC3339). باریک‌تر از خواسته شما ⇒ به سقف 92 روز خورده‌اید.

tostring

پایان بازه اعمال‌شده.

نمونه پاسخ
{
  "transactions": [
    {"id": "tx_01j9zq", "ts": "2026-07-28T09:14:03Z", "kind": "invoice_debit_reserved",
     "amount_usd": "-11.90", "balance_after_usd": "72.60",
     "ref_invoice_id": "inv_5k8p2q", "description": "order ord_7b2c9d"},
    {"id": "tx_01j8xw", "ts": "2026-07-25T18:40:11Z", "kind": "topup_credit",
     "amount_usd": "50.00", "balance_after_usd": "84.50", "ref_invoice_id": "inv_3d1x8n"}
  ],
  "from": "2026-04-30T00:00:00Z",
  "to": "2026-07-29T23:59:59Z"
}
POST

CreateTopup

buyIdempotency-Key
https://apiservice.vitamindata.net/api/v1/CreateTopup

یک فاکتور قابل پرداخت می‌سازد که به موجودی شما اضافه می‌کند.

مشتری (یا خودتان) را به invoice.pay_url بفرستید. موجودی با پرداخت آن جابه‌جا می‌شود.

درخواست
amount_usdmoneyالزامی

چقدر اضافه شود، به‌صورت رشته اعشاری.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/CreateTopup \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"amount_usd":"50.00"}'
پاسخ200 · application/json
invoiceobject

فاکتور قابل پرداخت.

invoice.invoice_idstring

شناسه فاکتور درگاه (inv_…).

invoice.statusenum

pending قابل پرداخت است. همه چیز از confirmed تا delivered_redirected یعنی پول برگشت‌ناپذیر رسیده — همه آن‌ها را پرداخت‌شده بگیرید. expired یعنی لینک بدون پرداخت منقضی شد.

یکی از:pendingconfirmedsweepingsweptdeliveringdelivereddelivered_redirectedexpired
invoice.pay_urlstring

صفحه پرداخت میزبانی‌شده. مشتری را به اینجا بفرستید؛ همه روش‌ها (کوین‌ها، زنجیره‌ها، موجودی) پشت آن است.

invoice.pay_telegram_urlstring

همان فاکتور، قابل پرداخت داخل تلگرام: بات خودِ درگاه پرداخت را باز می‌کند که مبلغ را نشان می‌دهد و پرداخت را همان‌جا می‌گیرد. آن را کنار pay_url به مشتری‌هایی پیشنهاد دهید که ترجیح می‌دهند از اپلیکیشن بیرون نروند. ممکن است نباشد — فقط درگاه پرداختی که بات تنظیم‌شده داشته باشد این لینک را دارد، پس هرگز آن را تنها دکمه پرداخت خود نکنید.

invoice.price_usdmoney

مبلغی که فاکتور می‌گیرد.

invoice.expires_atunix

زمان بسته شدن پنجره پرداخت.

نمونه پاسخ
{
  "invoice": {
    "invoice_id": "inv_3d1x8n",
    "status": "pending",
    "pay_url": "https://pay.example.com/i/inv_3d1x8n",
    "pay_telegram_url": "https://t.me/VitaminPayBot?start=3d1x8n",
    "price_usd": "50.00",
    "expires_at": "1785499200"
  }
}
POST

GetInvoice

read
https://apiservice.vitamindata.net/api/v1/GetInvoice

یک پرداخت با همه جزئیات، از جمله آنچه روی زنجیره دیده می‌شود.

مقدار ref_invoice_id در سطر دفتر، کلید اتصال است. تنها فاکتورهایی خوانده می‌شوند که حساب خودتان ساخته است.

درخواست
invoice_idstringالزامی

از ref_invoice_id یک سطر دفتر، از یک سفارش، یا از یک افزایش موجودی.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/GetInvoice \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"invoice_id":"inv_5k8p2q"}'
پاسخ200 · application/json
invoiceobject

خود فاکتور.

invoice.invoice_idstring

شناسه فاکتور درگاه (inv_…).

invoice.statusenum

pending قابل پرداخت است. همه چیز از confirmed تا delivered_redirected یعنی پول برگشت‌ناپذیر رسیده — همه آن‌ها را پرداخت‌شده بگیرید. expired یعنی لینک بدون پرداخت منقضی شد.

یکی از:pendingconfirmedsweepingsweptdeliveringdelivereddelivered_redirectedexpired
invoice.pay_urlstring

صفحه پرداخت میزبانی‌شده. مشتری را به اینجا بفرستید؛ همه روش‌ها (کوین‌ها، زنجیره‌ها، موجودی) پشت آن است.

invoice.pay_telegram_urlstring

همان فاکتور، قابل پرداخت داخل تلگرام: بات خودِ درگاه پرداخت را باز می‌کند که مبلغ را نشان می‌دهد و پرداخت را همان‌جا می‌گیرد. آن را کنار pay_url به مشتری‌هایی پیشنهاد دهید که ترجیح می‌دهند از اپلیکیشن بیرون نروند. ممکن است نباشد — فقط درگاه پرداختی که بات تنظیم‌شده داشته باشد این لینک را دارد، پس هرگز آن را تنها دکمه پرداخت خود نکنید.

invoice.price_usdmoney

مبلغی که فاکتور می‌گیرد.

invoice.expires_atunix

زمان بسته شدن پنجره پرداخت.

paymentsarray

آنچه زنجیره نشان می‌دهد. برای فاکتور پرداخت‌شده از موجودی (زنجیره‌ای در کار نبود) و فاکتوری که هنوز کسی نپرداخته خالی است — فهرست خالی خطا نیست.

payments[].chainstring

شبکه‌ای که پرداخت روی آن رسید (tron، bsc، …).

payments[].assetstring

با چه چیزی پرداخت شد (USDT، …).

payments[].amountmoney

مقدار دارایی، دقیق.

payments[].tx_hashstring

تراکنش روی زنجیره — مدرک پرداخت مشتری شما.

payments[].confirmedbool

زنجیره آن را نهایی کرده است.

payments[].seen_atunix

زمانی که اولین بار آن را دیدیم.

order_idstring

آنچه فاکتور خرید. برای افزایش موجودی، که چیزی نمی‌خرد، وجود ندارد.

نمونه پاسخ
{
  "invoice": {
    "invoice_id": "inv_5k8p2q",
    "status": "confirmed",
    "pay_url": "https://pay.example.com/i/inv_5k8p2q",
    "price_usd": "11.90",
    "expires_at": "1785499200"
  },
  "payments": [
    {"chain": "tron", "asset": "USDT", "amount": "11.90",
     "tx_hash": "c4a1f09e2b7d", "confirmed": true, "seen_at": "1785412920"}
  ],
  "order_id": "ord_7b2c9d"
}

قیمت‌ها

هیچ‌چیز در این بخش چیزی نمی‌سازد — پیش از تصمیم مشتری هر چند بار که خواستید قیمت بگیرید.

POST

ListPlans

read
https://apiservice.vitamindata.net/api/v1/ListPlans

آنچه می‌توانید بفروشید: کران‌های اسلایدر و، اگر فروشگاهتان از آن‌ها استفاده می‌کند، کارت‌های با قیمت ثابت.

هر کدام پر بود همان را نشان دهید. یک کارت با گذاشتن bundle_id آن در سبد خریده می‌شود؛ سبد اسلایدری از گیگابایت/ماه/کاربر استفاده می‌کند.

درخواست

بدون پارامتر — یک شیء خالی بفرستید، {}.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/ListPlans \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{}'
پاسخ200 · application/json
model_namestring

مدل قیمت‌گذاری فروشگاه شما.

model_typestring

نسخه موتور آن.

boundsobject

قواعد پیکربندی — هر استعلام قیمت و هر سفارش دوباره سمت سرور آن‌ها را بررسی می‌کند.

bounds.gb_minint

کمترین ترافیکی که یک سبد می‌تواند بخواهد.

bounds.gb_maxint

بزرگ‌ترین.

bounds.gb_stepint

گام اسلایدر.

bounds.users_minint

کمترین دستگاه هم‌زمان.

bounds.users_maxint

بیشترین.

bounds.months_minint

کوتاه‌ترین مدت.

bounds.months_maxint

طولانی‌ترین.

bounds.new_accounts_maxint

بیشترین شمار حسابی که یک سفارش می‌تواند بسازد.

bounds.extend_maxint

بیشترین شمار حسابی که یک سفارش می‌تواند تمدید کند.

bounds.default_gbint

پیش‌فرض معقول اسلایدر.

bounds.default_usersint

تعداد دستگاه پیش‌فرض.

bounds.default_monthsint

مدت پیش‌فرض.

bundlesarray

کارت‌های با قیمت ثابت، وقتی فروشگاه شما کاتالوگ کارت است.

bundles[].bundle_idstring

شناسه‌ای که در cart.bundle_id می‌گذارید.

bundles[].namestring

نام کارت، از پیش برای زبان حساب بومی‌سازی شده.

bundles[].gbint

ترافیک شامل‌شده.

bundles[].monthsint

مدت اعتبار.

bundles[].online_usersint

دستگاه‌های هم‌زمان.

bundles[].price_usdmoney

قیمت. همین قیمتِ نهایی است — برای کارت نیازی به استعلام قیمت نیست.

bundles[].highlightbool

کارت ویژه فروشگاه.

bundles[].daily_cap_gbint

سقف روزانه به گیگابایت. نبودن = ندارد.

نمونه پاسخ
{
  "model_name": "vpn_dynamic",
  "model_type": "dynamic_v2",
  "bounds": {
    "gb_min": 10, "gb_max": 500, "gb_step": 10,
    "users_min": 1, "users_max": 10,
    "months_min": 1, "months_max": 12,
    "new_accounts_max": 5, "extend_max": 10,
    "default_gb": 100, "default_users": 3, "default_months": 1
  },
  "bundles": [
    {"bundle_id": "card_100_1m", "name": "100 GB · 1 month", "gb": 100, "months": 1,
     "online_users": 3, "price_usd": "11.90", "highlight": true}
  ]
}
POST

Quote

read
https://apiservice.vitamindata.net/api/v1/Quote

قیمت نهایی یک سبد VPN، ردیف‌به‌ردیف. تخفیف‌ها هم‌اکنون اعمال شده‌اند.

درخواست
cartobjectالزامی

سبدی که قیمت‌گذاری می‌شود.

cart.kindenumالزامی

حساب تازه بخرید، یا به حساب‌های موجود ترافیک و زمان اضافه کنید.

یکی از:newextend
cart.gbintاختیاری

ترافیک هر حساب، به گیگابایت، داخل کران‌های ListPlans.

cart.monthsintاختیاری

اعتبار هر حساب، به ماه.

cart.usersintاختیاری

دستگاه‌های هم‌زمان هر حساب.

cart.new_accountsintاختیاری

فقط برای kind:"new": چند حساب ساخته شود. نام‌های کاربری را سرور می‌سازد.

cart.extend_vpn_idsarrayاختیاری

فقط برای kind:"extend": حساب‌هایی که تمدید می‌شوند، با شناسه عمومی.

cart.bundle_idstringاختیاری

به‌جای سبد پیکربندی‌شده، یک کارت با قیمت ثابت از ListPlans.bundles می‌خرد. وقتی تنظیم شود، گیگابایت/ماه/کاربر نادیده گرفته می‌شوند — مقدارها و قیمت خود کارت اعمال می‌شود.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/Quote \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"cart":{"kind":"new","gb":100,"months":1,"users":3,"new_accounts":2}}'
شکل‌های دیگر این درخواست
تمدید حساب‌هایی که از قبل دارید
{"cart":{"kind":"extend","gb":50,"months":1,"users":3,"extend_vpn_ids":["vpn_6t2k9p","vpn_1a4b7c"]}}
خرید یک کارت با قیمت ثابت به‌جای سبد پیکربندی‌شده
{"cart":{"kind":"new","bundle_id":"card_100_1m","new_accounts":1}}
پاسخ200 · application/json
quoteobject

قیمت ردیف‌به‌ردیف. نه چیزی ساخته می‌شود و نه پولی گرفته می‌شود.

quote.model_namestring

کدام مدل قیمت‌گذاری پاسخ داد.

quote.model_typestring

نسخه موتور مدل.

quote.base_usdmoney

قیمت پیش از تخفیف‌ها و هزینه‌های اضافه.

quote.total_usdmoney

قیمت نهایی — مبلغی که فروش با این سبد می‌گیرد.

quote.linesarray

ریز اقلام، علامت‌دار، که جمعشان دقیقاً برابر جمع کل است.

quote.lines[].codestring

این سطر چیست (base، یک کد تخفیف، یک هزینه اضافه…).

quote.lines[].kindstring

دسته سطر، برای گروه‌بندی در رابط شما.

quote.lines[].amount_usdmoney

علامت‌دار. تخفیف‌ها منفی‌اند؛ جمع سطرها دقیقاً total_usd می‌شود.

quote.lines[].pctstring

درصد پشت این سطر، اگر درصدی باشد.

quote.cappedbool

جمع کل به سقف مدل خورد.

quote.floor_appliedbool

جمع کل تا کف مدل بالا برده شد.

quote.clampedenum

وقتی مقداری از سبد پیش از قیمت‌گذاری به داخل کران‌ها محدود شده باشد، تنظیم می‌شود.

یکی از:minmax
quote.invalidstring

غیرخالی یعنی سبد قابل قیمت‌گذاری نیست — آن را نشان دهید و هرگز بابت چنین قیمتی پول نگیرید.

quote.metamap

اطلاعات اضافه مدل، رشته→رشته (مثلاً remaining_days در ارتقا).

نمونه پاسخ
{
  "quote": {
    "model_name": "vpn_dynamic",
    "model_type": "dynamic_v2",
    "base_usd": "14.00",
    "total_usd": "11.90",
    "lines": [
      {"code": "base", "kind": "base", "amount_usd": "14.00"},
      {"code": "loyalty", "kind": "discount", "amount_usd": "-2.10", "pct": "15"}
    ]
  }
}

فروش VPN

POST

CreateVPNOrder

buyIdempotency-Key
https://apiservice.vitamindata.net/api/v1/CreateVPNOrder

حساب VPN تازه می‌خرد، یا حساب‌های موجود را تمدید می‌کند ("kind":"extend" همراه extend_vpn_ids).

برای دو شکلی که پاسخ می‌تواند داشته باشد پرداخت را ببینید.

درخواست
cartobjectالزامی

چه چیزی خریده شود — همان شکلی که Quote قیمت می‌گذارد.

cart.kindenumالزامی

حساب تازه بخرید، یا به حساب‌های موجود ترافیک و زمان اضافه کنید.

یکی از:newextend
cart.gbintاختیاری

ترافیک هر حساب، به گیگابایت، داخل کران‌های ListPlans.

cart.monthsintاختیاری

اعتبار هر حساب، به ماه.

cart.usersintاختیاری

دستگاه‌های هم‌زمان هر حساب.

cart.new_accountsintاختیاری

فقط برای kind:"new": چند حساب ساخته شود. نام‌های کاربری را سرور می‌سازد.

cart.extend_vpn_idsarrayاختیاری

فقط برای kind:"extend": حساب‌هایی که تمدید می‌شوند، با شناسه عمومی.

cart.bundle_idstringاختیاری

به‌جای سبد پیکربندی‌شده، یک کارت با قیمت ثابت از ListPlans.bundles می‌خرد. وقتی تنظیم شود، گیگابایت/ماه/کاربر نادیده گرفته می‌شوند — مقدارها و قیمت خود کارت اعمال می‌شود.

fundingenumالزامی

روش پرداخت — پرداخت را ببینید. پیش‌فرض ندارد: نفرستادنش رد می‌شود.

یکی از:FUNDING_AUTOFUNDING_BALANCEFUNDING_INVOICE
expected_total_usdmoneyاختیاری

محافظ تأیید. اگر تنظیم شود و قیمت تازه ما متفاوت باشد، فروش با price_changed رد می‌شود، به‌جای آنکه مبلغی که مشتری هرگز ندیده گرفته شود.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/CreateVPNOrder \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"cart":{"kind":"new","gb":100,"months":1,"users":3,"new_accounts":1},"funding":"FUNDING_AUTO","expected_total_usd":"11.90"}'
شکل‌های دیگر این درخواست
تمدید حساب‌هایی که از قبل دارید
{"cart":{"kind":"extend","gb":50,"months":1,"users":3,"extend_vpn_ids":["vpn_6t2k9p"]},"funding":"FUNDING_AUTO"}
خرید یک کارت با قیمت ثابت، پرداخت از موجودی
{"cart":{"kind":"new","bundle_id":"card_100_1m","new_accounts":1},"funding":"FUNDING_BALANCE"}
پاسخ200 · application/json
orderobject

سفارش — GetOrder را بخوانید تا وضعیتش delivered شود.

order.order_idstring

شناسه عمومی سفارش (ord_…).

order.productenum

چه چیزی خریده شد.

یکی از:vpnvps
order.kindstring

نوع خرید: new، extend، upgrade

order.statusenum

چرخه عمر. delivered هدف است؛ needs_operator یعنی پول رسیده و یک انسان تحویل را تمام می‌کند — دوباره خرید نکنید؛ expired یعنی فاکتور بدون پرداخت منقضی شد.

یکی از:createdinvoicedpaiddeliveringdeliveredneeds_operatorfailedrefund_pendingrefundedexpired
order.fundingenum

کدام روش واقعاً هزینه را تأمین کرد. FUNDING_AUTO به یکی از همین‌ها ختم می‌شود.

یکی از:invoicebalance
order.total_usdmoney

مبلغی که سفارش می‌گیرد.

order.invoice_idstring

فاکتور پشت آن — هر سفارشی یکی دارد، با هر روشی که تأمین شده باشد.

order.itemsint

تعداد سرویس‌هایی که سفارش می‌سازد یا تمدید می‌کند.

order.created_atunix

زمان ثبت سفارش.

order.delivered_atunix

زمان پایان تحویل. تا آن موقع وجود ندارد.

order.breakdownobject

همان قیمتی که مشتری پذیرفت، عیناً — همان شکلی که Quote برمی‌گرداند.

invoiceobject

فاکتور پشت سفارش: با payment_required قابل پرداخت است، با completed از قبل تسویه شده.

invoice.invoice_idstring

شناسه فاکتور درگاه (inv_…).

invoice.statusenum

pending قابل پرداخت است. همه چیز از confirmed تا delivered_redirected یعنی پول برگشت‌ناپذیر رسیده — همه آن‌ها را پرداخت‌شده بگیرید. expired یعنی لینک بدون پرداخت منقضی شد.

یکی از:pendingconfirmedsweepingsweptdeliveringdelivereddelivered_redirectedexpired
invoice.pay_urlstring

صفحه پرداخت میزبانی‌شده. مشتری را به اینجا بفرستید؛ همه روش‌ها (کوین‌ها، زنجیره‌ها، موجودی) پشت آن است.

invoice.pay_telegram_urlstring

همان فاکتور، قابل پرداخت داخل تلگرام: بات خودِ درگاه پرداخت را باز می‌کند که مبلغ را نشان می‌دهد و پرداخت را همان‌جا می‌گیرد. آن را کنار pay_url به مشتری‌هایی پیشنهاد دهید که ترجیح می‌دهند از اپلیکیشن بیرون نروند. ممکن است نباشد — فقط درگاه پرداختی که بات تنظیم‌شده داشته باشد این لینک را دارد، پس هرگز آن را تنها دکمه پرداخت خود نکنید.

invoice.price_usdmoney

مبلغی که فاکتور می‌گیرد.

invoice.expires_atunix

زمان بسته شدن پنجره پرداخت.

paidbool

پول گرفته شده است. با payment_required وجود ندارد (= false).

statusenum

همان فیلدی که باید رویش شرط بگذارید — پرداخت را ببینید.

یکی از:completedpayment_required
نمونه پاسخ
{
  "order": {
    "order_id": "ord_8c3d1e", "product": "vpn", "kind": "new",
    "status": "invoiced", "funding": "invoice", "total_usd": "11.90",
    "invoice_id": "inv_9m2r4t", "items": 1, "created_at": "1785412800"
  },
  "invoice": {
    "invoice_id": "inv_9m2r4t", "status": "pending",
    "pay_url": "https://pay.example.com/i/inv_9m2r4t",
    "pay_telegram_url": "https://t.me/VitaminPayBot?start=9m2r4t",
    "price_usd": "11.90", "expires_at": "1785499200"
  },
  "status": "payment_required"
}
POST

GetOrder

read
https://apiservice.vitamindata.net/api/v1/GetOrder

بعد از خرید این را بخوانید: created → invoiced → paid → delivering → delivered.

درخواست
order_idstringالزامی

از سفارشی که ثبت کردید.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/GetOrder \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"order_id":"ord_7b2c9d"}'
پاسخ200 · application/json
orderobject

سفارش، با ریز کامل اقلام آن.

order.order_idstring

شناسه عمومی سفارش (ord_…).

order.productenum

چه چیزی خریده شد.

یکی از:vpnvps
order.kindstring

نوع خرید: new، extend، upgrade

order.statusenum

چرخه عمر. delivered هدف است؛ needs_operator یعنی پول رسیده و یک انسان تحویل را تمام می‌کند — دوباره خرید نکنید؛ expired یعنی فاکتور بدون پرداخت منقضی شد.

یکی از:createdinvoicedpaiddeliveringdeliveredneeds_operatorfailedrefund_pendingrefundedexpired
order.fundingenum

کدام روش واقعاً هزینه را تأمین کرد. FUNDING_AUTO به یکی از همین‌ها ختم می‌شود.

یکی از:invoicebalance
order.total_usdmoney

مبلغی که سفارش می‌گیرد.

order.invoice_idstring

فاکتور پشت آن — هر سفارشی یکی دارد، با هر روشی که تأمین شده باشد.

order.itemsint

تعداد سرویس‌هایی که سفارش می‌سازد یا تمدید می‌کند.

order.created_atunix

زمان ثبت سفارش.

order.delivered_atunix

زمان پایان تحویل. تا آن موقع وجود ندارد.

order.breakdownobject

همان قیمتی که مشتری پذیرفت، عیناً — همان شکلی که Quote برمی‌گرداند.

invoiceobject

فقط تا وقتی سفارش هنوز منتظر پرداخت است پر می‌شود — همان شکل همیشگی.

نمونه پاسخ
{
  "order": {
    "order_id": "ord_7b2c9d", "product": "vpn", "kind": "new",
    "status": "delivered", "funding": "balance", "total_usd": "11.90",
    "invoice_id": "inv_5k8p2q", "items": 1,
    "created_at": "1785230043", "delivered_at": "1785230103",
    "breakdown": {
    "model_name": "vpn_dynamic",
    "model_type": "dynamic_v2",
    "base_usd": "14.00",
    "total_usd": "11.90",
    "lines": [
      {"code": "base", "kind": "base", "amount_usd": "14.00"},
      {"code": "loyalty", "kind": "discount", "amount_usd": "-2.10", "pct": "15"}
    ]
  }
  }
}
POST

ListOrders

read
https://apiservice.vitamindata.net/api/v1/ListOrders

تاریخچه سفارش‌های شما، تازه‌ترین اول.

درخواست
limitintاختیاری

اندازه صفحه. پیش‌فرض 25، حداکثر 100.

cursorcursorاختیاری

مقدار next_cursor پاسخ قبلی. برای صفحه اول نفرستید.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/ListOrders \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"limit":25,"cursor":""}'
پاسخ200 · application/json
ordersarray

سفارش‌ها.

orders[].order_idstring

شناسه عمومی سفارش (ord_…).

orders[].productenum

چه چیزی خریده شد.

یکی از:vpnvps
orders[].kindstring

نوع خرید: new، extend، upgrade

orders[].statusenum

چرخه عمر. delivered هدف است؛ needs_operator یعنی پول رسیده و یک انسان تحویل را تمام می‌کند — دوباره خرید نکنید؛ expired یعنی فاکتور بدون پرداخت منقضی شد.

یکی از:createdinvoicedpaiddeliveringdeliveredneeds_operatorfailedrefund_pendingrefundedexpired
orders[].fundingenum

کدام روش واقعاً هزینه را تأمین کرد. FUNDING_AUTO به یکی از همین‌ها ختم می‌شود.

یکی از:invoicebalance
orders[].total_usdmoney

مبلغی که سفارش می‌گیرد.

orders[].invoice_idstring

فاکتور پشت آن — هر سفارشی یکی دارد، با هر روشی که تأمین شده باشد.

orders[].itemsint

تعداد سرویس‌هایی که سفارش می‌سازد یا تمدید می‌کند.

orders[].created_atunix

زمان ثبت سفارش.

orders[].delivered_atunix

زمان پایان تحویل. تا آن موقع وجود ندارد.

orders[].breakdownobject

همان قیمتی که مشتری پذیرفت، عیناً — همان شکلی که Quote برمی‌گرداند.

next_cursorcursor

برای صفحه بعد آن را به‌عنوان cursor برگردانید. نبودن/خالی = همه چیز را گرفته‌اید.

نمونه پاسخ
{
  "orders": [
    {"order_id": "ord_7b2c9d", "product": "vpn", "kind": "new", "status": "delivered",
     "funding": "balance", "total_usd": "11.90", "invoice_id": "inv_5k8p2q",
     "items": 1, "created_at": "1785230043", "delivered_at": "1785230103"}
  ]
}

مدیریت VPN

POST

ListVPN

read
https://apiservice.vitamindata.net/api/v1/ListVPN

همه حساب‌های VPN شما، با ترافیک باقی‌مانده و تاریخ انقضا.

درخواست
limitintاختیاری

اندازه صفحه. پیش‌فرض 50، حداکثر 200.

cursorcursorاختیاری

مقدار next_cursor پاسخ قبلی. برای صفحه اول نفرستید.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/ListVPN \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"limit":25,"cursor":""}'
پاسخ200 · application/json
vpnsarray

حساب‌های شما.

vpns[].vpn_idstring

شناسه عمومی که هر فعل VPN دیگری می‌گیرد.

vpns[].usernamestring

نام کاربری‌ای که در اپلیکیشن‌ها نشان داده می‌شود.

vpns[].statusstring

وضعیت حساب همان‌طور که پنل نشان می‌دهد — active مگر معلق یا منقضی باشد.

vpns[].remaining_bytesbytes

ترافیک باقی‌مانده در مجموع همه بسته‌های آن.

vpns[].total_downloadbytes

دانلود کل عمر، همان‌طور که سرویس VPN زنده گزارش می‌کند. در ListVPN همیشه 0 است — فهرست از کش خوانده می‌شود و تفکیک جهت ندارد. برای فهرست از used_bytes و برای تفکیک از GetVPN/GetVPNUsage استفاده کنید.

vpns[].total_uploadbytes

آپلود کل عمر. همان هشدار total_download: در ListVPN برابر 0 است.

vpns[].used_bytesbytes

کل ترافیک واقعاً مصرف‌شده (دانلود + آپلود). این عدد برای هر VPN نگهداری می‌شود، پس در همه‌ی نقاط از جمله ListVPN درست است.

vpns[].expires_atunix

زمان انقضای حساب.

vpns[].max_onlineint

تعداد دستگاه هم‌زمان مجاز.

vpns[].daily_limit_bytesbytes

سقف امروز. نبودن/0 = بدون سقف روزانه.

vpns[].daily_used_bytesbytes

مصرف‌شده از سقف امروز.

vpns[].daily_reset_unixunix

زمان صفر شدن شمارنده روزانه.

vpns[].allowed_protocolsint

بیت‌ماسک پروتکل برای اپلیکیشن‌های ما. آن را مبهم بگیرید.

vpns[].cache_atunix

تازگی اعداد: مگر آنکه live تنظیم شده باشد، اعداد به قدمت همین برچسب زمانی‌اند.

vpns[].created_atunix

زمان ساخت حساب.

vpns[].livebool

اعداد همین حالا از شبکه آمده‌اند، نه از کش.

next_cursorcursor

برای صفحه بعد آن را به‌عنوان cursor برگردانید. نبودن/خالی = همه چیز را گرفته‌اید.

نمونه پاسخ
{
  "vpns": [{
    "vpn_id": "vpn_6t2k9p",
    "username": "u482913",
    "status": "active",
    "remaining_bytes": "96636764160",
    "total_download": "10737418240",
    "used_bytes": "11811160064",
    "total_upload": "1073741824",
    "expires_at": "1793188800",
    "max_online": 3,
    "cache_at": "1785412700",
    "created_at": "1785000000"
  }],
  "next_cursor": "vpn_6t2k9p"
}
POST

GetVPN

read
https://apiservice.vitamindata.net/api/v1/GetVPN

جزئیات یک حساب. live:true یعنی اعداد همین حالا از شبکه آمده‌اند.

درخواست
vpn_idstringالزامی

شناسه عمومی حساب (vpn_…)، از ListVPN یا از تحویل یک سفارش.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/GetVPN \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vpn_id":"vpn_6t2k9p"}'
پاسخ200 · application/json
vpnobject

حساب.

vpn.vpn_idstring

شناسه عمومی که هر فعل VPN دیگری می‌گیرد.

vpn.usernamestring

نام کاربری‌ای که در اپلیکیشن‌ها نشان داده می‌شود.

vpn.statusstring

وضعیت حساب همان‌طور که پنل نشان می‌دهد — active مگر معلق یا منقضی باشد.

vpn.remaining_bytesbytes

ترافیک باقی‌مانده در مجموع همه بسته‌های آن.

vpn.total_downloadbytes

دانلود کل عمر، همان‌طور که سرویس VPN زنده گزارش می‌کند. در ListVPN همیشه 0 است — فهرست از کش خوانده می‌شود و تفکیک جهت ندارد. برای فهرست از used_bytes و برای تفکیک از GetVPN/GetVPNUsage استفاده کنید.

vpn.total_uploadbytes

آپلود کل عمر. همان هشدار total_download: در ListVPN برابر 0 است.

vpn.used_bytesbytes

کل ترافیک واقعاً مصرف‌شده (دانلود + آپلود). این عدد برای هر VPN نگهداری می‌شود، پس در همه‌ی نقاط از جمله ListVPN درست است.

vpn.expires_atunix

زمان انقضای حساب.

vpn.max_onlineint

تعداد دستگاه هم‌زمان مجاز.

vpn.daily_limit_bytesbytes

سقف امروز. نبودن/0 = بدون سقف روزانه.

vpn.daily_used_bytesbytes

مصرف‌شده از سقف امروز.

vpn.daily_reset_unixunix

زمان صفر شدن شمارنده روزانه.

vpn.allowed_protocolsint

بیت‌ماسک پروتکل برای اپلیکیشن‌های ما. آن را مبهم بگیرید.

vpn.cache_atunix

تازگی اعداد: مگر آنکه live تنظیم شده باشد، اعداد به قدمت همین برچسب زمانی‌اند.

vpn.created_atunix

زمان ساخت حساب.

vpn.livebool

اعداد همین حالا از شبکه آمده‌اند، نه از کش.

livebool

تازه از شبکه. نبودن = از مدل خواندن آمده، به قدمت cache_at.

نمونه پاسخ
{
  "vpn": {
    "vpn_id": "vpn_6t2k9p",
    "username": "u482913",
    "status": "active",
    "remaining_bytes": "96636764160",
    "total_download": "10737418240",
    "used_bytes": "11811160064",
    "total_upload": "1073741824",
    "expires_at": "1793188800",
    "max_online": 3,
    "cache_at": "1785412700",
    "created_at": "1785000000"
  },
  "live": true
}
POST

GetVPNUsage

read
https://apiservice.vitamindata.net/api/v1/GetVPNUsage

ترافیک مصرف‌شده و باقی‌مانده، و سقف امروز اگر سقفی باشد.

درخواست
vpn_idstringالزامی

شناسه عمومی حساب (vpn_…)، از ListVPN یا از تحویل یک سفارش.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/GetVPNUsage \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vpn_id":"vpn_6t2k9p"}'
پاسخ200 · application/json
vpn_idstring

بازتاب همان شناسه ارسالی.

remaining_bytesbytes

ترافیک باقی‌مانده.

total_downloadbytes

دانلود کل عمر.

total_uploadbytes

آپلود کل عمر.

expires_atunix

زمان انقضای حساب.

daily_limit_bytesbytes

سقف امروز. نبودن = ندارد.

daily_used_bytesbytes

مصرف‌شده از سقف امروز.

daily_reset_unixunix

زمان صفر شدن شمارنده روزانه.

cache_atunix

تازگی اعداد وقتی زنده نیستند.

livebool

همین حالا تازه از شبکه.

seriesarray

برای سری تاریخی مصرف رزرو شده — فعلاً خالی.

series[].tunix

آغاز بازه.

series[].rxbytes

دانلود در این بازه.

series[].txbytes

آپلود در این بازه.

نمونه پاسخ
{
  "vpn_id": "vpn_6t2k9p",
  "remaining_bytes": "96636764160",
  "total_download": "10737418240",
  "total_upload": "1073741824",
  "expires_at": "1793188800",
  "daily_limit_bytes": "53687091200",
  "daily_used_bytes": "1273741824",
  "daily_reset_unix": "1785456000",
  "cache_at": "1785412700",
  "live": true
}
POST

ListVPNBundles

read
https://apiservice.vitamindata.net/api/v1/ListVPNBundles

کیف‌های ترافیکی پشت یک حساب، به ترتیبی که مصرف می‌شوند.

با این می‌توانید پاسخ دهید «چرا ترافیک پول‌داده مشتری‌ام کم شد در حالی که ترافیک رایگان داشت؟» — queue_position 1 همان است که بعدی مصرف می‌شود. live:false یعنی نتوانستیم آن‌ها را بخوانیم، که با نداشتن‌شان یکی نیست.

درخواست
vpn_idstringالزامی

شناسه عمومی حساب (vpn_…)، از ListVPN یا از تحویل یک سفارش.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/ListVPNBundles \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vpn_id":"vpn_6t2k9p"}'
پاسخ200 · application/json
bundlesarray

کیف‌ها، به ترتیب مصرف.

bundles[].bundle_idstring

شناسه کیف.

bundles[].freebool

از سطح رایگان اعطا شده، نه خریداری‌شده.

bundles[].sourceenum

کیف از کجا آمده است.

یکی از:buyextendmigratedfree_tier
bundles[].granted_bytesbytes

حجم کامل آن هنگام اعطا.

bundles[].remaining_bytesbytes

آنچه در آن باقی مانده.

bundles[].granted_atunix

زمان اعطای آن.

bundles[].expires_atunix

زمانی که منقضی می‌شود، چه مصرف شده باشد چه نه.

bundles[].daily_limit_bytesbytes

سقف روزانه خودش. نبودن = ندارد.

bundles[].statusenum

با کلمه نوشته شده، نه با عدد، تا هرگز مجبور نشوید یاد بگیرید 2 یعنی تمام‌شده.

یکی از:activedisabledexhausted
bundles[].queue_positionint

شماره‌گذاری از 1 روی کیف‌های قابل استفاده، به ترتیب مصرف — 1 بعدی است که مصرف می‌شود. 0/نبودن یعنی از صف خارج است (مصرف‌شده، منقضی یا غیرفعال).

bundles[].plan_gbint

حجمی که با آن فروخته شد، به گیگابایت.

bundles[].plan_daysint

اعتباری که با آن فروخته شد، به روز.

bundles[].invoice_idstring

خریدی که از آن آمده. در اعطای رایگان وجود ندارد.

livebool

نبودن/false = سامانه سهمیه‌ها در دسترس نبود، پس فهرست به‌جای غلط بودن، خالی است. «نتوانستیم بخوانیم» و «چیزی نیست» دو جمله متفاوت‌اند.

نمونه پاسخ
{
  "bundles": [
    {"bundle_id": "bnd_2m8x", "source": "buy",
     "granted_bytes": "107374182400", "remaining_bytes": "96636764160",
     "granted_at": "1785000000", "expires_at": "1793188800",
     "status": "active", "queue_position": 1, "plan_gb": 100, "plan_days": 30,
     "invoice_id": "inv_5k8p2q"},
    {"bundle_id": "bnd_9k1f", "free": true, "source": "free_tier",
     "granted_bytes": "5368709120", "remaining_bytes": "5368709120",
     "granted_at": "1784000000", "expires_at": "1793188800",
     "status": "active", "queue_position": 2, "plan_gb": 5, "plan_days": 30}
  ],
  "live": true
}
POST

SetVPNPassword

credentials
https://apiservice.vitamindata.net/api/v1/SetVPNPassword

گذرواژه یک حساب را عوض می‌کند.

به دسترسی جداگانه credentials نیاز دارد — manage هرگز آن را در بر نمی‌گیرد.

درخواست
vpn_idstringالزامی

شناسه عمومی حساب (vpn_…)، از ListVPN یا از تحویل یک سفارش.

new_passwordstringالزامی

گذرواژه‌ای که تنظیم می‌شود.

credentialstringاختیاری

کدام اعتبارنامه، برای حساب‌های چنداعتبارنامه‌ای. خالی = اعتبارنامه اصلی.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/SetVPNPassword \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vpn_id":"vpn_6t2k9p","new_password":"s3cr3t-Enough","credential":""}'
پاسخ200 · application/json
usernamestring

اعتبارنامه‌ای که تغییر روی آن اعمال شد.

نمونه پاسخ
{"username": "u482913"}
POST

SetVPNState

manage
https://apiservice.vitamindata.net/api/v1/SetVPNState

یک حساب را معلق یا دوباره فعال می‌کند.

درخواست
vpn_idstringالزامی

شناسه عمومی حساب (vpn_…)، از ListVPN یا از تحویل یک سفارش.

stateenumالزامی

چه کاری انجام شود.

یکی از:suspendresume
نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/SetVPNState \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vpn_id":"vpn_6t2k9p","state":"suspend"}'
پاسخ200 · application/json
statusenum

وضعیتی که حساب در آن قرار گرفت.

یکی از:suspendedactive
نمونه پاسخ
{"status": "suspended"}
POST

DeleteVPN

manage
https://apiservice.vitamindata.net/api/v1/DeleteVPN

یک حساب را حذف می‌کند. بازگشتی و بازپرداختی ندارد.

درخواست
vpn_idstringالزامی

شناسه عمومی حساب (vpn_…)، از ListVPN یا از تحویل یک سفارش.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/DeleteVPN \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vpn_id":"vpn_6t2k9p"}'
پاسخ200 · application/json
statusenum

در موفقیت همیشه deleted.

یکی از:deleted
نمونه پاسخ
{"status": "deleted"}

فروش سرور

فروش VPS همان قرارداد پرداخت فروش VPN را دارد — فقط سبد خرید متفاوت است.

POST

GetVPSStorefront

read
https://apiservice.vitamindata.net/api/v1/GetVPSStorefront

موقعیت‌ها، پلن‌های قیمت‌گذاری‌شده در هر یک، و ایمیج‌های قابل بوت.

گره‌ای با available:false ظرفیت ندارد — نشانش دهید، اما نفروشید.

درخواست

بدون پارامتر — یک شیء خالی بفرستید، {}.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/GetVPSStorefront \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{}'
پاسخ200 · application/json
nodesarray

موقعیت‌ها، هر یک با پلن‌های قیمت‌گذاری‌شده خودش.

nodes[].node_idstring

همان چیزی که node_id سبد می‌گیرد.

nodes[].labelstring

نام نمایشی (Frankfurt).

nodes[].regionstring

کد منطقه‌ای کلی برای گروه‌بندی.

nodes[].countrystring

کد کشور ISO، برای پرچم‌ها.

nodes[].availablebool

نبودن/false = ظرفیت ندارد: نشانش دهید، اما نفروشید.

nodes[].plansarray

آنچه اینجا قابل فروش است، با قیمت.

nodes[].plans[].plan_codestring

همان چیزی که plan_code سبد می‌گیرد.

nodes[].plans[].namestring

نام نمایشی.

nodes[].plans[].vcpuint

هسته‌ها.

nodes[].plans[].ram_mbint

حافظه به مگابایت.

nodes[].plans[].disk_gbint

دیسک به گیگابایت.

nodes[].plans[].traffic_bytesbytes

ترافیک ماهانه شامل‌شده.

nodes[].plans[].price_usd_monthmoney

قیمت ماهانه در همین گره — همان پلن جای دیگر می‌تواند قیمت متفاوتی داشته باشد.

imagesarray

هر چیز قابل بوت یا نصب.

images[].shastring

تنها شناسه ایمیج — سبد خرید، نصب مجدد و اتصال ISO همه همین را می‌گیرند.

images[].namestring

نام انسانی (Debian 13).

images[].kindenum

ایمیج disk مستقیم راه‌اندازی می‌شود؛ iso نصب‌کننده‌ای است که از آن بوت می‌کنید.

یکی از:diskiso
images[].os_familyenum

برای گروه‌بندی و آیکون‌های رابط شما.

یکی از:linuxwindowsmikrotik
images[].min_disk_gbint

نصب مجدد روی دیسک کوچک‌تر رد می‌شود — اول دیسک را بزرگ کنید.

months_minint

کوتاه‌ترین مدتی که می‌توان یک ماشین مجازی تازه خرید.

months_maxint

طولانی‌ترین.

نمونه پاسخ
{
  "nodes": [
    {"node_id": "de1", "label": "Frankfurt", "region": "eu", "country": "DE", "available": true,
     "plans": [
       {"plan_code": "s2", "name": "S2", "vcpu": 2, "ram_mb": 4096, "disk_gb": 40,
        "traffic_bytes": "2199023255552", "price_usd_month": "8.00"}
     ]}
  ],
  "images": [
    {"sha": "9a1b8c2d7e6f", "name": "Debian 13", "kind": "disk", "os_family": "linux", "min_disk_gb": 10}
  ],
  "months_min": 1,
  "months_max": 12
}
POST

ListVPSImages

read
https://apiservice.vitamindata.net/api/v1/ListVPSImages

هر ایمیجی که می‌توانید بوت یا نصب کنید، با sha.

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

درخواست

بدون پارامتر — یک شیء خالی بفرستید، {}.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/ListVPSImages \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{}'
پاسخ200 · application/json
imagesarray

کاتالوگ.

images[].shastring

تنها شناسه ایمیج — سبد خرید، نصب مجدد و اتصال ISO همه همین را می‌گیرند.

images[].namestring

نام انسانی (Debian 13).

images[].kindenum

ایمیج disk مستقیم راه‌اندازی می‌شود؛ iso نصب‌کننده‌ای است که از آن بوت می‌کنید.

یکی از:diskiso
images[].os_familyenum

برای گروه‌بندی و آیکون‌های رابط شما.

یکی از:linuxwindowsmikrotik
images[].min_disk_gbint

نصب مجدد روی دیسک کوچک‌تر رد می‌شود — اول دیسک را بزرگ کنید.

نمونه پاسخ
{
  "images": [
    {"sha": "9a1b8c2d7e6f", "name": "Debian 13", "kind": "disk", "os_family": "linux", "min_disk_gb": 10},
    {"sha": "3f4e5d6c7b8a", "name": "Windows Server 2025 installer", "kind": "iso",
     "os_family": "windows", "min_disk_gb": 40}
  ]
}
POST

QuoteVPS

read
https://apiservice.vitamindata.net/api/v1/QuoteVPS

قیمت یک سرور تازه، ردیف‌به‌ردیف.

درخواست
cartobjectالزامی

سروری که قیمت‌گذاری می‌شود.

cart.node_idstringالزامی

ماشین مجازی کجا ساخته شود، از گره‌های فروشگاه.

cart.placementstringرزرو‌شده — نفرستید

رزرو شده. در این API همیشه node_id تعیین می‌کند سرور کجا ساخته شود — آن را بفرستید و گره را خودتان از فروشگاه انتخاب کنید.

یکی از:auto
cart.plan_codestringالزامی

پلن، از فهرست قیمت خود گره انتخابی — پلن‌ها و قیمت‌ها در هر گره متفاوت‌اند.

cart.image_shastringالزامی

چه چیزی بوت یا نصب شود، با sha. ایمیج‌های دیسکی مستقیم راه‌اندازی می‌شوند؛ ISO نصب‌کننده وصل‌شده می‌آید و ماشین برای بوت از آن تنظیم می‌شود.

cart.namestringالزامی

نام میزبان / برچسب ماشین مجازی.

cart.monthsintالزامی

مدت اولیه، داخل کران‌های ماه فروشگاه.

cart.extra_disk_gbintاختیاری

دیسک اضافه فراتر از پلن، به گیگابایت.

cart.extra_ipsintاختیاری

نشانی‌های IPv4 عمومی اضافه.

cart.extra_traffic_tbmoneyاختیاری

ترافیک ماهانه اضافه به ترابایت، به‌صورت رشته اعشاری ("0.5").

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/QuoteVPS \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"cart":{"node_id":"de1","plan_code":"s2","image_sha":"9a1b8c2d7e6f","months":2,"name":"web-1","extra_disk_gb":20,"extra_ips":1,"extra_traffic_tb":"0.5"}}'
پاسخ200 · application/json
quoteobject

قیمت ردیف‌به‌ردیف. نه چیزی ساخته می‌شود و نه پولی گرفته می‌شود.

quote.model_namestring

کدام مدل قیمت‌گذاری پاسخ داد.

quote.model_typestring

نسخه موتور مدل.

quote.base_usdmoney

قیمت پیش از تخفیف‌ها و هزینه‌های اضافه.

quote.total_usdmoney

قیمت نهایی — مبلغی که فروش با این سبد می‌گیرد.

quote.linesarray

ریز اقلام، علامت‌دار، که جمعشان دقیقاً برابر جمع کل است.

quote.lines[].codestring

این سطر چیست (base، یک کد تخفیف، یک هزینه اضافه…).

quote.lines[].kindstring

دسته سطر، برای گروه‌بندی در رابط شما.

quote.lines[].amount_usdmoney

علامت‌دار. تخفیف‌ها منفی‌اند؛ جمع سطرها دقیقاً total_usd می‌شود.

quote.lines[].pctstring

درصد پشت این سطر، اگر درصدی باشد.

quote.cappedbool

جمع کل به سقف مدل خورد.

quote.floor_appliedbool

جمع کل تا کف مدل بالا برده شد.

quote.clampedenum

وقتی مقداری از سبد پیش از قیمت‌گذاری به داخل کران‌ها محدود شده باشد، تنظیم می‌شود.

یکی از:minmax
quote.invalidstring

غیرخالی یعنی سبد قابل قیمت‌گذاری نیست — آن را نشان دهید و هرگز بابت چنین قیمتی پول نگیرید.

quote.metamap

اطلاعات اضافه مدل، رشته→رشته (مثلاً remaining_days در ارتقا).

نمونه پاسخ
{
  "quote": {
    "model_name": "vps_plan",
    "model_type": "vps_plan_v1",
    "base_usd": "16.00",
    "total_usd": "16.00",
    "lines": [
      {"code": "plan_s2", "kind": "base", "amount_usd": "16.00"}
    ],
    "meta": {"months": "2"}
  }
}
POST

CreateVPSOrder

buyIdempotency-Key
https://apiservice.vitamindata.net/api/v1/CreateVPSOrder

یک سرور می‌خرد و راه می‌اندازد.

برای تحویل GetOrder و بعد برای خود ماشین GetVPS را بخوانید.

درخواست
cartobjectالزامی

چه چیزی ساخته شود — همان شکلی که QuoteVPS قیمت می‌گذارد.

cart.node_idstringالزامی

ماشین مجازی کجا ساخته شود، از گره‌های فروشگاه.

cart.placementstringرزرو‌شده — نفرستید

رزرو شده. در این API همیشه node_id تعیین می‌کند سرور کجا ساخته شود — آن را بفرستید و گره را خودتان از فروشگاه انتخاب کنید.

یکی از:auto
cart.plan_codestringالزامی

پلن، از فهرست قیمت خود گره انتخابی — پلن‌ها و قیمت‌ها در هر گره متفاوت‌اند.

cart.image_shastringالزامی

چه چیزی بوت یا نصب شود، با sha. ایمیج‌های دیسکی مستقیم راه‌اندازی می‌شوند؛ ISO نصب‌کننده وصل‌شده می‌آید و ماشین برای بوت از آن تنظیم می‌شود.

cart.namestringالزامی

نام میزبان / برچسب ماشین مجازی.

cart.monthsintالزامی

مدت اولیه، داخل کران‌های ماه فروشگاه.

cart.extra_disk_gbintاختیاری

دیسک اضافه فراتر از پلن، به گیگابایت.

cart.extra_ipsintاختیاری

نشانی‌های IPv4 عمومی اضافه.

cart.extra_traffic_tbmoneyاختیاری

ترافیک ماهانه اضافه به ترابایت، به‌صورت رشته اعشاری ("0.5").

fundingenumالزامی

روش پرداخت — پرداخت را ببینید. پیش‌فرض ندارد: نفرستادنش رد می‌شود.

یکی از:FUNDING_AUTOFUNDING_BALANCEFUNDING_INVOICE
expected_total_usdmoneyاختیاری

محافظ تأیید. اگر تنظیم شود و قیمت تازه ما متفاوت باشد، فروش با price_changed رد می‌شود، به‌جای آنکه مبلغی که مشتری هرگز ندیده گرفته شود.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/CreateVPSOrder \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"cart":{"node_id":"de1","plan_code":"s2","image_sha":"9a1b8c2d7e6f","months":2,"name":"web-1","extra_disk_gb":20,"extra_ips":1,"extra_traffic_tb":"0.5"},"funding":"FUNDING_AUTO","expected_total_usd":"36.00"}'
پاسخ200 · application/json
orderobject

سفارش — GetOrder را بخوانید تا وضعیتش delivered شود.

order.order_idstring

شناسه عمومی سفارش (ord_…).

order.productenum

چه چیزی خریده شد.

یکی از:vpnvps
order.kindstring

نوع خرید: new، extend، upgrade

order.statusenum

چرخه عمر. delivered هدف است؛ needs_operator یعنی پول رسیده و یک انسان تحویل را تمام می‌کند — دوباره خرید نکنید؛ expired یعنی فاکتور بدون پرداخت منقضی شد.

یکی از:createdinvoicedpaiddeliveringdeliveredneeds_operatorfailedrefund_pendingrefundedexpired
order.fundingenum

کدام روش واقعاً هزینه را تأمین کرد. FUNDING_AUTO به یکی از همین‌ها ختم می‌شود.

یکی از:invoicebalance
order.total_usdmoney

مبلغی که سفارش می‌گیرد.

order.invoice_idstring

فاکتور پشت آن — هر سفارشی یکی دارد، با هر روشی که تأمین شده باشد.

order.itemsint

تعداد سرویس‌هایی که سفارش می‌سازد یا تمدید می‌کند.

order.created_atunix

زمان ثبت سفارش.

order.delivered_atunix

زمان پایان تحویل. تا آن موقع وجود ندارد.

order.breakdownobject

همان قیمتی که مشتری پذیرفت، عیناً — همان شکلی که Quote برمی‌گرداند.

invoiceobject

فاکتور پشت سفارش: با payment_required قابل پرداخت است، با completed از قبل تسویه شده.

invoice.invoice_idstring

شناسه فاکتور درگاه (inv_…).

invoice.statusenum

pending قابل پرداخت است. همه چیز از confirmed تا delivered_redirected یعنی پول برگشت‌ناپذیر رسیده — همه آن‌ها را پرداخت‌شده بگیرید. expired یعنی لینک بدون پرداخت منقضی شد.

یکی از:pendingconfirmedsweepingsweptdeliveringdelivereddelivered_redirectedexpired
invoice.pay_urlstring

صفحه پرداخت میزبانی‌شده. مشتری را به اینجا بفرستید؛ همه روش‌ها (کوین‌ها، زنجیره‌ها، موجودی) پشت آن است.

invoice.pay_telegram_urlstring

همان فاکتور، قابل پرداخت داخل تلگرام: بات خودِ درگاه پرداخت را باز می‌کند که مبلغ را نشان می‌دهد و پرداخت را همان‌جا می‌گیرد. آن را کنار pay_url به مشتری‌هایی پیشنهاد دهید که ترجیح می‌دهند از اپلیکیشن بیرون نروند. ممکن است نباشد — فقط درگاه پرداختی که بات تنظیم‌شده داشته باشد این لینک را دارد، پس هرگز آن را تنها دکمه پرداخت خود نکنید.

invoice.price_usdmoney

مبلغی که فاکتور می‌گیرد.

invoice.expires_atunix

زمان بسته شدن پنجره پرداخت.

paidbool

پول گرفته شده است. با payment_required وجود ندارد (= false).

statusenum

همان فیلدی که باید رویش شرط بگذارید — پرداخت را ببینید.

یکی از:completedpayment_required
نمونه پاسخ
{
  "order": {
    "order_id": "ord_2f8k3j", "product": "vps", "kind": "new",
    "status": "invoiced", "funding": "invoice", "total_usd": "16.00",
    "invoice_id": "inv_7h4w9s", "items": 1, "created_at": "1785412800"
  },
  "invoice": {
    "invoice_id": "inv_7h4w9s", "status": "pending",
    "pay_url": "https://pay.example.com/i/inv_7h4w9s",
    "price_usd": "16.00", "expires_at": "1785499200"
  },
  "status": "payment_required"
}
POST

QuoteVPSExtend

read
https://apiservice.vitamindata.net/api/v1/QuoteVPSExtend

هزینه تجدید یک سرور.

درخواست
vps_idstringالزامی

شناسه سرور، از ListVPS.

monthsintالزامی

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

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/QuoteVPSExtend \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vps_id":"vm_7q3k1n","months":1}'
پاسخ200 · application/json
quoteobject

قیمت ردیف‌به‌ردیف. نه چیزی ساخته می‌شود و نه پولی گرفته می‌شود.

quote.model_namestring

کدام مدل قیمت‌گذاری پاسخ داد.

quote.model_typestring

نسخه موتور مدل.

quote.base_usdmoney

قیمت پیش از تخفیف‌ها و هزینه‌های اضافه.

quote.total_usdmoney

قیمت نهایی — مبلغی که فروش با این سبد می‌گیرد.

quote.linesarray

ریز اقلام، علامت‌دار، که جمعشان دقیقاً برابر جمع کل است.

quote.lines[].codestring

این سطر چیست (base، یک کد تخفیف، یک هزینه اضافه…).

quote.lines[].kindstring

دسته سطر، برای گروه‌بندی در رابط شما.

quote.lines[].amount_usdmoney

علامت‌دار. تخفیف‌ها منفی‌اند؛ جمع سطرها دقیقاً total_usd می‌شود.

quote.lines[].pctstring

درصد پشت این سطر، اگر درصدی باشد.

quote.cappedbool

جمع کل به سقف مدل خورد.

quote.floor_appliedbool

جمع کل تا کف مدل بالا برده شد.

quote.clampedenum

وقتی مقداری از سبد پیش از قیمت‌گذاری به داخل کران‌ها محدود شده باشد، تنظیم می‌شود.

یکی از:minmax
quote.invalidstring

غیرخالی یعنی سبد قابل قیمت‌گذاری نیست — آن را نشان دهید و هرگز بابت چنین قیمتی پول نگیرید.

quote.metamap

اطلاعات اضافه مدل، رشته→رشته (مثلاً remaining_days در ارتقا).

نمونه پاسخ
{
  "quote": {
    "model_name": "vps_plan",
    "model_type": "vps_plan_v1",
    "base_usd": "16.00",
    "total_usd": "16.00",
    "lines": [
      {"code": "plan_s2", "kind": "base", "amount_usd": "16.00"}
    ],
    "meta": {"months": "2"}
  }
}
POST

ExtendVPS

buyIdempotency-Key
https://apiservice.vitamindata.net/api/v1/ExtendVPS

یک سرور را تجدید می‌کند.

تجدید زودهنگام هزینه اضافه ندارد: انقضای تازه از انقضای فعلی حساب می‌شود، نه از امروز.

درخواست
vps_idstringالزامی

شناسه سرور، از ListVPS.

monthsintالزامی

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

fundingenumالزامی

روش پرداخت — پرداخت را ببینید. پیش‌فرض ندارد: نفرستادنش رد می‌شود.

یکی از:FUNDING_AUTOFUNDING_BALANCEFUNDING_INVOICE
expected_total_usdmoneyاختیاری

محافظ تأیید. اگر تنظیم شود و قیمت تازه ما متفاوت باشد، فروش با price_changed رد می‌شود، به‌جای آنکه مبلغی که مشتری هرگز ندیده گرفته شود.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/ExtendVPS \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"vps_id":"vm_7q3k1n","months":1,"funding":"FUNDING_AUTO","expected_total_usd":"8.00"}'
پاسخ200 · application/json
orderobject

سفارش — GetOrder را بخوانید تا وضعیتش delivered شود.

order.order_idstring

شناسه عمومی سفارش (ord_…).

order.productenum

چه چیزی خریده شد.

یکی از:vpnvps
order.kindstring

نوع خرید: new، extend، upgrade

order.statusenum

چرخه عمر. delivered هدف است؛ needs_operator یعنی پول رسیده و یک انسان تحویل را تمام می‌کند — دوباره خرید نکنید؛ expired یعنی فاکتور بدون پرداخت منقضی شد.

یکی از:createdinvoicedpaiddeliveringdeliveredneeds_operatorfailedrefund_pendingrefundedexpired
order.fundingenum

کدام روش واقعاً هزینه را تأمین کرد. FUNDING_AUTO به یکی از همین‌ها ختم می‌شود.

یکی از:invoicebalance
order.total_usdmoney

مبلغی که سفارش می‌گیرد.

order.invoice_idstring

فاکتور پشت آن — هر سفارشی یکی دارد، با هر روشی که تأمین شده باشد.

order.itemsint

تعداد سرویس‌هایی که سفارش می‌سازد یا تمدید می‌کند.

order.created_atunix

زمان ثبت سفارش.

order.delivered_atunix

زمان پایان تحویل. تا آن موقع وجود ندارد.

order.breakdownobject

همان قیمتی که مشتری پذیرفت، عیناً — همان شکلی که Quote برمی‌گرداند.

invoiceobject

فاکتور پشت سفارش: با payment_required قابل پرداخت است، با completed از قبل تسویه شده.

invoice.invoice_idstring

شناسه فاکتور درگاه (inv_…).

invoice.statusenum

pending قابل پرداخت است. همه چیز از confirmed تا delivered_redirected یعنی پول برگشت‌ناپذیر رسیده — همه آن‌ها را پرداخت‌شده بگیرید. expired یعنی لینک بدون پرداخت منقضی شد.

یکی از:pendingconfirmedsweepingsweptdeliveringdelivereddelivered_redirectedexpired
invoice.pay_urlstring

صفحه پرداخت میزبانی‌شده. مشتری را به اینجا بفرستید؛ همه روش‌ها (کوین‌ها، زنجیره‌ها، موجودی) پشت آن است.

invoice.pay_telegram_urlstring

همان فاکتور، قابل پرداخت داخل تلگرام: بات خودِ درگاه پرداخت را باز می‌کند که مبلغ را نشان می‌دهد و پرداخت را همان‌جا می‌گیرد. آن را کنار pay_url به مشتری‌هایی پیشنهاد دهید که ترجیح می‌دهند از اپلیکیشن بیرون نروند. ممکن است نباشد — فقط درگاه پرداختی که بات تنظیم‌شده داشته باشد این لینک را دارد، پس هرگز آن را تنها دکمه پرداخت خود نکنید.

invoice.price_usdmoney

مبلغی که فاکتور می‌گیرد.

invoice.expires_atunix

زمان بسته شدن پنجره پرداخت.

paidbool

پول گرفته شده است. با payment_required وجود ندارد (= false).

statusenum

همان فیلدی که باید رویش شرط بگذارید — پرداخت را ببینید.

یکی از:completedpayment_required
نمونه پاسخ
{
  "order": {
    "order_id": "ord_5d1p8m", "product": "vps", "kind": "extend",
    "status": "paid", "funding": "balance", "total_usd": "8.00",
    "invoice_id": "inv_1c6v3z", "items": 1, "created_at": "1785412800"
  },
  "invoice": {
    "invoice_id": "inv_1c6v3z", "status": "confirmed", "price_usd": "8.00"
  },
  "paid": true,
  "status": "completed"
}
POST

QuoteVPSUpgrade

read
https://apiservice.vitamindata.net/api/v1/QuoteVPSUpgrade

هزینه یک پیکربندی بزرگ‌تر، به‌نسبت زمانی که پولش پرداخت شده.

درخواست
vps_idstringالزامی

شناسه سرور، از ListVPS.

specobjectالزامی

پیکربندی هدف. فیلدهای نفرستاده/صفر مقدار فعلی خود را نگه می‌دارند.

spec.vcpuintاختیاری

هسته‌های هدف. 0 مقدار فعلی را نگه می‌دارد.

spec.ram_mbintاختیاری

حافظه هدف به مگابایت. 0 مقدار فعلی را نگه می‌دارد.

spec.disk_gbintاختیاری

دیسک هدف به گیگابایت. دیسک فقط بزرگ می‌شود — مقدار کوچک‌تر رد می‌شود، چون کوچک کردن فایل‌سیستم زیر یک سیستم‌عامل یعنی از دست رفتن داده.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/QuoteVPSUpgrade \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"vps_id":"vm_7q3k1n","spec":{"vcpu":4,"ram_mb":8192,"disk_gb":80}}'
پاسخ200 · application/json
quoteobject

قیمت ردیف‌به‌ردیف. نه چیزی ساخته می‌شود و نه پولی گرفته می‌شود.

quote.model_namestring

کدام مدل قیمت‌گذاری پاسخ داد.

quote.model_typestring

نسخه موتور مدل.

quote.base_usdmoney

قیمت پیش از تخفیف‌ها و هزینه‌های اضافه.

quote.total_usdmoney

قیمت نهایی — مبلغی که فروش با این سبد می‌گیرد.

quote.linesarray

ریز اقلام، علامت‌دار، که جمعشان دقیقاً برابر جمع کل است.

quote.lines[].codestring

این سطر چیست (base، یک کد تخفیف، یک هزینه اضافه…).

quote.lines[].kindstring

دسته سطر، برای گروه‌بندی در رابط شما.

quote.lines[].amount_usdmoney

علامت‌دار. تخفیف‌ها منفی‌اند؛ جمع سطرها دقیقاً total_usd می‌شود.

quote.lines[].pctstring

درصد پشت این سطر، اگر درصدی باشد.

quote.cappedbool

جمع کل به سقف مدل خورد.

quote.floor_appliedbool

جمع کل تا کف مدل بالا برده شد.

quote.clampedenum

وقتی مقداری از سبد پیش از قیمت‌گذاری به داخل کران‌ها محدود شده باشد، تنظیم می‌شود.

یکی از:minmax
quote.invalidstring

غیرخالی یعنی سبد قابل قیمت‌گذاری نیست — آن را نشان دهید و هرگز بابت چنین قیمتی پول نگیرید.

quote.metamap

اطلاعات اضافه مدل، رشته→رشته (مثلاً remaining_days در ارتقا).

restart_requiredbool

اعمال این پیکربندی به خاموش و روشن شدن نیاز دارد — مشتری باید این را پیش از پرداخت بداند.

monthly_before_usdmoney

قیمت دوره‌ای امروز.

monthly_after_usdmoney

قیمت دوره‌ای پس از ارتقا — تجدیدها از این پس همین‌قدر هزینه دارند.

نمونه پاسخ
{
  "quote": {
    "model_name": "vps_upgrade",
    "model_type": "vps_plan_v1",
    "base_usd": "4.20",
    "total_usd": "4.20",
    "lines": [
      {"code": "prorate_vcpu", "kind": "vps_upgrade", "amount_usd": "2.40"},
      {"code": "prorate_ram", "kind": "vps_upgrade", "amount_usd": "1.80"}
    ],
    "meta": {"remaining_days": "21", "monthly_delta_usd": "6.00", "quote_expires_at": "1785416400"}
  },
  "restart_required": true,
  "monthly_before_usd": "8.00",
  "monthly_after_usd": "14.00"
}
POST

UpgradeVPS

buyIdempotency-Key
https://apiservice.vitamindata.net/api/v1/UpgradeVPS

پول پیکربندی بزرگ‌تر را می‌گیرد و اعمالش می‌کند. دیسک فقط می‌تواند بزرگ شود.

درخواست
vps_idstringالزامی

شناسه سرور، از ListVPS.

specobjectالزامی

پیکربندی هدف — اول قیمتش را بگیرید؛ استعلام قیمت درباره ری‌بوت هم به شما می‌گوید.

spec.vcpuintاختیاری

هسته‌های هدف. 0 مقدار فعلی را نگه می‌دارد.

spec.ram_mbintاختیاری

حافظه هدف به مگابایت. 0 مقدار فعلی را نگه می‌دارد.

spec.disk_gbintاختیاری

دیسک هدف به گیگابایت. دیسک فقط بزرگ می‌شود — مقدار کوچک‌تر رد می‌شود، چون کوچک کردن فایل‌سیستم زیر یک سیستم‌عامل یعنی از دست رفتن داده.

fundingenumالزامی

روش پرداخت — پرداخت را ببینید. پیش‌فرض ندارد: نفرستادنش رد می‌شود.

یکی از:FUNDING_AUTOFUNDING_BALANCEFUNDING_INVOICE
expected_total_usdmoneyاختیاری

محافظ تأیید. اگر تنظیم شود و قیمت تازه ما متفاوت باشد، فروش با price_changed رد می‌شود، به‌جای آنکه مبلغی که مشتری هرگز ندیده گرفته شود.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/UpgradeVPS \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"vps_id":"vm_7q3k1n","spec":{"vcpu":4,"ram_mb":8192,"disk_gb":80},"funding":"FUNDING_AUTO","expected_total_usd":"4.20"}'
پاسخ200 · application/json
orderobject

سفارش — GetOrder را بخوانید تا وضعیتش delivered شود.

order.order_idstring

شناسه عمومی سفارش (ord_…).

order.productenum

چه چیزی خریده شد.

یکی از:vpnvps
order.kindstring

نوع خرید: new، extend، upgrade

order.statusenum

چرخه عمر. delivered هدف است؛ needs_operator یعنی پول رسیده و یک انسان تحویل را تمام می‌کند — دوباره خرید نکنید؛ expired یعنی فاکتور بدون پرداخت منقضی شد.

یکی از:createdinvoicedpaiddeliveringdeliveredneeds_operatorfailedrefund_pendingrefundedexpired
order.fundingenum

کدام روش واقعاً هزینه را تأمین کرد. FUNDING_AUTO به یکی از همین‌ها ختم می‌شود.

یکی از:invoicebalance
order.total_usdmoney

مبلغی که سفارش می‌گیرد.

order.invoice_idstring

فاکتور پشت آن — هر سفارشی یکی دارد، با هر روشی که تأمین شده باشد.

order.itemsint

تعداد سرویس‌هایی که سفارش می‌سازد یا تمدید می‌کند.

order.created_atunix

زمان ثبت سفارش.

order.delivered_atunix

زمان پایان تحویل. تا آن موقع وجود ندارد.

order.breakdownobject

همان قیمتی که مشتری پذیرفت، عیناً — همان شکلی که Quote برمی‌گرداند.

invoiceobject

فاکتور پشت سفارش: با payment_required قابل پرداخت است، با completed از قبل تسویه شده.

invoice.invoice_idstring

شناسه فاکتور درگاه (inv_…).

invoice.statusenum

pending قابل پرداخت است. همه چیز از confirmed تا delivered_redirected یعنی پول برگشت‌ناپذیر رسیده — همه آن‌ها را پرداخت‌شده بگیرید. expired یعنی لینک بدون پرداخت منقضی شد.

یکی از:pendingconfirmedsweepingsweptdeliveringdelivereddelivered_redirectedexpired
invoice.pay_urlstring

صفحه پرداخت میزبانی‌شده. مشتری را به اینجا بفرستید؛ همه روش‌ها (کوین‌ها، زنجیره‌ها، موجودی) پشت آن است.

invoice.pay_telegram_urlstring

همان فاکتور، قابل پرداخت داخل تلگرام: بات خودِ درگاه پرداخت را باز می‌کند که مبلغ را نشان می‌دهد و پرداخت را همان‌جا می‌گیرد. آن را کنار pay_url به مشتری‌هایی پیشنهاد دهید که ترجیح می‌دهند از اپلیکیشن بیرون نروند. ممکن است نباشد — فقط درگاه پرداختی که بات تنظیم‌شده داشته باشد این لینک را دارد، پس هرگز آن را تنها دکمه پرداخت خود نکنید.

invoice.price_usdmoney

مبلغی که فاکتور می‌گیرد.

invoice.expires_atunix

زمان بسته شدن پنجره پرداخت.

paidbool

پول گرفته شده است. با payment_required وجود ندارد (= false).

statusenum

همان فیلدی که باید رویش شرط بگذارید — پرداخت را ببینید.

یکی از:completedpayment_required
نمونه پاسخ
{
  "order": {
    "order_id": "ord_5d1p8m", "product": "vps", "kind": "extend",
    "status": "paid", "funding": "balance", "total_usd": "8.00",
    "invoice_id": "inv_1c6v3z", "items": 1, "created_at": "1785412800"
  },
  "invoice": {
    "invoice_id": "inv_1c6v3z", "status": "confirmed", "price_usd": "8.00"
  },
  "paid": true,
  "status": "completed"
}

مدیریت سرور

همه فعل‌های این بخش سرور را با id می‌گیرند — نام فیلد در این فراخوانی‌ها دقیقاً id است، برخلاف فعل‌های پولی که vps_id دارند.

POST

ListVPS

read
https://apiservice.vitamindata.net/api/v1/ListVPS

ماشین‌های شما، با وضعیت روشن/خاموش و نشانی‌ها.

درخواست
limitintاختیاری

اندازه صفحه. پیش‌فرض 50.

cursorcursorاختیاری

مقدار next_cursor پاسخ قبلی. برای صفحه اول نفرستید.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/ListVPS \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"limit":50,"cursor":""}'
پاسخ200 · application/json
vpsarray

ماشین‌های شما.

vps[].idstring

شناسه سرور — همان چیزی که id هر فعل مدیریتی و vps_id هر فعل پولی می‌گیرد.

vps[].namestring

نام میزبان / برچسب آن.

vps[].node_idstring

جایی که اجرا می‌شود.

vps[].lifecycleenum

0 در حال راه‌اندازی · 1 فعال · 2 معلق · 3 در حال حذف · 4 حذف‌شده.

یکی از:01234
vps[].provisionedbool

ماشین روی میزبانش وجود دارد.

vps[].power_desiredenum

وضعیت مطلوب برق: 1 روشن، 0/نبودن خاموش. وضعیت زنده در GetVPSStats.running است.

یکی از:01
vps[].vcpuint

هسته‌ها.

vps[].mem_mbint

حافظه به مگابایت.

vps[].disk_gbint

دیسک به گیگابایت.

vps[].image_shastring

از چه چیزی بوت یا نصب شده است.

vps[].expires_atunix

زمان انقضای سرور — پیش از آن با ExtendVPS تجدید کنید.

vps[].created_atunix

زمان ساخت آن.

vps[].ipsarray

نشانی‌های عمومی آن.

vps[].private_ipstring

نشانی خصوصی آن، اگر پلن شامل آن باشد.

next_cursorcursor

برای صفحه بعد آن را به‌عنوان cursor برگردانید. نبودن/خالی = همه چیز را گرفته‌اید.

نمونه پاسخ
{
  "vps": [{
    "id": "vm_7q3k1n",
    "name": "web-1",
    "node_id": "de1",
    "lifecycle": 1,
    "provisioned": true,
    "power_desired": 1,
    "vcpu": 2,
    "mem_mb": 4096,
    "disk_gb": 40,
    "image_sha": "9a1b8c2d7e6f",
    "expires_at": "1793188800",
    "created_at": "1785000000",
    "ips": ["203.0.113.10"],
    "private_ip": "10.77.0.10"
  }]
}
POST

GetVPS

read
https://apiservice.vitamindata.net/api/v1/GetVPS

جزئیات یک ماشین.

درخواست
idstringالزامی

شناسه سرور، از ListVPS. توجه: نام فیلد در فعل‌های مدیریتی id است — فقط فعل‌های پولی آن را vps_id می‌نویسند.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/GetVPS \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n"}'
پاسخ200 · application/json
vpsobject

ماشین.

vps.idstring

شناسه سرور — همان چیزی که id هر فعل مدیریتی و vps_id هر فعل پولی می‌گیرد.

vps.namestring

نام میزبان / برچسب آن.

vps.node_idstring

جایی که اجرا می‌شود.

vps.lifecycleenum

0 در حال راه‌اندازی · 1 فعال · 2 معلق · 3 در حال حذف · 4 حذف‌شده.

یکی از:01234
vps.provisionedbool

ماشین روی میزبانش وجود دارد.

vps.power_desiredenum

وضعیت مطلوب برق: 1 روشن، 0/نبودن خاموش. وضعیت زنده در GetVPSStats.running است.

یکی از:01
vps.vcpuint

هسته‌ها.

vps.mem_mbint

حافظه به مگابایت.

vps.disk_gbint

دیسک به گیگابایت.

vps.image_shastring

از چه چیزی بوت یا نصب شده است.

vps.expires_atunix

زمان انقضای سرور — پیش از آن با ExtendVPS تجدید کنید.

vps.created_atunix

زمان ساخت آن.

vps.ipsarray

نشانی‌های عمومی آن.

vps.private_ipstring

نشانی خصوصی آن، اگر پلن شامل آن باشد.

livebool

همین حالا از سامانه خوانده شد.

نمونه پاسخ
{
  "vps": {
    "id": "vm_7q3k1n",
    "name": "web-1",
    "node_id": "de1",
    "lifecycle": 1,
    "provisioned": true,
    "power_desired": 1,
    "vcpu": 2,
    "mem_mb": 4096,
    "disk_gb": 40,
    "image_sha": "9a1b8c2d7e6f",
    "expires_at": "1793188800",
    "created_at": "1785000000",
    "ips": ["203.0.113.10"],
    "private_ip": "10.77.0.10"
  },
  "live": true
}
POST

GetVPSStats

read
https://apiservice.vitamindata.net/api/v1/GetVPSStats

پردازنده، حافظه، دیسک و شبکه به‌صورت زنده.

درخواست
idstringالزامی

شناسه سرور، از ListVPS. توجه: نام فیلد در فعل‌های مدیریتی id است — فقط فعل‌های پولی آن را vps_id می‌نویسند.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/GetVPSStats \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n"}'
پاسخ200 · application/json
cpu_pctint

بار پردازنده، درصد.

mem_used_mbint

حافظه در حال استفاده، مگابایت.

disk_used_mbint

دیسک در حال استفاده، مگابایت.

rx_bpsint64

ورودی، بیت بر ثانیه.

tx_bpsint64

خروجی، بیت بر ثانیه.

runningbool

ماشین همین حالا روشن است.

updated_atunix

زمان نمونه‌برداری این اعداد.

نمونه پاسخ
{
  "cpu_pct": 12,
  "mem_used_mb": 1536,
  "disk_used_mb": 9216,
  "rx_bps": "1048576",
  "tx_bps": "524288",
  "running": true,
  "updated_at": "1785412790"
}
POST

GetVPSUsage

read
https://apiservice.vitamindata.net/api/v1/GetVPSUsage

ترافیک مصرف‌شده از سهمیه ماشین، به تفکیک بسته.

درخواست
idstringالزامی

شناسه سرور، از ListVPS. توجه: نام فیلد در فعل‌های مدیریتی id است — فقط فعل‌های پولی آن را vps_id می‌نویسند.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/GetVPSUsage \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n"}'
پاسخ200 · application/json
total_downbytes

دانلود کل عمر.

total_upbytes

آپلود کل عمر.

bundlesarray

بسته‌های ترافیکی، که current بسته در حال مصرف را نشان می‌دهد.

bundles[].idint64

شناسه بسته ترافیکی روی سامانه پردازش.

bundles[].modeint

کد حالت حسابداری سامانه. آن را مبهم بگیرید.

bundles[].bytes_totalbytes

سهمیه کامل بسته.

bundles[].used_dlbytes

دانلود انجام‌شده از آن.

bundles[].used_upbytes

آپلود انجام‌شده از آن.

bundles[].stateint

کد وضعیت سامانه. آن را مبهم بگیرید.

bundles[].currentbool

این همان بسته‌ای است که هم‌اکنون مصرف می‌شود.

bundles[].expires_atunix

زمان انقضای بسته.

نمونه پاسخ
{
  "total_down": "53687091200",
  "total_up": "10737418240",
  "bundles": [
    {"id": "41", "mode": 1, "bytes_total": "2199023255552",
     "used_dl": "53687091200", "used_up": "10737418240",
     "state": 1, "current": true, "expires_at": "1793188800"}
  ]
}
POST

VPSPower

manage
https://apiservice.vitamindata.net/api/v1/VPSPower

کنترل روشن/خاموش.

shutdown از سیستم‌عامل می‌خواهد؛ force_stop برق را می‌کشد. اولی را ترجیح دهید.

درخواست
idstringالزامی

شناسه سرور، از ListVPS. توجه: نام فیلد در فعل‌های مدیریتی id است — فقط فعل‌های پولی آن را vps_id می‌نویسند.

actionenumالزامی

shutdown/reboot نرم‌اند؛ reset/force_stop همان دکمه برق‌اند.

یکی از:startshutdownrebootresetforce_stop
نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/VPSPower \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n","action":"reboot"}'
پاسخ200 · application/json
okbool

سامانه عمل را پذیرفت. وضعیت واقعی ماشین را در GetVPSStats دنبال کنید.

نمونه پاسخ
{"ok": true}
POST

ReinstallVPS

manage
https://apiservice.vitamindata.net/api/v1/ReinstallVPS

دیسک را پاک می‌کند و ایمیج تازه نصب می‌کند.

مخرب است و برای تلاش مجدد ایمن نیست — یک فراخوانی، یک نصب مجدد. ایمیج باید در دیسک فعلی جا شود؛ اگر جا نمی‌شود اول دیسک را بزرگ کنید.

درخواست
idstringالزامی

شناسه سرور، از ListVPS. توجه: نام فیلد در فعل‌های مدیریتی id است — فقط فعل‌های پولی آن را vps_id می‌نویسند.

image_shastringالزامی

ایمیج، با sha از ListVPSImages. هیچ چیز دیگری ایمیج را مشخص نمی‌کند، و sha عرضه‌نشده رد می‌شود.

reset_rootboolاختیاری

یک گذرواژه root تازه هم ساخته شود.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/ReinstallVPS \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n","image_sha":"9a1b8c2d7e6f","reset_root":true}'
پاسخ200 · application/json
okbool

سامانه عمل را پذیرفت. وضعیت واقعی ماشین را در GetVPSStats دنبال کنید.

نمونه پاسخ
{"ok": true}
POST

AttachVPSISO

manage
https://apiservice.vitamindata.net/api/v1/AttachVPSISO

یک ISO نصب را وصل می‌کند. برای بوت از آن، ترتیب بوت را 1 بگذارید.

درخواست
idstringالزامی

شناسه سرور، از ListVPS. توجه: نام فیلد در فعل‌های مدیریتی id است — فقط فعل‌های پولی آن را vps_id می‌نویسند.

image_shastringالزامی

ایمیج، با sha از ListVPSImages. هیچ چیز دیگری ایمیج را مشخص نمی‌کند، و sha عرضه‌نشده رد می‌شود.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/AttachVPSISO \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n","image_sha":"3f4e5d6c7b8a"}'
پاسخ200 · application/json
okbool

سامانه عمل را پذیرفت. وضعیت واقعی ماشین را در GetVPSStats دنبال کنید.

نمونه پاسخ
{"ok": true}
POST

DetachVPSISO

manage
https://apiservice.vitamindata.net/api/v1/DetachVPSISO

ISO را جدا می‌کند و به بوت از دیسک برمی‌گردد.

درخواست
idstringالزامی

شناسه سرور، از ListVPS. توجه: نام فیلد در فعل‌های مدیریتی id است — فقط فعل‌های پولی آن را vps_id می‌نویسند.

نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/DetachVPSISO \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n"}'
پاسخ200 · application/json
okbool

سامانه عمل را پذیرفت. وضعیت واقعی ماشین را در GetVPSStats دنبال کنید.

نمونه پاسخ
{"ok": true}
POST

SetVPSBootOrder

manage
https://apiservice.vitamindata.net/api/v1/SetVPSBootOrder

کدام دستگاه اول بوت شود.

درخواست
idstringالزامی

شناسه سرور، از ListVPS. توجه: نام فیلد در فعل‌های مدیریتی id است — فقط فعل‌های پولی آن را vps_id می‌نویسند.

orderenumالزامی

0 اول دیسک، 1 اول CD-ROM.

یکی از:01
نمونه درخواست
curl https://apiservice.vitamindata.net/api/v1/SetVPSBootOrder \
  -H "Authorization: Bearer $YOUR_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"id":"vm_7q3k1n","order":1}'
پاسخ200 · application/json
okbool

سامانه عمل را پذیرفت. وضعیت واقعی ماشین را در GetVPSStats دنبال کنید.

نمونه پاسخ
{"ok": true}