آویاتو
ورود به پنل
AVIATO API · V1 راهنمای استفاده

راهنمای استفاده از API آویاتو

در این صفحه، از ساخت کلید API و پیدا کردن UUID پروژه تا دریافت گزینه‌ها، ساخت VM، پیگیری وضعیت، اتصال SSH و حذف امن را قدم‌به‌قدم می‌بینید.

قبل از اولین درخواست: وارد پنل مشتری شوید، از لینک «پروفایل» در بالای سمت چپ صفحه وارد صفحه پروفایل شوید و یک کلید API بسازید. سپس UUID واقعی پروژه و گزینه‌های ساخت را از همین راهنما و endpoint گزینه‌ها بردارید.

راهنمای شروع

ترتیب پیشنهادی استفاده از API

1

وارد پنل شوید و کلید بسازید

2

UUID پروژه را پیدا کنید

3

گزینه‌های ساخت را بخوانید

4

VM بسازید و وضعیت را بخوانید

5

در صورت نیاز، VM را حذف کنید

ساخت و حذف فوری نیستند. پس از ارسال درخواست، از endpoint جزئیات استفاده کنید و مقدار provisioning_status یا status را تا پایان عملیات بررسی کنید.

۰۱ · دسترسی

ساخت کلید API و انتخاب دسترسی‌ها

برای ساخت کلید، ابتدا وارد پنل مشتری شوید. لینک «پروفایل» در بالای سمت چپ صفحه قرار دارد؛ روی آن کلیک کنید، وارد صفحه پروفایل شوید و در بخش «دسترسی API» نام کلید را وارد کنید. دسترسی‌های مورد نیاز را انتخاب کنید و روی «ساخت کلید API» بزنید. مقدار کلید فقط همان لحظه نمایش داده می‌شود، پس آن را در محل امن ذخیره کنید.

هدر هر درخواست: کلید را با فرمت Authorization: Bearer YOUR_API_KEY ارسال کنید. کلید را داخل کد سمت کاربر، Git یا لاگ‌ها قرار ندهید.
vm:read

خواندن options، list و detail

vm:create

ارسال درخواست ساخت VM

vm:delete

ارسال درخواست حذف VM

برای خواندن، فقط vm:read کافی است. برای ساخت باید vm:create و برای حذف باید vm:delete روی همان کلید فعال باشد. این دسترسی‌ها مستقل‌اند و یک کلید فقط به endpointهایی دسترسی دارد که ability آن را دارد.

S3 · ۰۱

S3 چیست و چگونه کار می‌کند؟

S3 یک فضای ذخیره‌سازی شیءگراست: فایل شما داخل یک bucket قرار می‌گیرد و با یک نام یکتا به نام object key قابل دسترسی است. در آویاتو، endpoint استاندارد S3 روی https://s3.aviato.ir ارائه می‌شود و ابزارهای رسمی AWS CLI، SDK PHP و SDK JavaScript می‌توانند به آن متصل شوند.

Bucket

فضای نام پروژه؛ مثل customer-backups

Object key

مسیر منطقی فایل؛ مثل uploads/invoice.pdf

S3 credentials

Access key و secret برای امضای SigV4

نمونه واقعی: یک فروشگاه آنلاین می‌تواند بعد از پرداخت، فاکتور PDF مشتری را با کلید orders/2026/07/order-1842.pdf در باکت ذخیره کند و هنگام درخواست مشتری همان فایل را با API دریافت کند؛ فایل روی سرور وب شما عبور نمی‌کند و مسیر ذخیره‌سازی یکپارچه می‌ماند.

هر درخواست S3 با AWS Signature Version 4 امضا می‌شود. کلاینت با access key و secret، متد HTTP، مسیر، هدرها و زمان درخواست را امضا می‌کند؛ آویاتو امضا را بررسی می‌کند، پروژه صاحب کلید را پیدا می‌کند و فقط به باکت‌های همان پروژه اجازه دسترسی می‌دهد.

S3 · ۰۲ · راه‌اندازی

ساخت باکت و کلید دسترسی

  1. ۱وارد پنل مشتری شوید و از منوی «فضای ذخیره‌سازی» پروژه فعال را انتخاب کنید.
  2. ۲در بخش «باکت‌ها» یک نام کوچک انگلیسی بسازید؛ مثلا customer-backups. نام باکت در آویاتو باید یکتا باشد.
  3. ۳در بخش «کلیدهای اتصال» یک توضیح مثل Production backups بنویسید و کلید بسازید.
  4. ۴Access key ID و Secret access key را همان لحظه در password manager ذخیره کنید. secret بعدا دوباره نمایش داده نمی‌شود.
مهم: این اطلاعات را در frontend، Git، ticket یا log قرار ندهید. برای هر محیط یا سرویس یک کلید جدا بسازید و در صورت افشا آن را لغو کنید.

Endpoint

https://s3.aviato.ir

Region

aviato-1

S3 · ۰۳ · فایل

آپلود و دریافت اولین فایل

بعد از ساخت باکت و کلید، مقدارهای YOUR_ACCESS_KEY_ID، YOUR_SECRET_ACCESS_KEY و YOUR_BUCKET_NAME را در نمونه‌ها جایگزین کنید. مسیر فایل در S3 با ترکیب endpoint، نام باکت و key ساخته می‌شود:

https://s3.aviato.ir/YOUR_BUCKET_NAME/uploads/invoice-2026-07.pdf

نمونه زیر فایل محلی invoice-2026-07.pdf را آپلود می‌کند، سپس همان object را در invoice-downloaded.pdf ذخیره می‌کند. ابزارها خودشان درخواست را با SigV4 امضا می‌کنند.

Request examples
  1. aws configure set aws_access_key_id YOUR_ACCESS_KEY_ID
  2. aws configure set aws_secret_access_key YOUR_SECRET_ACCESS_KEY
  3. aws s3api put-object \
  4. --endpoint-url https://s3.aviato.ir \
  5. --region aviato-1 \
  6. --bucket YOUR_BUCKET_NAME \
  7. --key uploads/invoice-2026-07.pdf \
  8. --body ./invoice-2026-07.pdf
  9. aws s3api get-object \
  10. --endpoint-url https://s3.aviato.ir \
  11. --region aviato-1 \
  12. --bucket YOUR_BUCKET_NAME \
  13. --key uploads/invoice-2026-07.pdf \
  14. ./invoice-downloaded.pdf
  1. use Aws\\S3\\S3Client;
  2. $s3 = new S3Client([
  3. 'version' => 'latest',
  4. 'region' => 'aviato-1',
  5. 'endpoint' => 'https://s3.aviato.ir',
  6. 'use_path_style_endpoint' => true,
  7. 'credentials' => [
  8. 'key' => 'YOUR_ACCESS_KEY_ID',
  9. 'secret' => 'YOUR_SECRET_ACCESS_KEY',
  10. ],
  11. ]);
  12. $s3->putObject([
  13. 'Bucket' => 'YOUR_BUCKET_NAME',
  14. 'Key' => 'uploads/invoice-2026-07.pdf',
  15. 'SourceFile' => __DIR__.'/invoice-2026-07.pdf',
  16. 'ContentType' => 'application/pdf',
  17. ]);
  18. $s3->getObject([
  19. 'Bucket' => 'YOUR_BUCKET_NAME',
  20. 'Key' => 'uploads/invoice-2026-07.pdf',
  21. 'SaveAs' => __DIR__.'/invoice-downloaded.pdf',
  22. ]);
  1. import { S3Client, PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3';
  2. import { createReadStream, createWriteStream } from 'node:fs';
  3. import { pipeline } from 'node:stream/promises';
  4. const s3 = new S3Client({
  5. region: 'aviato-1',
  6. endpoint: 'https://s3.aviato.ir',
  7. forcePathStyle: true,
  8. credentials: { accessKeyId: 'YOUR_ACCESS_KEY_ID', secretAccessKey: 'YOUR_SECRET_ACCESS_KEY' },
  9. });
  10. await s3.send(new PutObjectCommand({ Bucket: 'YOUR_BUCKET_NAME', Key: 'uploads/invoice-2026-07.pdf', Body: createReadStream('./invoice-2026-07.pdf'), ContentType: 'application/pdf' }));
  11. const object = await s3.send(new GetObjectCommand({ Bucket: 'YOUR_BUCKET_NAME', Key: 'uploads/invoice-2026-07.pdf' }));
  12. await pipeline(object.Body, createWriteStream('./invoice-downloaded.pdf'));
پیش‌نیازها: برای cURL از AWS CLI استفاده کنید: aws --version. برای PHP پکیج composer require aws/aws-sdk-php و برای Node پکیج‌های npm install @aws-sdk/client-s3 لازم است. کلاینت را server-side اجرا کنید.

S3 · ۰۴ · هزینه

هزینه ذخیره‌سازی چگونه محاسبه می‌شود؟

مدل قیمت‌گذاری MVP آویاتو برای S3 بر دو جزء طراحی شده است:

۱. فضای ذخیره‌شده

متوسط فضای مصرف‌شده در طول روز به GB تبدیل می‌شود و در نرخ storage GB ضرب می‌شود.

۲. درخواست‌ها

درخواست‌های موفق PUT، GET، HEAD، LIST، DELETE و multipart بر اساس نرخ request محاسبه می‌شوند.

daily storage charge = average stored GB × storage GB rate
request charge = successful request units × request rate
total = daily storage charge + request charge

وضعیت فعلی: در این نسخه، ثبت object و شمارنده مصرف آماده است اما settlement و اضافه شدن S3 به invoice هنوز فعال نشده است؛ تا قبل از فعال شدن صورتحساب S3، هزینه‌ای از این بابت به فاکتور اضافه نمی‌شود. egress، replication، versioning و public access نیز در MVP صورتحساب جداگانه ندارند.

S3 · ۰۵ · عیب‌یابی

خطاهای رایج S3

کدمعنیراه‌حل
InvalidAccessKeyIdکلید پیدا نشد یا لغو شده است.کلید فعال را از صفحه Storage دوباره بررسی کنید.
SignatureDoesNotMatchامضای SigV4 با درخواست یکی نیست.region را aviato-1 و endpoint را دقیق بررسی کنید؛ ساعت سیستم نیز باید درست باشد.
NoSuchBucket / NoSuchKeyباکت یا key وجود ندارد.نام باکت و key را دقیق و case-sensitive ارسال کنید.
AccessDeniedکلید به پروژه صاحب باکت تعلق ندارد.از کلید همان project استفاده کنید.
GET /projects/{project_uuid}/virtual-machines/options vm:read

اول گزینه‌های قابل استفاده را دریافت کنید

قبل از ساخت VM این endpoint را صدا بزنید. از پاسخ آن، ID مربوط به location، image و bundle را انتخاب کنید؛ این IDها را دستی حدس نزنید یا از یک پروژه دیگر کپی نکنید. پاسخ شامل locationهای فعال، imageهای فعال، نسخه‌های سیستم‌عامل، bundleهای مجاز، منابع، قیمت، ظرفیت IP، موجودی کیف پول و وضعیت quota است.

برای انتخاب معتبر، ابتدا image را انتخاب کنید، سپس یکی از locationهایی را بردارید که در location_ids آن image آمده است. اگر bundle استفاده می‌کنید، ID آن باید در allowed_bundle_ids image باشد. اطلاعات محرمانه زیرساخت در پاسخ نمایش داده نمی‌شود.

Request examples
  1. curl -X GET "https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/options" \
  2. -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_KEY"
  1. $response = Http::withToken('YOUR_API_KEY')
  2. ->acceptJson()
  3. ->get('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/options');
  4. $options = $response->json('data');
  1. const response = await fetch('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/options', {
  2. headers: {
  3. Accept: 'application/json',
  4. Authorization: 'Bearer YOUR_API_KEY',
  5. },
  6. });
  7. const options = (await response.json()).data;

۰۲ · پروژه

پیدا کردن UUID پروژه

درخواست‌های VM با UUID پروژه ارسال می‌شوند، نه با نام پروژه. وارد پنل مشتری شوید و پروژه مورد نظر را باز کنید؛ UUID واقعی پروژه را از آدرس صفحه یا بخش جزئیات همان پروژه بردارید و جای YOUR_PROJECT_UUID قرار دهید.

اگر کلید متعلق به مشتری دیگری باشد، عضو پروژه نباشد، یا ability لازم را نداشته باشد، API دسترسی را رد می‌کند. تغییر UUID در URL باعث دیده شدن VMهای پروژه دیگر نمی‌شود.

POST /projects/{project_uuid}/virtual-machines vm:create

ساخت VM

پس از دریافت options، IDهای انتخاب‌شده را در این درخواست قرار دهید. cloud_image_id الزامی است. اگر vm_bundle_id بفرستید، CPU، RAM و disk از همان bundle خوانده می‌شود. اگر bundle نمی‌فرستید، هر سه cpu_cores، ram_gb و disk_gb الزامی‌اند.

نام نمایشی، username و SSH key اختیاری‌اند. سرویس quota، موجودی و قفل بودن wallet، سازگاری image/location/bundle، حداقل منابع و ظرفیت IP را بررسی می‌کند. پاسخ موفق با 201 Created برمی‌گردد و VM ابتدا در وضعیت pending است.

اگر رمز ورود به صورت خودکار تولید شود، فقط یک‌بار در generated_login_password پاسخ create قرار می‌گیرد. آن را همان لحظه ذخیره کنید؛ در list و detail قابل بازیابی نیست.
Request examples
  1. curl -X POST "https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines" \
  2. -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  3. -d '{"infrastructure_location_id":12,"cloud_image_id":4,"vm_bundle_id":2,"display_name":"My Production Server","login_username":"ubuntu","ssh_public_key":"ssh-ed25519 ..."}'
  1. $response = Http::withToken('YOUR_API_KEY')
  2. ->acceptJson()
  3. ->post('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines', [
  4. 'infrastructure_location_id' => 12,
  5. 'cloud_image_id' => 4,
  6. 'vm_bundle_id' => 2,
  7. 'display_name' => 'My Production Server',
  8. 'login_username' => 'ubuntu',
  9. 'ssh_public_key' => 'ssh-ed25519 ...',
  10. ]);
  11. $createdVm = $response->json('data');
  1. const response = await fetch('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines', {
  2. method: 'POST',
  3. headers: {
  4. Accept: 'application/json',
  5. Authorization: 'Bearer YOUR_API_KEY',
  6. 'Content-Type': 'application/json',
  7. },
  8. body: JSON.stringify({
  9. infrastructure_location_id: 12, cloud_image_id: 4, vm_bundle_id: 2,
  10. display_name: 'My Production Server', login_username: 'ubuntu',
  11. ssh_public_key: 'ssh-ed25519 ...',
  12. }),
  13. });
  14. const createdVm = (await response.json()).data;
GET /projects/{project_uuid}/virtual-machines vm:read

دیدن VMهای پروژه

برای نمایش فهرست VMها، این endpoint را صدا بزنید. نتیجه صفحه‌بندی می‌شود؛ per_page تعداد رکوردهای هر صفحه را مشخص می‌کند، search در نام، hostname یا IP جست‌وجو می‌کند و status می‌تواند running، stopped، suspended یا deleting باشد. VMهای deleted به صورت پیش‌فرض برگردانده نمی‌شوند.

Request examples
  1. curl -X GET "https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines?per_page=25" \
  2. -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_KEY"
  1. $vms = Http::withToken('YOUR_API_KEY')
  2. ->acceptJson()
  3. ->get('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines', ['per_page' => 25])
  4. ->json('data');
  1. const response = await fetch('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines?per_page=25', {
  2. headers: { Accept: 'application/json', Authorization: 'Bearer YOUR_API_KEY' },
  3. });
  4. const vms = (await response.json()).data;
GET /projects/{project_uuid}/virtual-machines/{virtual_machine_uuid} vm:read

خواندن وضعیت و اطلاعات اتصال

بعد از create، UUID VM را از پاسخ بگیرید و این endpoint را با همان UUID بخوانید. تا زمانی که provisioning_status برابر pending است، چند ثانیه صبر کنید و دوباره درخواست بفرستید. وقتی ssh_ready برابر true شد، می‌توانید از username و ssh_command استفاده کنید. رمز عبور در این endpoint نمایش داده نمی‌شود.

Request examples
  1. curl -X GET "https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/YOUR_VM_UUID" \
  2. -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_KEY"
  1. $vm = Http::withToken('YOUR_API_KEY')
  2. ->acceptJson()
  3. ->get('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/YOUR_VM_UUID')
  4. ->json('data');
  1. const response = await fetch('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/YOUR_VM_UUID', {
  2. headers: { Accept: 'application/json', Authorization: 'Bearer YOUR_API_KEY' },
  3. });
  4. const vm = (await response.json()).data;
DELETE /projects/{project_uuid}/virtual-machines/{virtual_machine_uuid} vm:delete

حذف VM

برای جلوگیری از حذف اشتباه، مقدار confirmation در بدنه درخواست باید دقیقاً با display_name VM یکسان باشد. بعد از پذیرش درخواست، وضعیت VM فوراً deleting می‌شود و حذف زیرساخت در پس‌زمینه انجام می‌شود. تا پایان کار، detail را دوباره بخوانید. درخواست تکراری همان VM نتیجه‌ای امن و idempotent دارد.

Request examples
  1. curl -X DELETE "https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/YOUR_VM_UUID" \
  2. -H "Accept: application/json" -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  3. -d '{"confirmation":"My Production Server"}'
  1. $response = Http::withToken('YOUR_API_KEY')
  2. ->acceptJson()
  3. ->delete('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/YOUR_VM_UUID', [
  4. 'confirmation' => 'My Production Server',
  5. ]);
  1. const response = await fetch('https://aviato.ir/api/v1/projects/YOUR_PROJECT_UUID/virtual-machines/YOUR_VM_UUID', {
  2. method: 'DELETE',
  3. headers: {
  4. Accept: 'application/json',
  5. Authorization: 'Bearer YOUR_API_KEY',
  6. 'Content-Type': 'application/json',
  7. },
  8. body: JSON.stringify({ confirmation: 'My Production Server' }),
  9. });
  10. const deletion = (await response.json()).data;

۰۳ · وضعیت‌ها

کدام وضعیت را باید منتظر بمانید؟

pending

درخواست ثبت شده است. چند ثانیه بعد detail را دوباره بخوانید.

ready

آماده استفاده است؛ اگر IP موجود باشد SSH هم آماده است.

failed

آماده‌سازی موفق نشده است. مقدار failure را بخوانید و برای پشتیبانی request ID را نگه دارید.

deleting / deleted

حذف در حال انجام است یا رکورد به طور کامل حذف شده است.

رمز عبور و SSH

اگر در create رمز عبور ارسال نکنید، سرویس ممکن است یک رمز تولید کند و آن را فقط در همان پاسخ با نام generated_login_password برگرداند. آن را همان لحظه در محل امن ذخیره کنید؛ مسیر بازیابی رمز وجود ندارد و detail آن را نشان نمی‌دهد.

برای اتصال، تا آماده شدن VM صبر کنید. وقتی ssh_ready برابر true شد، مقدار login_username و ssh_command را از detail بخوانید.

فیلدهای ساخت و زمان استفاده از آن‌ها

فیلدچه زمانی لازم است؟
cloud_image_idهمیشه؛ از options انتخاب کنید.
infrastructure_location_idبرای انتخاب location مشخص؛ باید با image سازگار باشد.
vm_bundle_idبرای استفاده از bundle آماده و منابع/قیمت آن.
cpu_cores, ram_gb, disk_gbفقط وقتی bundle نمی‌فرستید؛ هر سه لازم‌اند.
display_name, login_username, ssh_public_keyاختیاری؛ برای نام و روش اتصال دلخواه.

اگر درخواست خطا داد

401 یعنی توکن وجود ندارد یا معتبر نیست. 403 یعنی ability یا دسترسی پروژه کافی نیست. 404 یعنی project یا VM در scope این کلید نیست. 422 یعنی فیلدها، سازگاری، quota، wallet یا ظرفیت IP مشکل دارد و 429 یعنی باید بعداً دوباره درخواست کنید. در همه حالت‌ها meta.request_id را برای پشتیبانی نگه دارید.

{ "error": { "code": "validation_error", "fields": {} }, "meta": { "request_id": "REQUEST_ID" } }

نکات امنیتی هنگام استفاده

کلید را در Git، log، مرورگر یا کد frontend نگذارید. برای هر سرویس و محیط یک کلید جدا بسازید، فقط ability لازم را فعال کنید و در صورت افشا از صفحه پروفایل آن را لغو کنید. رمز اولیه را فقط در secret manager ذخیره کنید.

Wallet API برای integrationهای موجود

endpointهای کیف پول برای سازگاری همچنان در دسترس‌اند و به wallet:read نیاز دارند:

/projects/{project_uuid}/wallet/projects/{project_uuid}/wallet/transactions/projects/{project_uuid}/wallet/transactions/{transaction}
Get remaining balanceList transactionsGet one transaction