LocalMe HTTP API
همهٔ پروژههای میزبانیشده با یک سطح REST یکسان کار میکنند. پلتفرم از روی مسیر درخواست یا هدر X-Project-Id تشخیص میدهد کدام پروژه دارد صدا میزند، بنابراین فرانتاند تو میتواند از هر صفحهای نشانیهای نسبی /api/… را صدا بزند.
نمای کلی
یک پروژه، پوشهای از فایلهای استاتیک بهعلاوهٔ یک بکاند مدیریتشده است: پایگاهدادهٔ سندی، فضای ذخیرهسازی بلاب، کتابخانهٔ فایلهای مشترک، حسابهای بازدیدکننده و نقشها، مسیریابی، اسرار رمزشده، یک پروکسی معکوس، وظایف زمانبندیشده، وبهوکها و دامنههای اختصاصی. تو 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 صادرش میکند. نقش و مجوزهای بازدیدکننده را حمل میکند.
به شکل 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 میخواهد و فقط برای فراخوانی سرور به سرور است.
مسیریابی و سرو
یک درخواست ورودی به این ترتیب تشخیص داده میشود:
- تطبیق دقیق مسیر، فایل HTML هدفش را سرو میکند.
- تطبیق مسیر با الگوی عام (مثلاً /blog/*) هدفش را سرو میکند.
- فایل ذخیرهشده در مسیر درخواستی مستقیم و با کش بلندمدت سرو میشود.
- برای مسیرهای پوشه، <dir>/index.html سرو میشود.
- /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 به آن بدهید. عاملها میتوانند به صورت خودکار پروژه بسازند، فایلها را بارگذاری کنند، دیتابیس را آماده کنند و مسیرها را تنظیم نمایند، در حالی که تایید صدور توکن همواره با تایید انسانی انجام میشود.
/skills/localme/SKILL.mdPoint 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 بگذار و شروع کن به صدا زدن این نشانیها.