مستندات

‎LocalMe HTTP API

همهٔ پروژه‌های میزبانی‌شده با یک سطح REST یکسان کار میکنند. پلتفرم از روی مسیر درخواست یا هدر X-Project-Id تشخیص میدهد کدام پروژه دارد صدا میزند، بنابراین فرانت‌اند تو میتواند از هر صفحه‌ای نشانی‌های نسبی /api/… را صدا بزند.

JSON روی HTTPS
کوکی یا کلید Bearer
بدون مرحلهٔ build

نمای کلی

یک پروژه، پوشه‌ای از فایل‌های استاتیک به‌علاوهٔ یک بک‌اند مدیریت‌شده است: پایگاه‌دادهٔ سندی، فضای ذخیره‌سازی بلاب، کتابخانهٔ فایل‌های مشترک، حساب‌های بازدیدکننده و نقش‌ها، مسیریابی، اسرار رمز‌شده، یک پروکسی معکوس، وظایف زمان‌بندی‌شده، وب‌هوک‌ها و دامنه‌های اختصاصی. تو HTML، CSS و JavaScript مینویسی؛ بقیه‌اش مال پلتفرم است.

<!-- index.html — the whole integration is a fetch call -->
<script>
  const res = await fetch('/api/db/find', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    credentials: 'include',              // sends the visitor cookie
    body: JSON.stringify({ table: 'notes', filter: { done: false } })
  });
  const { data, total } = await res.json();
</script>

نشانی‌دهی و بافت

پروژه‌ها از https://localme.ir/[username]/[project-name]/ سرو میشوند. مسیرهای نسبی API درون یک صفحهٔ سروشده، خودبه‌خود همان بافت را به ارث میبرند. کلاینت‌های سمت سرور یا بیرونی میتوانند پروژه را صریح نشانی بدهند:

POST https://localme.ir/api/db/find
X-Project-Id: <projectId>
Content-Type: application/json

{ "table": "notes" }

ترتیب تشخیص این‌گونه است: هدر X-Project-Id، سپس فیلد projectId در بدنه، و در پایان پیشوند /username/project/ در مسیر درخواست.

احراز هویت

سه نوع اعتبار به API میرسند و میتوانند در یک پروژه با هم ترکیب شوند:

نشست بازدیدکننده

کوکی auth_<projectId> که /auth/token صادرش میکند. نقش و مجوزهای بازدیدکننده را حمل میکند.

کلید API

به شکل Authorization: Bearer sk_… فرستاده میشود و به یک پروژه محدود است.

مالک یا مدیر

یک نشست کنسول که پروژهٔ خودش را باز میکند، نقش مالک در نظر گرفته میشود، پس همه‌چیز مجاز است.

ورود و ثبت‌نام برایت انجام میشود. بازدیدکننده‌ها را به /auth/login?returnUrl=/your/page بفرست و یک login.html در ریشهٔ پروژه بگذار تا صفحهٔ داخلی با طراحی خودت جایگزین شود.

await fetch('/auth/token', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  credentials: 'include',
  body: JSON.stringify({
    action: 'login',              // or 'signup'
    username: 'jane',
    password: 'hunter2hunter2',
    captchaId: challenge.challengeId,   // from GET /auth/captcha
    captchaAnswer: solved,              // required for login
    returnUrl: location.pathname
  })
});
// → { success: true, visitor: true, redirectUrl: '/shop/private' }
متدمسیرتوضیح
GET
/auth/captcha
عمومی
یک چالش ریاضی امضاشدهٔ SVG برمیگرداند؛ ورودها باید شناسه‌اش را بفرستند.
GET
/auth/login?returnUrl=…
عمومی
صفحهٔ ورود داخلی، یا ‹login.html› خودت وقتی وجود داشته باشد.
POST
/auth/token
عمومی
ورود یا ثبت‌نام بازدیدکننده؛ کوکی ‹auth_{projectId}› را ست میکند. ورود کپچا دارد.
GET
/auth/me
عمومی
فاعل فعلی، نقش و فهرست مجوزها.
GET
/auth/logout?returnUrl=…
عمومی
کوکی بازدیدکننده را پاک و هدایت میکند.

هر وقت خواستی ببین چه کسی وارد است، /auth/me را صدا بزن؛ نقش، فهرست مجوزها و نوع فاعل (visitor، api_key، owner یا anonymous) را برمیگرداند.

پایگاه‌داده

یک ذخیره‌ساز سندی بدون اسکیما. جدول‌ها در نخستین درج به‌طور ضمنی ساخته میشوند و هر سند باید فیلد id غیرتهی داشته باشد که درون جدولش یکتاست. پرس‌وجوها دستور زبان فیلتر و مرتب‌سازی به سبک MongoDB را میپذیرند.

متدمسیرتوضیح
POST
/api/db/find
نشست یا کلید API
پرس‌وجوی سندها با فیلتر، مرتب‌سازی، limit و offset.
POST
/api/db/get
نشست یا کلید API
گرفتن یک سند با شناسهٔ آن (رشته یا عدد).
POST
/api/db/count
نشست یا کلید API
شمارش سندهای منطبق با یک فیلتر.
POST
/api/db/insert
نشست یا کلید API
درج یک سند. فیلد ‹id› اجباری و در هر جدول یکتاست.
POST
/api/db/update
نشست یا کلید API
به‌روزرسانی سندهای منطبق؛ همهٔ آن‌ها، مگر آنکه ‹many: false› باشد.
POST
/api/db/delete
نشست یا کلید API
حذف هر سندی که با فیلتر میخواند.
// Query
const res = await fetch('/api/db/find', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  credentials: 'include',
  body: JSON.stringify({
    table: 'orders',
    filter: { status: { $in: ['paid', 'shipped'] }, total: { $gt: 100 } },
    sort: { created: -1 },
    limit: 25,
    offset: 0
  })
});
// → { data: [...], total, limit, offset, truncated }
// Insert, update and delete
await fetch('/api/db/insert', {
  method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include',
  body: JSON.stringify({ table: 'orders', document: { id: Date.now(), total: 140, status: 'paid' } })
});

await fetch('/api/db/update', {
  method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include',
  body: JSON.stringify({ table: 'orders', filter: { id: 1 }, update: { status: 'shipped' }, many: false })
});

await fetch('/api/db/delete', {
  method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include',
  body: JSON.stringify({ table: 'orders', filter: { status: 'cancelled' } })
});
عملگرمعنا
$eqبرابر
$neنابرابر
$gt / $gteبزرگ‌تر (یا برابر)
$lt / $lteکوچک‌تر (یا برابر)
$in / $ninعضو یک آرایه (یا نبودنش)
$regexتطابق عبارت باقاعده
$existsفیلد موجود است
$and / $or / $nor / $notترکیب منطقی

به‌روزرسانی‌ها یا یک شیء ساده میپذیرند (که در هر سند ادغام میشود) یا فرم عملگری با $set، $inc و $unset. نتیجه‌ها فرادادهٔ _localme را با زمان ساخت و آخرین تغییر حمل میکنند.

id یک سند به‌صورت متنی مقایسه میشود، پس 1 عددی و "1" رشته‌ای روی هر دو بک‌اند پایگاه‌داده یک سند‌اند — درج شکل دوم ۴۰۹ برمیگرداند. نوع مقدار فیلتر رعایت میشود: id: 1 فقط شناسهٔ عددی را میخواند، هرگز رشته را.

فضای ذخیره‌سازی

فایل‌ها از ریشهٔ پروژه سرو میشوند، پس /static/app.js دقیقاً مثل هر میزبان استاتیک دیگری کار میکند. فایل‌های دودویی در فضای بلاب میمانند؛ فایل‌های متنی درون‌خطی ذخیره و در پیشخوان قابل ویرایش‌اند.

متدمسیرتوضیح
GET
/api/storage/list?path=/
نشست یا کلید API
فهرست فایل‌های یک پوشه.
GET
/api/storage/status
نشست یا کلید API
بایت مصرف‌شده، سهمیهٔ پروژه و تعداد فایل.
POST
/api/storage/upload
نشست یا کلید API
چندبخشی با فیلد ‹file›، یا بدنهٔ خام با ‹?path=› و ‹?filename=›.
GET
/api/storage/download?path=/index.html
نشست یا کلید API
جریان‌دادن یک فایل ذخیره‌شده.
POST
/api/storage/delete
نشست یا کلید API
حذف یک فایل با مسیر.
// Multipart upload
const form = new FormData();
form.append('file', input.files[0]);
form.append('path', '/static/logo.png');

await fetch('/api/storage/upload', {
  method: 'POST',
  headers: { 'Authorization': 'Bearer sk_…' },   // or credentials: 'include'
  body: form
});

فهرست‌گیری یک پوشه میپذیرد: GET /api/storage/list?path=/static نام‌ها، اندازه‌ها، زمان‌های تغییر و نوع‌ها را برمیگرداند. نوشتن‌هایی که از سقف حساب فراتر بروند، پیش از ذخیرهٔ حتی یک بایت رد میشوند.

بارگذاری‌ها به‌طور پیش‌فرض هنگام ذخیره کمینه میشوند: کامنت‌ها و فاصله‌های بی‌مورد از CSS، JavaScript، JSON، HTML و SVG حذف میشوند. برای هر درخواست با ?minify=0 میتوان انصراف داد (یا با ?minify=1 اجبار کرد) و پیش‌فرض را در کل پلتفرم با storage.minify_on_save عوض کرد. هر چیزی که در Content-Length بیش از سقف ۱۰ مگابایت اعلام کند، پیش از بافر شدن بدنه با ۴۱۳ رد میشود.

کتابخانه

کتابخانه یک CDN برای فایل‌هایی است که همهٔ پروژه‌هایت به اشتراک میگذارند — شیوه‌نامه‌ها، اسکریپت‌ها، فونت‌ها و تصویرها. یک بار بارگذاری کن و هر فایل یک نشانی عمومی پایدار زیر /{username}/library/ میگیرد؛ چیزی بین پروژه‌ها کپی نمیشود و HTML رد میشود چون این فایل‌ها از مبدأ پلتفرم سرو میشوند.

library نام پوشهٔ رزروشده است، پس ارجاع نسبی از درون یک پروژه به کتابخانهٔ تو میرسد و روی دامنهٔ اختصاصی هم کار میکند.

متدمسیرتوضیح
GET
/{username}/library/<path>
عمومی
سرو یک فایل مشترک. همین نشانی را ارجاع میدهی؛ کلید API لازم نیست.
GET
/api/library
نشست کنسول
فهرست همهٔ فایل‌های مشترک حساب واردشده.
POST
/api/library/upload
نشست کنسول
انتشار یک فایل غیر HTML: ‹{ path, contentBase64 }›.
DELETE
/api/library/delete?path=…
نشست کنسول
برداشتن یک فایل مشترک (یا یک پوشهٔ کامل).
GET
/api/lib/list
نشست کنسول
آینهٔ فهرست کتابخانه در محدودهٔ پروژه.
GET
/api/lib/status
نشست کنسول
مصرف کتابخانه در برابر سقف کتابخانه.
POST
/api/lib/upload
نشست کنسول
بارگذاری یک فایل غیر HTML در کتابخانهٔ مشترک.
GET
/api/lib/download?path=theme.css
نشست کنسول
خواندن یک فایل کتابخانه.
POST
/api/lib/delete
نشست کنسول
برداشتن یک فایل مشترک با نام.
GET
/~public/<path>
عمومی
کتابخانهٔ گزینش‌شدهٔ سراسر پلتفرم که اپراتورها نگهش میدارند.
GET
/health
عمومی
زنده‌بودن و آمادگی پایگاه‌داده؛ ۵۰۳ وقتی لایهٔ داده در دسترس نیست.
<link rel="stylesheet" href="/ada/library/theme.css">
<script src="/ada/library/analytics.js" defer></script>

<!-- or, from inside a project (custom-domain safe) -->
<link rel="stylesheet" href="library/theme.css">

اسرار و پروکسی

اسرار با ‎AES-256-GCM رمزنگاری میشوند و فقط سمت سرور رمزگشایی میشوند. راه پشتیبانی‌شده برای استفاده از API شخص ثالث بدون افشای کلیدت، مسیر پروکسی است: مسیری با نشانی خودت بساز، آن را به سرویس‌دهنده وصل کن و در نقشهٔ هدر به اسرار ارجاع بده.

// Route:  /api/payments/create    (proxy enabled)
// Target: https://api.stripe.com/v1/payment_intents
// Method: POST
// Headers: { "Authorization": "Bearer {{STRIPE_KEY}}" }

const res = await fetch('/api/payments/create', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ amount: 1000, currency: 'usd' })
});

مقدار هدرها جایگزینی {{KEY_NAME}} را برای هر راز ذخیره‌شده پشتیبانی میکند. یک مسیر پروکسی همچنین نقش سوارشده را دارد: وقتی الگوی مسیر یک پیشوند باشد، باقی مسیر فراخوان به مسیر هدف اضافه میشود، پس /api/stripe/* میتواند جلوی https://api.stripe.com/v1 بنشیند، در حالی که تطبیق دقیق مسیر هدف را همان‌طور که نوشته شده نگه میدارد. اسرار را میتوان مستقیم هم با POST /api/secrets/get خواند؛ این نشانی مجوز secrets_admin میخواهد و فقط برای فراخوانی سرور به سرور است.

مسیریابی و سرو

یک درخواست ورودی به این ترتیب تشخیص داده میشود:

  1. تطبیق دقیق مسیر، فایل HTML هدفش را سرو میکند.
  2. تطبیق مسیر با الگوی عام (مثلاً /blog/*) هدفش را سرو میکند.
  3. فایل ذخیره‌شده در مسیر درخواستی مستقیم و با کش بلندمدت سرو میشود.
  4. برای مسیرهای پوشه، <dir>/index.html سرو میشود.
  5. /404.html با وضعیت ۴۰۴ برگردانده میشود، یا صفحهٔ خود پلتفرم.

مسیرها میتوانند بازدیدکنندهٔ واردشده، یک حداقل نقش، و/یا یک مجوز ریزدانه (مثلاً analytics_read) بخواهند که نقش بازدیدکننده باید داشته باشد. حتی وقتی requires_auth خاموش است، داشتن الزام مجوز، دروازهٔ احراز را فعال میکند. فقط فایل‌های HTML مسیرپذیرند — فایل‌های جانبی همیشه با مسیر خودشان در دسترس‌اند. وقتی واترمارک روشن باشد پلتفرم یک نشان کوچک انتساب به HTML سروشده اضافه میکند که میتوانی در تنظیمات هر پروژه خاموشش کنی.

درخواست‌های فایل و کتابخانه در برابر Referer و Origin بررسی میشوند: درخواست‌های مستقیم، صفحه‌های خودت (از جمله دامنه‌های اختصاصی تأییدشده) و خزندگان موتور جست‌وجو عبور میکنند و سایت‌های بیرونی ۴۰۳ میگیرند. اپراتورهایی که فایل‌ها را بین‌دامنه‌ای جاسازی میکنند میتوانند این بررسی را با serving.hotlink_protection در تنظیمات سیستم خاموش کنند. پاسخ‌های متنی در صورت درخواست کلاینت با Brotli/gzip فشرده میشوند، HTML همیشه no-store سرو میشود و فایل‌های جانبی یک روز کش و یک ETag قوی میگیرند، پس درخواست تکراری با If-None-Match به‌صورت ۳۰۴ برمیگردد. بایت‌های فایل در یک کش درون‌فرایندی با سقف مشخص نگه داشته میشوند و به‌محض نوشتن یا حذف یک فایل باطل میشوند.

وظایف زمان‌بندی‌شده و وب‌هوک‌ها

نُه کرون‌جاب با هر پروژه میآید. پنج تای مستندشده عبارت‌اند از clean_expired_sessions، clean_old_logs، generate_daily_stats، send_daily_summary_webhook و clean_orphaned_uploads. چهار کار پلتفرمی هم روی آن‌ها اضافه میشود: retry_failed_webhooks، storage_audit، heartbeat و renew_ssl_certificates. هرکدام را میتوان در هر پروژه روشن و خاموش کرد، از پیشخوان به‌صورت دستی اجرا کرد و در کل پلتفرم از کنسول مدیر خاموش کرد. هر وظیفه میتواند آهنگ خودش را داشته باشد: parameters.schedule = "0 5 * * *" برای یک عبارت کرون پنج‌فیلدی استاندارد (UTC) یا parameters.every_minutes = 30 برای یک بازه، و پلتفرم پس از هر اجرا زمان بعدی را دوباره حساب میکند. زمان‌بندی غیرقابل‌رسیدن به‌جای آنکه بی‌صدا هرگز اجرا نشود، با ۴۰۰ رد میشود. یک اجراکنندهٔ بیرونی زمان‌بندی را با POST /api/cron/run به‌همراه هدر x-cron-token میراند. وب‌هوک‌ها یک محمولهٔ JSON امضاشده POST میکنند؛ درج، به‌روزرسانی و حذف سند، رویدادهای document.created، document.updated و document.deleted را منتشر میکنند. تحویل‌ها در یک outbox صف میشوند و درون‌خطی تخلیه میشوند، پس گیرندهٔ کند یا خراب هرگز درخواستی را که رویداد را آغاز کرده مسدود نمیکند؛ تلاش مجدد به‌طور پیش‌فرض خاموش است، مطابق «Retry: No retries» در مشخصات. x-webhook-signature را با رازی که تنظیم کرده‌ای بررسی کن.

گواهی‌ها و عملیات

رسیدگی به گواهی عمداً انتخابی است. وقتی ssl.auto_provision خاموش باشد (پیش‌فرض)، پلتفرم هرگز خودسرانه با هیچ ارائه‌دهندهٔ ACME تماس نمیگیرد: فقط آنچه اپراتور میدهد را ذخیره، گزارش و تمدید میکند. آن را روشن کنی، از HTTP-01 استفاده میکند — توکن برای واکشی مرجع CA در /.well-known/acme-challenge/<token> نوشته میشود — سپس گواهی را رمز‌شده ذخیره میکند و ssl.renewal_days_before_expiry روز پیش از انقضا تمدیدش میکند. ssl.acme_staging به‌طور پیش‌فرض روشن است تا یک استقرار تازه سهمیهٔ مراجع عمومی را نسوزاند.

GET  /api/domains/certificate?projectId=1&domain=app.example.com
  → { enabled, staging, domains, certificates, expiringSoon,
      domain, hasCertificate }

POST /api/domains/certificate?projectId=1&domain=app.example.com
  { "email": "ops@example.com", "sans": ["www.app.example.com"] }

POST /api/domains/renew?projectId=1
  → { skipped, due, renewed: [...], failed: [...] }

رفتار پلتفرم بیرون از مسیر درخواست از طریق تنظیمات سیستم پیکربندی میشود (/api/admin/config را ببین): logging.level، logging.sink و logging.file_path لاگ ساخت‌یافتهٔ NDJSON را کنترل میکنند (اطلاعات محرمانه پیش از نوشتن هر رکورد پاک میشوند)، serving.hotlink_protection میتواند بررسی ارجاع فایل را برای جاسازی بین‌دامنه‌ای تسهیل کند، و کلیدهای webhooks.retry_* تلاش مجدد outbox را کنترل میکنند.

مقصدهای وب‌هوک پیش از ثبت و دوباره پیش از هر تحویل اعتبارسنجی میشوند: فقط http و https، و نشانی‌های لوپ‌بک، خصوصی، لینک‌لوکال و فرادادهٔ ابری رد میشوند. یک پروژه نمیتواند با وب‌هوک، پلتفرم را به شبکهٔ خودش برساند. هر پاسخ همچنین X-Content-Type-Options: nosniff، یک سیاست قاب‌بندی و HSTS حمل میکند.

پشتیبان‌ها

bun run backup یک عکس لحظه‌ای سازگار میگیرد — pg_dump برای گویش Postgres و VACUUM INTO برای SQLite — و هر چیزی فراتر از پنجرهٔ نگهداری را هرس میکند. --list را اضافه کن تا ببینی روی دیسک چیست، --verify <file> تا پیش از اعتماد یک آرشیو را بررسی کنی، و --restore <file> تا یکی را برگردانی. رشتهٔ اتصال از محیط خوانده میشود، هرگز از خط فرمان.

API کنسول

پیشخوان روی همان سطح REST ساخته شده است. این نشانی‌ها به‌جای دادهٔ یک پروژه، روی حساب و پروژه‌های تو کار میکنند؛ همه به نشست کنسول نیاز دارند و نشانی‌های مدیر به حساب مدیر.

متدمسیرتوضیح
GET
/api/projects
نشست کنسول
فهرست پروژه‌های کاربر واردشده.
PATCH
/api/projects/{id}
نشست کنسول
تغییر نام، تعلیق/فعال‌سازی یا روشن و خاموش کردن واترمارک.
GET
/api/usage?projectId={id}
نشست کنسول
گزارش‌های روزانه، بازدید این ماه و فضای مصرف‌شده.
GET
/api/storage/export?projectId={id}
نشست کنسول
دانلود کل پروژه به‌صورت آرشیو ZIP.
GET
/api/domains?projectId={id}
نشست کنسول
دامنه‌های اختصاصی با توکن‌های تأییدشان.
POST
/api/domains?projectId={id}
نشست کنسول
اتصال یک دامنه؛ رکورد TXT را منتشر و سپس تأیید کن.
POST
/api/domains/verify?projectId={id}&domain=…
نشست کنسول
بررسی رکورد TXT ‹_localme-verify› روی DNS.
GET
/api/domains/certificate?projectId={id}&domain=…
نشست کنسول
وضعیت گواهی استقرار: حالت staging، شمارش‌ها و دامنه‌های در حال انقضا.
POST
/api/domains/certificate?projectId={id}&domain=…
نشست کنسول
همین حالا گواهی سفارش بده. به ‹ssl.auto_provision› روی پلتفرم نیاز دارد.
POST
/api/domains/renew?projectId={id}
نشست کنسول
اجبار تمدید هر چیزی که درون پنجرهٔ تمدید است.
GET
/api/api-endpoints?projectId={id}
نشست کنسول
نام مستعار ‹/api/endpoints› (مسیر §۶.۳ مشخصات).
PUT
/api/api-endpoints?projectId={id}
نشست کنسول
نام مستعار ‹PUT /api/endpoints› (مسیر §۶.۳ مشخصات).
PATCH
/api/account
نشست کنسول
تغییر رمز عبور یا ایمیل خودت.
GET
/api/export/{feature}
نشست کنسول
‎routes · api · roles · secrets (فقط نام‌ها) · cron · webhooks · dns · auth.
POST
/api/import/{feature}
نشست کنسول
اعتبارسنجی و بازنویسی یک ویژگی پیکربندی از روی JSON.
GET
/api/export/all
نشست کنسول
‎ZIP: مسیرهای ‎storage/، ‎lib/، ‎config/config.json و ‎config/secrets.json به‌صورت متن خوانا.
POST
/api/import/all
نشست کنسول
بازیابی همان آرشیو (multipart ‹file› یا بدنهٔ خام ZIP). با سقف فضای ذخیره‌سازی تو محدود است؛ ورودی‌های path traversal به‌عنوان ردشده گزارش میشوند.
GET
/api/webhooks/deliveries
نشست کنسول
تحویل‌های اخیر وب‌هوک با کدهای وضعیت.
POST
/api/webhooks/test
نشست کنسول
ارسال محمولهٔ آزمایشی به یک وب‌هوک یا به همهٔ آن‌ها.
GET
/api/admin/projects
نشست مدیر
همهٔ پروژه‌ها؛ ‎PATCH یکی را تعلیق میکند یا سهمیهٔ بازدید رایگانش را ویرایش میکند.
GET
/api/admin/cron
نشست مدیر
کلیدهای سراسری هر وظیفه؛ ‎PUT یکی را جابه‌جا میکند.
GET
/api/admin/public-library
نشست مدیر
فایل‌هایی که در ‎/~public/ سرو میشوند؛ ‎PUT منتشر میکند و ‎DELETE برمیدارد.
GET
/api/admin
نشست مدیر
مجموع‌های سراسر پلتفرم برای اپراتورها.
GET
/api/admin/config
نشست مدیر
پیکربندی مؤثر سیستم و پیش‌فرض‌هایش.
PUT
/api/admin/config
نشست مدیر
بازنویسی یک مقدار پیکربندی سیستم.
PATCH
/api/admin/users
نشست مدیر
تعلیق/فعال‌سازی یک حساب یا تغییر سقف فضای ذخیره‌سازی‌اش.
GET
/admin/api/{users,projects,system-configs,global-cron,stats}
نشست مدیر
نام‌های مستعار §۶.۴ از نشانی‌های ‹/api/admin› بالا.
GET
/.well-known/acme-challenge/{token}
عمومی
توکن چالش HTTP-01 را برای دامنه‌ای که در حال اعتبارسنجی است سرو میکند.

دامنه‌های اختصاصی روی DNS تأیید میشوند: یک دامنه وصل کن تا توکن localme-verify=… بگیری، آن را به‌عنوان رکورد TXT در _localme-verify.<domain> منتشر کن و بعد نشانی تأیید را صدا بزن. پس از تأیید، کل میزبان همان پروژه را سرو میکند.

محدودیت‌ها و سهمیه‌ها

۵ مگابایت فضای حساب

بین همهٔ پروژه‌ها و کتابخانه مشترک است. نوشتن فراتر از سقف، پیش از نوشتن داده با ۴۰۲ شکست میخورد.

۱۰ مگابایت برای هر فایل

سقف سخت برای یک بارگذاری، چندبخشی یا بدنهٔ خام.

۵۰۰ سند در هر پرس‌وجو

اندازهٔ صفحه روی ۵۰۰ سقف دارد و یک پرس‌وجو حداکثر ۵۰۰۰ سند را بررسی میکند و وقتی به این کران میرسد truncated را علامت میزند. مقدار total گزارش‌شده هم با آن سقف میخورد، پس با تنظیم truncated آن را «دست‌کم این‌تعداد» بخوان.

۱۰۰ بازدید رایگان برای هر پروژه در ماه

فقط سرو صفحه‌های HTML شمرده میشود. فایل‌های جانبی، ۴۰۴ها و ۴۰۳ها رایگان‌اند، نوسازی‌های درون پنج دقیقه تکراری حذف میشوند، و شمارنده در اول ماه صفر میشود.

محدودیت نرخ

هر مسیر API با یک پنجرهٔ ثابت به‌ازای هر هویت پوشش داده میشود که مرکزی اعمال میشود تا هیچ نشانی‌ای بدون محافظت اضافه نشود. عبور از آن ۴۲۹ با هدر Retry-After برمیگرداند. اعتبارها از تنگ‌ترین بودجه سهم میبرند؛ فراخوانی‌های پایگاه‌داده، فضای ذخیره‌سازی، کتابخانه، فایل و مدیریت هرکدام بودجهٔ خودشان را دارند.

طول عمر نشست

نشست‌های کنسول با فعالیت تمدید میشوند و پس از ۲۰ دقیقه بی‌کاری منقضی میشوند. کوکی بازدیدکننده ۲۰ دقیقه دوام میآورد و به پروژهٔ خودش محدود است.

عامل‌های هوش مصنوعی، اسکیل‌ها و سرور MCP

لوکال می پشتیبانی کامل و بومی از عامل‌های خودکار هوش مصنوعی (کلود، کرسر، آنتی‌گرویتی، ویندسرف و غیره) ارائه میدهد. عامل خود را به سرور MCP به نشانی https://localme.ir/api/mcp متصل کنید یا فایل اسکیل رسمی را در https://localme.ir/skills/localme/SKILL.md به آن بدهید. عامل‌ها میتوانند به صورت خودکار پروژه بسازند، فایل‌ها را بارگذاری کنند، دیتابیس را آماده کنند و مسیرها را تنظیم نمایند، در حالی که تایید صدور توکن همواره با تایید انسانی انجام میشود.

Agent Skill: /skills/localme/SKILL.md
View SKILL.md

Point Claude Code, Cursor, Windsurf or Antigravity to this skill document for complete guidelines and autonomous tooling.

توکن‌های دسترسی عامل (AAT) و فرآیند تایید انسانی

عامل‌ها با POST /api/agent/request-aat درخواست دسترسی میدهند. لینک تایید /auth/consent?requestId=… برای کاربر نمایش داده میشود تا در مرورگر تایید کند. پس از تایید، عامل با فراخوانی /api/agent/poll-aat توکن موقت را دریافت کرده، در localme-aat.txt ذخیره میکند و با ابزارهای MCP کار میکند. همچنین توکن‌های دسترسی شخصی (PAT) دائمی یا با چرخش خودکار از طریق /account قابل ایجاد هستند.

متدمسیرتوضیح
POST
/api/mcp
نشست یا کلید API
نقطه پایانی JSON-RPC 2.0 / SSE برای عامل‌های پروتکل زمینه مدل (MCP).
POST
/api/agent/request-aat
عمومی
درخواست یک توکن دسترسی عامل موقت (AAT)؛ نشانی اینترنتی تایید را برمیگرداند.
GET
/api/agent/poll-aat?requestId=…
عمومی
بررسی وضعیت تایید درخواست AAT تا زمان تایید یا رد توسط کاربر.
POST
/api/agent/check
عمومی
اعتبارسنجی توکن AAT و بازگرداندن مدت زمان باقی‌مانده اعتبار آن.
GET
/auth/consent?requestId=…
عمومی
صفحه تحت وب که در آن مالک حساب دسترسی‌های درخواستی عامل را بررسی و تایید میکند.
GET / POST
/api/account/pat
نشست کنسول
فهرست و ساخت توکن‌های دسترسی شخصی با امکان چرخش خودکار.

ابزارهای در دسترس در MCP

سرور MCP دوازده ابزار خودکار در اختیار عامل میگذارد: localme_list_projects، localme_get_project، localme_create_project، localme_list_files، localme_read_file، localme_upload_file، localme_delete_file، localme_db_find، localme_db_insert، localme_db_update، localme_db_delete و localme_get_usage.

خطاها

خطاها از کدهای وضعیت استاندارد و بدنهٔ JSON یکسان استفاده میکنند:

{ "error": "A document with id \"1\" already exists in orders", "code": "duplicate_document_id" }
وضعیتکدهای رایج
400‎invalid_json، ‎invalid_document، ‎missing_document_id، ‎reserved_path، ‎invalid_target، ‎invalid_schedule
401‎unauthenticated — وارد شو یا اعتبار ضمیمه کن
402سهمیهٔ بازدید این ماه تمام شده یا سقف فضای ذخیره‌سازی رد شده است
403‎forbidden — مجوز ناقص، نشانی غیرفعال یا لینک داغ مسدودشده
404‎not_found — هیچ مسیر، فایل یا رکوردی نخواند
409‎duplicate_document_id، ‎table_exists، ‎route_exists، ‎domain_exists، ‎project_exists
413‎file_too_large / payload_too_large — سقف ۱۰ مگابایت برای هر فایل
429‎rate_limit_exceeded — هدر ‹Retry-After› را ببین
500‎internal_error — پلتفرم خطا را برای بررسی ثبت کرد
آمادهٔ ساختنی؟

یک پروژه بساز، یک فایل HTML بگذار و شروع کن به صدا زدن این نشانی‌ها.