للمطورين / OPENAPI v1

امنح تطبيقك
القدرة على معرفة الهوية.

دليل واجهة التعرف على القطط من ماوبو

من أول صورة تسجيل إلى البحث عن الهوية. استخدم HTTP لإنشاء سجلات القطط وإدارة المهام واسترجاع المرشحين.

توثيق عام · دون تسجيل الدخول

قبل الطلب الأول

  1. سجل الدخول إلى لوحة التحكم وأنشئ مشروعاً وانسخ UUID الكامل.
  2. أنشئ مفتاح API للمشروع وحدد صلاحياته واحفظ السر الذي يُعرض مرة واحدة فقط.
  3. أنشئ هوية قطة واحتفظ بقيمة id المعادة وارفع صور التسجيل.
  4. راجع قائمة المهام. بعد اكتمال التسجيل، ارفع صورة استعلام للحصول على المطابقات المرتبة.
في هذه الأمثلة، {{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 رمز الخطأ / التفاصيل الوصف
401invalid_api_keyتنسيق أو سر غير صحيح، أو مفتاح غير معروف
401expired_api_keyانتهت صلاحية المفتاح
403api_key_disabled / api_key_revokedالمفتاح معطل أو ملغى
403project_mismatchالمفتاح يخص مشروعاً آخر
403scope_deniedالصلاحية المطلوبة غير متاحة
403ip_not_allowedعنوان IP المصدر غير مسموح
404Not foundالمشروع أو الهوية أو الصورة أو المهمة غير موجودة
409Conflictحالة المهمة لا تسمح بهذه العملية
413Image is too largeالصورة تتجاوز حد الحجم المحدد
415Unsupported media typeتُدعم JPEG وPNG وWebP فقط
422Validation errorتحقق من الحقول الإلزامية والأنواع والنطاقات
429rate_limit_exceededقلل التزامن والتزم بـ Retry-After
503Recognition task failedفشل الاستدلال؛ تحقق من حالة المهمة قبل الإعادة

مرجع API / v1

إنشاء هوية

POST/v1/projects/{project_id}/cats

الصلاحية المطلوبة: cats:write. يُقبل أيضاً رمز دخول المالك. استبدل جميع متغيرات المسار بالمعرفات الفعلية.

name من 1 إلى 100 حرف وإلزامي عند الإنشاء؛ metadata كائن JSON؛ active قيمته الافتراضية true. أرسل الحقول المطلوب تحديثها فقط.

cURL / Postman

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 / Postman

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 / Postman

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 / Postman

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 / Postman

curl --request POST '{{base_url}}/v1/projects/{project_id}/cats/{cat_id}/images' \
  --header 'Authorization: Bearer {{api_key}}' \
  --form 'image=@cat.jpg;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 / Postman

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 / Postman

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 / Postman

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 / Postman

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 / Postman

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 / Postman

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 / Postman

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 / Postman

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 / Postman

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 / Postman

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 / Postman

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)

تُزامن المسارات والأجسام والصلاحيات من توثيق المنصة الحالي. تحتوي الأمثلة على متغيرات بديلة فقط، دون مفاتيح حقيقية.