مرجع 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 — دقیقاً یکی از مقدارهای فهرستشده. - فیلدهای تازه بدون اطلاع اضافه میشوند و معنی فیلدهای موجود عوض نمیشود. آنچه را نمیشناسید نادیده بگیرید.
شروع کار
نخستین فراخوانی: ثابت میکند کلید کار میکند و میگوید به کدام حساب تعلق دارد.
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"
}
حساب و موجودی
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
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"
}
}
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"
}
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"
}
}
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
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"
}
قیمتها
هیچچیز در این بخش چیزی نمیسازد — پیش از تصمیم مشتری هر چند بار که خواستید قیمت بگیرید.
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}
]
}
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"
}
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"}
]
}
}
}
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
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
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
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"
}
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
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
}
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[].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
}
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
GetSubscriptionLink
read
https://apiservice.vitamindata.net/api/v1/GetSubscriptionLinkنشانی اشتراکی که اپلیکیشن مشتری وارد میکند. این همان چیزی است که در فروش VPN تحویل میدهید.
درخواست
vpn_idstringالزامی
شناسه عمومی حساب (vpn_…)، از ListVPN یا از تحویل یک سفارش.
نمونه درخواستcurl https://apiservice.vitamindata.net/api/v1/GetSubscriptionLink \
-H "Authorization: Bearer $YOUR_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"vpn_id":"vpn_6t2k9p"}'
پاسخ200 · application/json
subscription_urlstring
این را به اپلیکیشن مشتری بدهید — کل تحویل همین است.
tokenstring
توکن خام، برای اینکه خودتان QR یا لینک واردکردن در اپلیکیشن بسازید.
نمونه پاسخ{
"subscription_url": "https://sub.example.com/s/9f3kq8x2",
"token": "9f3kq8x2"
}
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"}
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"}
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 را دارد — فقط سبد خرید متفاوت است.
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
}
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
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}
]
}
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"
}
https://apiservice.vitamindata.net/api/v1/QuoteVPSExtendهزینه تجدید یک سرور.
درخواست
vps_idstringالزامی
شناسه سرور، از ListVPS.
monthsintالزامی
چند ماه اضافه شود. کرانهای months_min…months_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_min…months_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"
}
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 دارند.
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
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[].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"
}]
}
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
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.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
}
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"
}
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"}
]
}
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 دنبال کنید.
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 دنبال کنید.
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 دنبال کنید.
https://apiservice.vitamindata.net/api/v1/DetachVPSISOISO را جدا میکند و به بوت از دیسک برمیگردد.
درخواست
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 دنبال کنید.
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 دنبال کنید.