للمطورين / OPENAPI v1
امنح تطبيقك
القدرة على معرفة الهوية.
دليل واجهة التعرف على القطط من ماوبو
من أول صورة تسجيل إلى البحث عن الهوية. استخدم HTTP لإنشاء سجلات القطط وإدارة المهام واسترجاع المرشحين.
توثيق عام · دون تسجيل الدخول قبل الطلب الأول
- سجل الدخول إلى لوحة التحكم وأنشئ مشروعاً وانسخ UUID الكامل.
- أنشئ مفتاح API للمشروع وحدد صلاحياته واحفظ السر الذي يُعرض مرة واحدة فقط.
- أنشئ هوية قطة واحتفظ بقيمة id المعادة وارفع صور التسجيل.
- راجع قائمة المهام. بعد اكتمال التسجيل، ارفع صورة استعلام للحصول على المطابقات المرتبة.
في هذه الأمثلة، {{base_url}}هو عنوان HTTPS لخدمة API، و {{api_key}} هو مفتاح المشروع. احصل على العنوان من إعدادات النشر أو مزود الخدمة. يستضيف هذا الموقع التوثيق ولا يعالج طلبات الأعمال /v1.
تستخدم أمثلة cURL استمرار الأسطر في Bash. في Windows، استوردها إلى Postman عبر Import → Raw text واضبط base_url وapi_key وأعد اختيار الملفات. شغّل Python على الخادم بعد تثبيت requests وضبط متغيرات البيئة.
المصادقة
بيانات اعتماد ضمن المشروع
تقبل نقاط الأعمال Authorization: Bearer mk_live_… أو رمز دخول مالك المشروع. يرتبط كل مفتاح بمشروع وتحدد صلاحياته البيانات المتاحة.
| الصلاحية | العمليات المسموحة |
|---|
cats:read | قراءة الهويات وقوائم الصور ومحتواها |
cats:write | إدارة الهويات وتسجيل الصور وتحديد الصور الرئيسية ومرشحي التسجيل |
recognition:write | البحث عن هويات القطط |
tasks:read | قراءة المهام والنتائج والملخصات وصور المعاينة |
تُفحص حالة المفتاح وإلغاؤه وانتهاؤه وقائمة IP. يشمل الوصول الكامل الصلاحيات الأربع؛ تمنح مصفوفة scopes الفارغة عند الإنشاء الصلاحيات الأربع. تقبل إعادة المحاولة cats:write أو recognition:write.
تتطلب المشاريع والإعدادات والمفاتيح والمحافظ والفوترة والاستهلاك رمز دخول لا مفتاح API. خزّن الأسرار في متغيرات بيئة الخادم.
سير العمل
تسجيل غير متزامن واستعلام النتائج
يعيد التسجيل HTTP 202 مع task_id؛ وتكون vectors_added: 0 طبيعية في هذه المرحلة. تصبح الصور قابلة للبحث بعد استخراج السمات. تحظى طلبات التعرف بالأولوية وتنتظر الاستدلال قبل الرد.
queued → running → completed
→ waiting_user → selection → queued
→ failed → retry → queuedاستعلم عن GET /tasks?limit=10&offset=0 كل بضع ثوان وابحث عن task_id باستخدام id. لا توجد نقطة تفاصيل مستقلة GET /tasks/ {task_id} . تُرتب المهام من الأحدث إلى الأقدم. استخدم offset للصفحات وأزل التكرار بمعرف المهمة.
قد ينتج عن تسجيل عدة قطط وضع waiting_user. راجع صور المرشحين وأرسل candidate_index عبر selection أو ألغِ عبر cancel. لا تُعاد إلا المهام الفاشلة.
انتهاء مهلة الطلب لا يعني فشل المهمة. راجع قائمة المهام قبل إعادة الرفع لتجنب العمل والتكلفة المكررين. لا تتوفر إزالة تكرار عامة عبر Idempotency-Key.
الحدود والأخطاء
الحدود والفوترة ومعالجة الأخطاء
الحدود الافتراضية لكل مفتاح في الثانية: طلبا تعرف و10 طلبات تسجيل/كتابة و20 قراءة. يمكن تغييرها بالإعدادات. عند 429، التزم بـ Retry-After. تعرض ردود JSON الناجحة المعتادة X-RateLimit-Limit وX-RateLimit-Remaining.
حجم الصورة الافتراضي الأقصى 15 MiB وقابل للضبط. تُدعم JPEG وPNG وWebP. يُحاسب استخراج المتجهات؛ راجع الأسعار والأرصدة في لوحة التحكم. قد يكون detail نصاً أو كائناً أو مصفوفة تحقق. احتفظ بحالة HTTP وX-Request-Id.
| HTTP | رمز الخطأ / التفاصيل | الوصف |
|---|
| 401 | invalid_api_key | تنسيق أو سر غير صحيح، أو مفتاح غير معروف |
| 401 | expired_api_key | انتهت صلاحية المفتاح |
| 403 | api_key_disabled / api_key_revoked | المفتاح معطل أو ملغى |
| 403 | project_mismatch | المفتاح يخص مشروعاً آخر |
| 403 | scope_denied | الصلاحية المطلوبة غير متاحة |
| 403 | ip_not_allowed | عنوان IP المصدر غير مسموح |
| 404 | Not found | المشروع أو الهوية أو الصورة أو المهمة غير موجودة |
| 409 | Conflict | حالة المهمة لا تسمح بهذه العملية |
| 413 | Image is too large | الصورة تتجاوز حد الحجم المحدد |
| 415 | Unsupported media type | تُدعم JPEG وPNG وWebP فقط |
| 422 | Validation error | تحقق من الحقول الإلزامية والأنواع والنطاقات |
| 429 | rate_limit_exceeded | قلل التزامن والتزم بـ Retry-After |
| 503 | Recognition task failed | فشل الاستدلال؛ تحقق من حالة المهمة قبل الإعادة |
مرجع API / v1
التعرف على قطة
POST/v1/projects/{project_id}/search
الصلاحية المطلوبة: recognition:write. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
استخدم multipart/form-data مع حقل الملف الإلزامي image . ملف JPEG أو PNG أو WebP واحد لكل طلب. دع العميل ينشئ Content-Type وboundary.
معلمات الاستعلام والنتائج
top_k عدد صحيح من 1 إلى 100، وافتراضياً 5 (قابل للضبط)؛ threshold عتبة اختيارية من −1 إلى 1. عند حذفها تُستخدم القيمة الافتراضية للنموذج.
matches يحتوي على المرشحين مرتبين بالتشابه؛ unknown=true يعني عدم تجاوز هوية موثوقة للعتبة. داخل candidates ، تمثل score درجة الاكتشاف لا تشابه الهوية. اكتشاف الوجه لا يعني تحديد هوية القطة.
{
"cat_count": 1,
"route": "face",
"face_detected": true,
"unknown": true,
"matches": [],
"candidates": [
{
"index": 0,
"score": 0.95,
"route": "face",
"face_detected": true,
"unknown": true,
"matches": []
}
],
"task_id": "<task_id>"
}مثال لبنية الاستجابة، وليس نتيجة فعلية.
curl --request POST '{{base_url}}/v1/projects/{project_id}/search?top_k=5' \
--header 'Authorization: Bearer {{api_key}}' \
--form '[email protected];type=image/jpeg'
عرض مثال Python
import os
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
with open("cat.jpg", "rb") as image:
response = requests.post(
base_url + "/v1/projects/{project_id}/search?top_k=5",
headers={"Authorization": f"Bearer {api_key}"},
files={"image": ("cat.jpg", image, "image/jpeg")},
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
إنشاء هوية
POST/v1/projects/{project_id}/cats
الصلاحية المطلوبة: cats:write. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
name من 1 إلى 100 حرف وإلزامي عند الإنشاء؛ metadata كائن JSON؛ active قيمته الافتراضية true. أرسل الحقول المطلوب تحديثها فقط.
curl --request POST '{{base_url}}/v1/projects/{project_id}/cats' \
--header 'Authorization: Bearer {{api_key}}' \
--header 'Content-Type: application/json' \
--data '{"name":"Mimi","metadata":{},"active":true}'
عرض مثال Python
import os
import json
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.post(
base_url + "/v1/projects/{project_id}/cats",
headers={"Authorization": f"Bearer {api_key}"},
json=json.loads("{\"name\":\"Mimi\",\"metadata\":{},\"active\":true}"),
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
قائمة الهويات
GET/v1/projects/{project_id}/cats
الصلاحية المطلوبة: cats:read. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
curl --request GET '{{base_url}}/v1/projects/{project_id}/cats' \
--header 'Authorization: Bearer {{api_key}}'
عرض مثال Python
import os
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.get(
base_url + "/v1/projects/{project_id}/cats",
headers={"Authorization": f"Bearer {api_key}"},
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
تحديث هوية
PATCH/v1/projects/{project_id}/cats/{cat_id}
الصلاحية المطلوبة: cats:write. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
name من 1 إلى 100 حرف وإلزامي عند الإنشاء؛ metadata كائن JSON؛ active قيمته الافتراضية true. أرسل الحقول المطلوب تحديثها فقط.
curl --request PATCH '{{base_url}}/v1/projects/{project_id}/cats/{cat_id}' \
--header 'Authorization: Bearer {{api_key}}' \
--header 'Content-Type: application/json' \
--data '{"name":"Mimi","active":true}'
عرض مثال Python
import os
import json
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.patch(
base_url + "/v1/projects/{project_id}/cats/{cat_id}",
headers={"Authorization": f"Bearer {api_key}"},
json=json.loads("{\"name\":\"Mimi\",\"active\":true}"),
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
حذف هوية
DELETE/v1/projects/{project_id}/cats/{cat_id}
الصلاحية المطلوبة: cats:write. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
حذف الهوية يحذف صورها ومتجهاتها؛ وحذف الصورة يحذف متجهاتها. يعيد حذف الهوية 204 دون محتوى.
curl --request DELETE '{{base_url}}/v1/projects/{project_id}/cats/{cat_id}' \
--header 'Authorization: Bearer {{api_key}}'
عرض مثال Python
import os
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.delete(
base_url + "/v1/projects/{project_id}/cats/{cat_id}",
headers={"Authorization": f"Bearer {api_key}"},
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
تسجيل صورة
POST/v1/projects/{project_id}/cats/{cat_id}/images
الصلاحية المطلوبة: cats:write. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
استخدم multipart/form-data مع حقل الملف الإلزامي image . ملف JPEG أو PNG أو WebP واحد لكل طلب. دع العميل ينشئ Content-Type وboundary.
يعيد 202 queued مع task_id. تابع التسجيل في قائمة المهام.
curl --request POST '{{base_url}}/v1/projects/{project_id}/cats/{cat_id}/images' \
--header 'Authorization: Bearer {{api_key}}' \
--form '[email protected];type=image/jpeg'
عرض مثال Python
import os
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
with open("cat.jpg", "rb") as image:
response = requests.post(
base_url + "/v1/projects/{project_id}/cats/{cat_id}/images",
headers={"Authorization": f"Bearer {api_key}"},
files={"image": ("cat.jpg", image, "image/jpeg")},
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
قائمة الصور
GET/v1/projects/{project_id}/cats/{cat_id}/images
الصلاحية المطلوبة: cats:read. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
curl --request GET '{{base_url}}/v1/projects/{project_id}/cats/{cat_id}/images' \
--header 'Authorization: Bearer {{api_key}}'
عرض مثال Python
import os
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.get(
base_url + "/v1/projects/{project_id}/cats/{cat_id}/images",
headers={"Authorization": f"Bearer {api_key}"},
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
الحصول على صورة
GET/v1/projects/{project_id}/cats/{cat_id}/images/{image_id}/content
الصلاحية المطلوبة: cats:read. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
تحتوي الاستجابة الناجحة على صورة ثنائية، لا JSON.
curl --request GET '{{base_url}}/v1/projects/{project_id}/cats/{cat_id}/images/{image_id}/content' \
--header 'Authorization: Bearer {{api_key}}'
عرض مثال Python
import os
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.get(
base_url + "/v1/projects/{project_id}/cats/{cat_id}/images/{image_id}/content",
headers={"Authorization": f"Bearer {api_key}"},
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
تحديد الصورة الرئيسية
PATCH/v1/projects/{project_id}/cats/{cat_id}/images/{image_id}/primary
الصلاحية المطلوبة: cats:write. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
curl --request PATCH '{{base_url}}/v1/projects/{project_id}/cats/{cat_id}/images/{image_id}/primary' \
--header 'Authorization: Bearer {{api_key}}'
عرض مثال Python
import os
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.patch(
base_url + "/v1/projects/{project_id}/cats/{cat_id}/images/{image_id}/primary",
headers={"Authorization": f"Bearer {api_key}"},
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
حذف صورة
DELETE/v1/projects/{project_id}/cats/{cat_id}/images/{image_id}
الصلاحية المطلوبة: cats:write. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
حذف الهوية يحذف صورها ومتجهاتها؛ وحذف الصورة يحذف متجهاتها. يعيد حذف الهوية 204 دون محتوى.
curl --request DELETE '{{base_url}}/v1/projects/{project_id}/cats/{cat_id}/images/{image_id}' \
--header 'Authorization: Bearer {{api_key}}'
عرض مثال Python
import os
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.delete(
base_url + "/v1/projects/{project_id}/cats/{cat_id}/images/{image_id}",
headers={"Authorization": f"Bearer {api_key}"},
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
قائمة المهام
GET/v1/projects/{project_id}/tasks
الصلاحية المطلوبة: tasks:read. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
limit من 1 إلى 200، وافتراضياً 100؛ offset لا يقل عن 0، وافتراضياً 0. تحتوي المصفوفة المعادة على حالات المهام وresult.
curl --request GET '{{base_url}}/v1/projects/{project_id}/tasks?limit=10&offset=0' \
--header 'Authorization: Bearer {{api_key}}'
عرض مثال Python
import os
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.get(
base_url + "/v1/projects/{project_id}/tasks?limit=10&offset=0",
headers={"Authorization": f"Bearer {api_key}"},
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
ملخص المهمة
GET/v1/projects/{project_id}/tasks/summary
الصلاحية المطلوبة: tasks:read. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
curl --request GET '{{base_url}}/v1/projects/{project_id}/tasks/summary' \
--header 'Authorization: Bearer {{api_key}}'
عرض مثال Python
import os
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.get(
base_url + "/v1/projects/{project_id}/tasks/summary",
headers={"Authorization": f"Bearer {api_key}"},
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
صورة الاستعلام
GET/v1/projects/{project_id}/tasks/{task_id}/query
الصلاحية المطلوبة: tasks:read. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
تحتوي الاستجابة الناجحة على صورة ثنائية، لا JSON.
curl --request GET '{{base_url}}/v1/projects/{project_id}/tasks/{task_id}/query' \
--header 'Authorization: Bearer {{api_key}}'
عرض مثال Python
import os
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.get(
base_url + "/v1/projects/{project_id}/tasks/{task_id}/query",
headers={"Authorization": f"Bearer {api_key}"},
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
صورة المرشح
GET/v1/projects/{project_id}/tasks/{task_id}/candidates/{candidate_index}
الصلاحية المطلوبة: tasks:read. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
تحتوي الاستجابة الناجحة على صورة ثنائية، لا JSON.
curl --request GET '{{base_url}}/v1/projects/{project_id}/tasks/{task_id}/candidates/{candidate_index}' \
--header 'Authorization: Bearer {{api_key}}'
عرض مثال Python
import os
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.get(
base_url + "/v1/projects/{project_id}/tasks/{task_id}/candidates/{candidate_index}",
headers={"Authorization": f"Bearer {api_key}"},
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
اختيار مرشح التسجيل
POST/v1/projects/{project_id}/tasks/{task_id}/selection
الصلاحية المطلوبة: cats:write. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
متاح فقط لمهام التسجيل في waiting_user. تعيد الحالات الأخرى 409. يجب أن يكون candidate_index عدداً صحيحاً غير سالب.
curl --request POST '{{base_url}}/v1/projects/{project_id}/tasks/{task_id}/selection' \
--header 'Authorization: Bearer {{api_key}}' \
--header 'Content-Type: application/json' \
--data '{"candidate_index":0}'
عرض مثال Python
import os
import json
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.post(
base_url + "/v1/projects/{project_id}/tasks/{task_id}/selection",
headers={"Authorization": f"Bearer {api_key}"},
json=json.loads("{\"candidate_index\":0}"),
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
إلغاء التسجيل المعلق
POST/v1/projects/{project_id}/tasks/{task_id}/cancel
الصلاحية المطلوبة: cats:write. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
متاح فقط لمهام التسجيل في waiting_user. تعيد الحالات الأخرى 409. يجب أن يكون candidate_index عدداً صحيحاً غير سالب.
curl --request POST '{{base_url}}/v1/projects/{project_id}/tasks/{task_id}/cancel' \
--header 'Authorization: Bearer {{api_key}}'
عرض مثال Python
import os
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.post(
base_url + "/v1/projects/{project_id}/tasks/{task_id}/cancel",
headers={"Authorization": f"Bearer {api_key}"},
timeout=120,
)
response.raise_for_status()
print(response.content)
مرجع API / v1
إعادة مهمة فاشلة
POST/v1/projects/{project_id}/tasks/{task_id}/retry
الصلاحية المطلوبة: cats:write / recognition:write. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.
يمكن إعادة المهام الفاشلة فقط إذا احتُفظ بالمصدر. يعيد النجاح 202.
curl --request POST '{{base_url}}/v1/projects/{project_id}/tasks/{task_id}/retry' \
--header 'Authorization: Bearer {{api_key}}'
عرض مثال Python
import os
import requests
api_key = os.environ["MEOWID_API_KEY"]
base_url = os.environ["MEOWID_API_BASE"].rstrip("/")
# استبدل {project_id} و{cat_id} وغيرهما بالمعرفات الفعلية.
response = requests.post(
base_url + "/v1/projects/{project_id}/tasks/{task_id}/retry",
headers={"Authorization": f"Bearer {api_key}"},
timeout=120,
)
response.raise_for_status()
print(response.content)
تُزامن المسارات والأجسام والصلاحيات من توثيق المنصة الحالي. تحتوي الأمثلة على متغيرات بديلة فقط، دون مفاتيح حقيقية.