مستندات API پافرلند

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

آدرس پایه (Base URL)

تمام درخواست‌ها به آدرس پایه‌ی زیر ارسال می‌شوند و مسیر هر endpoint در ادامه‌ی مستندات، نسبی به همین آدرس است:

https://pufferland.ir/api/client

احراز هویت

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

هر درخواست باید هدر احراز هویت را همراه داشته باشد:

Authorization: Bearer ptlc_xxxxxxxxxxxxxxxxxxxxxxxxxxxx
کلید API همانند رمز عبور شماست. آن را در کد سمت کلاینت، مخازن عمومی یا جای دیگری که قابل افشا باشد قرار ندهید. در صورت افشا، کلید را از پنل حذف و کلید جدید بسازید.

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

هدرتوضیح
Authorizationکلید API به‌صورت Bearer <کلید> — برای همه‌ی درخواست‌ها الزامی است.
Content-Typeapplication/json — برای درخواست‌هایی که بدنه دارند (به‌جز موارد خاص مثل نوشتن فایل).
Acceptapplication/json — برای دریافت پاسخ JSON توصیه می‌شود.

نمونه‌ی یک درخواست کامل با چند زبان:

# فهرست سرورهای شما
curl https://pufferland.ir/api/client \
  -H "Authorization: Bearer ptlc_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Accept: application/json"
const res = await fetch('https://pufferland.ir/api/client', {
  headers: {
    Authorization: 'Bearer ptlc_xxxxxxxxxxxxxxxxxxxxxxxx',
    Accept: 'application/json',
  },
});
const data = await res.json();
console.log(data.data);
import requests

r = requests.get(
    "https://pufferland.ir/api/client",
    headers={
        "Authorization": "Bearer ptlc_xxxxxxxxxxxxxxxxxxxxxxxx",
        "Accept": "application/json",
    },
)
print(r.json())
$ch = curl_init('https://pufferland.ir/api/client');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ptlc_xxxxxxxxxxxxxxxxxxxxxxxx',
        'Accept: application/json',
    ],
]);
$data = json_decode(curl_exec($ch), true);
var_dump($data);

قالب پاسخ

پاسخ‌ها با ساختار JSON استاندارد برمی‌گردند. یک منبع تکی به این شکل است:

{
  "object": "server",
  "attributes": {
    "identifier": "1a7ce997",
    "name": "Minecraft Server",
    "...": "..."
  },
  "meta": { "...": "..." }
}

و لیست‌ها به‌صورت آرایه‌ای از منابع به همراه اطلاعات صفحه‌بندی:

{
  "object": "list",
  "data": [ { "object": "...", "attributes": { "...": "..." } } ],
  "meta": {
    "pagination": {
      "total": 12, "count": 2, "per_page": 2,
      "current_page": 1, "total_pages": 6,
      "links": { "next": "..." }
    }
  }
}

پارامترهای عمومی

پارامترمثالتوضیح
?include=?include=egg,subusersبارگذاری روابط اضافه در پاسخ.
?page=?page=2شماره صفحه در لیست‌های صفحه‌بندی‌شده.
?per_page=?per_page=50تعداد آیتم هر صفحه (حداکثر ۱۰۰).
?filter[]=?filter[name]=mcفیلتر کردن نتایج.
?sort=?sort=-created_atمرتب‌سازی؛ پیشوند - یعنی نزولی.

پارامترهای مسیر

در مستندات، مقادیری مثل {server} یا {database} پارامتر مسیر هستند؛ یعنی باید مقدار واقعی مربوط به منبع خودتان را جایگزین آن‌ها کنید. این جدول می‌گوید هر پارامتر چه چیزی است و مقدارش را از کجا پیدا کنید:

پارامتریعنی چه؟از کجا پیدا می‌شود؟
{server}شناسه‌ی (Identifier) سرور — همان کد کوتاه ۸ کاراکتری که برای هر سرور شما ساخته می‌شود (مثل 1a85a183)پاسخ GET /api/clientattributes.identifier هر سرور. UUID کامل سرور هم به‌جای آن پذیرفته می‌شود.
{identifier}شناسه‌ی کلید APIپاسخ لیست کلیدها → attributes.identifier هر کلید
{database}شناسه‌ی دیتابیسپاسخ لیست دیتابیس‌ها → attributes.id (مثل YkxXVk6W)
{backup}شناسه‌ی UUID بکاپپاسخ لیست بکاپ‌ها → attributes.uuid
{schedule}شناسه‌ی عددی زمان‌بندیپاسخ لیست زمان‌بندی‌ها → attributes.id
{task}شناسه‌ی عددی وظیفهپاسخ لیست وظایف → attributes.id
{allocation}شناسه‌ی عددی آدرس (پورت)پاسخ لیست آدرس‌ها → attributes.id
{user}شناسه‌ی UUID زیرکاربرپاسخ لیست زیرکاربران → attributes.uuid
مثال واقعی: برای فراخوانی GET /api/client/servers/{server}/resources روی سروری با identifier 1a85a183، آدرس نهایی می‌شود:
https://pufferland.ir/api/client/servers/1a85a183/resources

محدودیت تعداد درخواست (Rate Limit)

هر کلید API می‌تواند حداکثر ۲۴۰ درخواست در دقیقه ارسال کند. وضعیت فعلی از طریق هدرهای پاسخ قابل بررسی است:

هدرتوضیح
X-RateLimit-Limitسقف درخواست‌ها در بازه‌ی زمانی.
X-RateLimit-Remainingتعداد درخواست‌های باقی‌مانده.
X-RateLimit-Resetزمان (یونیکس) ریست‌شدن سقف.

در صورت عبور از سقف، پاسخ 409 Too Many Requests دریافت می‌کنید. بهتر است برنامه‌ی شما هدرهای بالا را رصد و بین درخواست‌ها فاصله بگذارد.

خطاها

خطاها با ساختار زیر برمی‌گردند؛ فیلد code برای تشخیص برنامه‌نویسی‌شده‌ی نوع خطا و detail برای نمایش پیام است:

{
  "errors": [
    {
      "code": "NotFoundHttpException",
      "status": "404",
      "detail": "The requested resource could not be found."
    }
  ]
}
کد وضعیتمعنی
400درخواست نامعتبر یا تداخل با وضعیت فعلی سرور.
401کلید API نامعتبر یا ارسال‌نشده.
403دسترسی کافی ندارید (مجوز لازم را ندارید).
404منبع درخواستی یافت نشد.
409تداخل — مانند عبور از سقف Rate Limit.
422داده‌ی ارسالی از اعتبارسنجی رد شد.
برای مشاهده‌ی جزئیات هر بخش، از نوار بخش‌ها استفاده کنید: حساب کاربری، مدیریت سرور، فایل‌ها، دیتابیس، بکاپ، زمان‌بندی، شبکه و زیرکاربران.