تخطي إلى المحتوى

مرجع REST API

منصة Ultralytics توفر واجهة REST API شاملة للوصول البرمجي إلى مجموعات البيانات والنماذج والتدريب وعمليات النشر.

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

بدء سريع

# List your datasets
curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://platform.ultralytics.com/api/datasets

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

يتم تنظيم واجهة برمجة التطبيقات (API) حول موارد المنصة الأساسية:

graph LR
    A[API Key] --> B[Datasets]
    A --> C[Projects]
    A --> D[Models]
    A --> E[Deployments]
    B -->|train on| D
    C -->|contains| D
    D -->|deploy to| E
    D -->|export| F[Exports]
    B -->|auto-annotate| B
المواردالوصفالعمليات الرئيسية
مجموعات البياناتمجموعات الصور الموسومةCRUD، الصور، التسميات، التصدير، النسخ
المشاريعمساحات عمل التدريبCRUD، استنساخ، أيقونة
النماذجنقاط التفتيش المدربةCRUD، التنبؤ، التنزيل، النسخ، التصدير
عمليات النشرنقاط نهاية الاستدلال المخصصةCRUD، بدء/إيقاف، المقاييس، السجلات، الحالة
عمليات التصديرمهام تحويل التنسيقإنشاء، الحالة، تنزيل
التدريبوظائف GPU السحابيةبدء، حالة، إلغاء
الفواتيرالائتمانات والاشتراكاتالرصيد، إعادة التعبئة، طرق الدفع
الفرقالتعاون في مساحة العملالأعضاء، الدعوات، الأدوار

المصادقة

تتطلب معظم طلبات API المصادقة عبر مفتاح API. تدعم نقاط النهاية العامة (قائمة مجموعات البيانات العامة والمشاريع والنماذج) الوصول للقراءة بشكل مجهول دون مفتاح.

الحصول على مفتاح API

  1. انتقل إلى Settings > Profile (قسم مفاتيح API)
  2. انقر Create Key
  3. انسخ المفتاح الذي تم إنشاؤه

راجع مفاتيح API للحصول على تعليمات مفصلة.

رأس التفويض

قم بتضمين مفتاح API الخاص بك في جميع الطلبات:

Authorization: Bearer ul_your_api_key_here

تنسيق مفتاح API

تستخدم مفاتيح API التنسيق ul_ متبوعًا بـ 40 حرفًا سداسيًا عشريًا. حافظ على سرية مفتاحك - لا تقم أبدًا بإدخاله في التحكم في الإصدار أو مشاركته علنًا.

مثال

curl -H "Authorization: Bearer ul_abc123..." \
  https://platform.ultralytics.com/api/datasets
import requests

headers = {"Authorization": "Bearer ul_abc123..."}
response = requests.get(
    "https://platform.ultralytics.com/api/datasets",
    headers=headers,
)
data = response.json()
const response = await fetch("https://platform.ultralytics.com/api/datasets", {
  headers: { Authorization: "Bearer ul_abc123..." },
});
const data = await response.json();

عنوان URL الأساسي

تستخدم جميع نقاط نهاية API:

https://platform.ultralytics.com/api

حدود المعدل

تستخدم واجهة برمجة التطبيقات (API) نظامًا مزدوج الطبقات لتقييد معدل الاستخدام لحماية النظام من إساءة الاستخدام مع الحفاظ على الاستخدام المشروع دون قيود:

  • لكل مفتاح API — يتم فرض القيود لكل مفتاح API على الطلبات المصادق عليها
  • لكل عنوان IP — 100 طلب/دقيقة لكل عنوان IP على جميع /api/* المسارات (ينطبق على الطلبات المصادق عليها وغير المصادق عليها)

عند الاختناق، تعيد واجهة برمجة التطبيقات 429 مع إعادة محاولة البيانات الوصفية:

Retry-After: 12
X-RateLimit-Reset: 2026-02-21T12:34:56.000Z

وفقًا لحدود مفتاح API

يتم تطبيق حدود المعدل تلقائيًا بناءً على نقطة النهاية التي يتم استدعاؤها. العمليات المكلفة لها حدود أكثر صرامة لمنع إساءة الاستخدام، بينما تشترك عمليات CRUD القياسية في حدود افتراضية سخية:

نقطة النهايةالحد الأقصىينطبق على
افتراضي100 طلب/دقيقةجميع نقاط النهاية غير المدرجة أدناه (قائمة، الحصول، الإنشاء، التحديث، الحذف)
التدريب10 طلبات/دقيقةبدء وظائف التدريب على السحابة (POST /api/training/start)
تحميل10 طلبات/دقيقةتحميل الملفات وعناوين URL الموقعة واستيعاب مجموعات البيانات
توقع20 طلبًا/دقيقةاستنتاج النموذج المشترك (POST /api/models/{id}/predict)
تصدير20 طلبًا/دقيقةتصدير تنسيق النموذج (POST /api/exports) وتصدير مجموعات البيانات NDJSON
تنزيل30 طلبًا/دقيقةتنزيل ملفات وزن النموذج (GET /api/models/{id}/download)
مخصصةغير محدودنقاط نهاية مخصصة — خدمتك الخاصة، بدون قيود على واجهة برمجة التطبيقات

كل فئة لها عداد مستقل لكل مفتاح API. على سبيل المثال، إجراء 20 طلبًا للتنبؤ لا يؤثر على الحد الافتراضي المسموح به وهو 100 طلب في الدقيقة.

نقاط نهاية مخصصة (غير محدودة)

نقاط نهاية مخصصة هي لا يخضع لحدود معدل مفتاح API. عند نشر نموذج إلى نقطة نهاية مخصصة، فإن الطلبات إلى عنوان URL لنقطة النهاية تلك (على سبيل المثال، https://predict-abc123.run.app/predict) انتقل مباشرة إلى الخدمة المخصصة لك دون أي قيود على السرعة من المنصة. أنت تدفع مقابل الحوسبة، لذا تحصل على إنتاجية غير محدودة تصل إلى تكوين توسيع نطاق نقطة النهاية الخاصة بك.

حدود معدل المعالجة

عندما تتلقى 429 رمز الحالة، انتظر Retry-After (أو حتى X-RateLimit-Reset) قبل إعادة المحاولة. انظر الأسئلة الشائعة حول حدود السرعة لتنفيذ التراجع الأسي.

تنسيق الاستجابة

ردود النجاح

تُرجع الاستجابات JSON مع حقول خاصة بالموارد:

{
    "datasets": [...],
    "total": 100
}

استجابات الأخطاء

{
    "error": "Invalid dataset ID"
}
حالة HTTPالمعنى
200النجاح
201الإنشاء
400طلب غير صالح
401المصادقة مطلوبة
403أذونات غير كافية
404المورد غير موجود
409الصراع (مكرر)
429تجاوز حد المعدل
500خطأ في الخادم

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

إدارة مجموعات الصور الموسومة لتدريب YOLO .

قائمة مجموعات البيانات

GET /api/datasets

معلمات الاستعلام:

المعلمةالنوعالوصف
usernameسلسلة نصيةتصفية حسب اسم المستخدم
slugسلسلة نصيةجلب مجموعة بيانات واحدة بواسطة slug
limitعدد صحيحالعناصر لكل صفحة (الافتراضي: 20، الحد الأقصى: 500)
ownerسلسلة نصيةاسم المستخدم لمالك مساحة العمل
curl -H "Authorization: Bearer $API_KEY" \
  "https://platform.ultralytics.com/api/datasets?limit=10"
import requests

resp = requests.get(
    "https://platform.ultralytics.com/api/datasets",
    headers={"Authorization": f"Bearer {API_KEY}"},
    params={"limit": 10},
)
for ds in resp.json()["datasets"]:
    print(f"{ds['name']}: {ds['imageCount']} images")

الاستجابة:

{
    "datasets": [
        {
            "_id": "dataset_abc123",
            "name": "my-dataset",
            "slug": "my-dataset",
            "task": "detect",
            "imageCount": 1000,
            "classCount": 10,
            "classNames": ["person", "car"],
            "visibility": "private",
            "username": "johndoe",
            "starCount": 3,
            "isStarred": false,
            "sampleImages": [
                {
                    "url": "https://storage.example.com/...",
                    "width": 1920,
                    "height": 1080,
                    "labels": [{ "classId": 0, "bbox": [0.5, 0.4, 0.3, 0.6] }]
                }
            ],
            "createdAt": "2024-01-15T10:00:00Z",
            "updatedAt": "2024-01-16T08:30:00Z"
        }
    ],
    "total": 1,
    "region": "us"
}

الحصول على مجموعة بيانات

GET /api/datasets/{datasetId}

يعرض تفاصيل مجموعة البيانات الكاملة بما في ذلك البيانات الوصفية وأسماء الفئات وعدد الأقسام.

إنشاء مجموعة بيانات

POST /api/datasets

الجسم:

{
    "slug": "my-dataset",
    "name": "My Dataset",
    "task": "detect",
    "description": "A custom detection dataset",
    "visibility": "private",
    "classNames": ["person", "car"]
}

المهام المدعومة

صالح task القيم: detect, segment, classify, pose, obb.

تحديث مجموعة البيانات

PATCH /api/datasets/{datasetId}

النص (تحديث جزئي):

{
    "name": "Updated Name",
    "description": "New description",
    "visibility": "public"
}

حذف مجموعة البيانات

DELETE /api/datasets/{datasetId}

حذف مؤقت لمجموعة البيانات (نقلها إلى سلة المهملات، يمكن استعادتها خلال 30 يومًا).

استنساخ مجموعة البيانات

POST /api/datasets/{datasetId}/clone

ينشئ نسخة من مجموعة البيانات مع جميع الصور والتسميات. لا يمكن استنساخ سوى مجموعات البيانات العامة.

النص (جميع الحقول اختيارية):

{
    "name": "cloned-dataset",
    "description": "My cloned dataset",
    "visibility": "private",
    "owner": "team-username"
}

تصدير مجموعة البيانات

GET /api/datasets/{datasetId}/export

إرجاع استجابة JSON مع عنوان URL للتنزيل الموقع لملف تصدير مجموعة البيانات.

الاستجابة:

{
    "downloadUrl": "https://storage.example.com/export.ndjson?signed=...",
    "cached": true
}

الحصول على إحصائيات الفصل

GET /api/datasets/{datasetId}/class-stats

يعرض توزيع الفئات، وخريطة الحرارة للموقع، وإحصائيات الأبعاد. يتم تخزين النتائج في ذاكرة التخزين المؤقت لمدة تصل إلى 5 دقائق.

الاستجابة:

{
    "classes": [{ "classId": 0, "count": 1500, "imageCount": 450 }],
    "imageStats": {
        "widthHistogram": [{ "bin": 640, "count": 120 }],
        "heightHistogram": [{ "bin": 480, "count": 95 }],
        "pointsHistogram": [{ "bin": 4, "count": 200 }]
    },
    "locationHeatmap": {
        "bins": [
            [5, 10],
            [8, 3]
        ],
        "maxCount": 50
    },
    "dimensionHeatmap": {
        "bins": [
            [2, 5],
            [3, 1]
        ],
        "maxCount": 12,
        "minWidth": 10,
        "maxWidth": 1920,
        "minHeight": 10,
        "maxHeight": 1080
    },
    "classNames": ["person", "car", "dog"],
    "cached": true,
    "sampled": false,
    "sampleSize": 1000
}

احصل على نماذج مدربة على مجموعة البيانات

GET /api/datasets/{datasetId}/models

تُرجع النماذج التي تم تدريبها باستخدام مجموعة البيانات هذه.

الاستجابة:

{
    "models": [
        {
            "_id": "model_abc123",
            "name": "experiment-1",
            "slug": "experiment-1",
            "status": "completed",
            "task": "detect",
            "epochs": 100,
            "bestEpoch": 87,
            "projectId": "project_xyz",
            "projectSlug": "my-project",
            "projectIconColor": "#3b82f6",
            "projectIconLetter": "M",
            "username": "johndoe",
            "startedAt": "2024-01-14T22:00:00Z",
            "completedAt": "2024-01-15T10:00:00Z",
            "createdAt": "2024-01-14T21:55:00Z",
            "metrics": {
                "mAP50": 0.85,
                "mAP50-95": 0.72,
                "precision": 0.88,
                "recall": 0.81
            }
        }
    ],
    "count": 1
}

التعليق التلقائي على مجموعة البيانات

POST /api/datasets/{datasetId}/predict

قم بتشغيل YOLO على صور مجموعة البيانات لتوليد التعليقات التوضيحية تلقائيًا. يستخدم نموذجًا محددًا للتنبؤ بالعلامات للصور غير المُعلّقة.

الجسم:

الحقلالنوعمطلوبالوصف
imageHashسلسلة نصيةنعمتجزئة الصورة المراد تعليقها
modelIdسلسلة نصيةلامعرف النموذج المراد استخدامه للاستدلال
confidenceعائملاعتبة الثقة (الافتراضية: 0.25)
iouعائملاIoU (الافتراضية: 0.45)

استيعاب مجموعة البيانات

POST /api/datasets/ingest

قم بإنشاء مهمة استيراد مجموعة بيانات لمعالجة ملفات ZIP التي تم تحميلها والتي تحتوي على صور وتسميات.

graph LR
    A[Upload ZIP] --> B[POST /api/datasets/ingest]
    B --> C[Process ZIP]
    C --> D[Extract images]
    C --> E[Parse labels]
    C --> F[Generate thumbnails]
    D & E & F --> G[Dataset ready]

مجموعة بيانات الصور

قائمة الصور

GET /api/datasets/{datasetId}/images

معلمات الاستعلام:

المعلمةالنوعالوصف
splitسلسلة نصيةتصفية حسب التقسيم: train, val, test
offsetعدد صحيحإزاحة ترقيم الصفحات (الافتراضي: 0)
limitعدد صحيحالعناصر لكل صفحة (الافتراضي: 50، الحد الأقصى: 5000)
sortسلسلة نصيةترتيب الفرز: newest, oldest, name-asc, name-desc, size-asc, size-desc, labels-asc, labels-desc
hasLabelسلسلة نصيةتصفية حسب حالة الملصق (true أو false)
hasErrorسلسلة نصيةتصفية حسب حالة الخطأ (true أو false)
searchسلسلة نصيةالبحث حسب اسم الملف أو تجزئة الصورة
includeThumbnailsسلسلة نصيةتضمين عناوين URL المصغرة الموقعة (الافتراضي: true)
includeImageUrlsسلسلة نصيةتضمين عناوين URL الكاملة للصور الموقعة (الافتراضي: false)

الحصول على عناوين URL للصور الموقعة

POST /api/datasets/{datasetId}/images/urls

احصل على عناوين URL موقعة لمجموعة من تجزئات الصور (لعرضها في المتصفح).

حذف الصورة

DELETE /api/datasets/{datasetId}/images/{hash}

الحصول على تسميات الصور

GET /api/datasets/{datasetId}/images/{hash}/labels

يعرض التعليقات التوضيحية وأسماء الفئات لصورة معينة.

تحديث تسميات الصور

PUT /api/datasets/{datasetId}/images/{hash}/labels

الجسم:

{
    "labels": [{ "classId": 0, "bbox": [0.5, 0.5, 0.2, 0.3] }]
}

تنسيق الإحداثيات

تستخدم المربعات المحددة تنسيق YOLO : [x_center, y_center, width, height] حيث جميع القيم تتراوح بين 0 و 1.

عمليات الصور المجمعة

نقل الصور بين الأقسام (التدريب/التقييم/الاختبار) داخل مجموعة البيانات:

PATCH /api/datasets/{datasetId}/images/bulk

حذف الصور بشكل جماعي:

DELETE /api/datasets/{datasetId}/images/bulk

واجهة برمجة تطبيقات المشاريع

إدارة مساحات عمل التدريب التي تجمع النماذج معًا.

سرد المشاريع

GET /api/projects

معلمات الاستعلام:

المعلمةالنوعالوصف
usernameسلسلة نصيةتصفية حسب اسم المستخدم
limitعدد صحيحعدد العناصر في كل صفحة
ownerسلسلة نصيةاسم المستخدم لمالك مساحة العمل

الحصول على مشروع

GET /api/projects/{projectId}

إنشاء مشروع

POST /api/projects
curl -X POST \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "my-project", "slug": "my-project", "description": "Detection experiments"}' \
  https://platform.ultralytics.com/api/projects
resp = requests.post(
    "https://platform.ultralytics.com/api/projects",
    headers={"Authorization": f"Bearer {API_KEY}"},
    json={"name": "my-project", "slug": "my-project", "description": "Detection experiments"},
)
project_id = resp.json()["projectId"]

تحديث المشروع

PATCH /api/projects/{projectId}

حذف المشروع

DELETE /api/projects/{projectId}

حذف المشروع بشكل مؤقت (نقله إلى سلة المهملات).

مشروع الاستنساخ

POST /api/projects/{projectId}/clone

أيقونة المشروع

تحميل رمز المشروع (نموذج متعدد الأجزاء مع ملف صورة):

POST /api/projects/{projectId}/icon

إزالة رمز المشروع:

DELETE /api/projects/{projectId}/icon

واجهة برمجة تطبيقات النماذج

إدارة نقاط فحص النماذج المدربة ضمن المشاريع.

سرد النماذج

GET /api/models

معلمات الاستعلام:

المعلمةالنوعمطلوبالوصف
projectIdسلسلة نصيةنعمرقم المشروع (مطلوب)
fieldsسلسلة نصيةلامجموعة الحقول: summary, charts
idsسلسلة نصيةلامعرفات النماذج المفصولة بفواصل
limitعدد صحيحلاالنتائج القصوى (الافتراضي 20، الحد الأقصى 100)

قائمة النماذج المكتملة

GET /api/models/completed

إرجاع النماذج التي انتهت من التدريب (لاستخدامها في محددات النماذج والنشر).

الحصول على نموذج

GET /api/models/{modelId}

إنشاء نموذج

POST /api/models

نص JSON:

الحقلالنوعمطلوبالوصف
projectIdسلسلة نصيةنعمرقم مشروع الهدف
slugسلسلة نصيةلاعنوان URL (أحرف أبجدية رقمية صغيرة/واصلة)
nameسلسلة نصيةلااسم العرض (100 حرف كحد أقصى)
descriptionسلسلة نصيةلاوصف النموذج (1000 حرف كحد أقصى)
taskسلسلة نصيةلانوع المهمة (detect، segment، الوضع، obb classify)

تحميل ملف النموذج

النموذج .pt يتم التعامل مع تحميل الملفات بشكل منفصل. استخدم واجهة المستخدم الخاصة بالمنصة لسحب ملفات النماذج وإفلاتها في المشروع.

تحديث النموذج

PATCH /api/models/{modelId}

حذف النموذج

DELETE /api/models/{modelId}

تنزيل ملفات النماذج

GET /api/models/{modelId}/files

يعيد عناوين URL موقعة لتنزيل ملفات النموذج.

نموذج النسخ

POST /api/models/{modelId}/clone

انسخ نموذجًا عامًا إلى أحد مشاريعك.

الجسم:

{
    "targetProjectSlug": "my-project",
    "modelName": "cloned-model",
    "description": "Cloned from public model",
    "owner": "team-username"
}
الحقلالنوعمطلوبالوصف
targetProjectSlugسلسلة نصيةنعمعنوان مشروع الوجهة
modelNameسلسلة نصيةلااسم النموذج المستنسخ
descriptionسلسلة نصيةلاوصف النموذج
ownerسلسلة نصيةلااسم المستخدم الخاص بالفريق (لنسخ مساحة العمل)

تتبع التنزيل

POST /api/models/{modelId}/track-download

تتبع تحليلات تنزيل النماذج.

تشغيل الاستدلال

POST /api/models/{modelId}/predict

نموذج متعدد الأجزاء:

الحقلالنوعالوصف
fileملفملف صورة (JPEG، PNG، WebP)
confعائمعتبة الثقة (الافتراضية: 0.25)
iouعائمIoU (الافتراضية: 0.7)
imgszعدد صحيححجم الصورة بالبكسل (الافتراضي: 640)
curl -X POST \
  -H "Authorization: Bearer $API_KEY" \
  -F "file=@image.jpg" \
  -F "conf=0.5" \
  https://platform.ultralytics.com/api/models/MODEL_ID/predict
with open("image.jpg", "rb") as f:
    resp = requests.post(
        f"https://platform.ultralytics.com/api/models/{model_id}/predict",
        headers={"Authorization": f"Bearer {API_KEY}"},
        files={"file": f},
        data={"conf": 0.5},
    )
results = resp.json()["images"][0]["results"]

الاستجابة:

{
    "images": [
        {
            "shape": [1080, 1920],
            "results": [
                {
                    "class": 0,
                    "name": "person",
                    "confidence": 0.92,
                    "box": { "x1": 100, "y1": 50, "x2": 300, "y2": 400 }
                }
            ]
        }
    ],
    "metadata": {
        "imageCount": 1
    }
}

احصل على رمز Predict

POST /api/models/{modelId}/predict/token

احصل على رمز قصير الأجل لطلبات التنبؤ المباشرة. يتجاوز الرمز وكيل API للحصول على استنتاجات ذات زمن انتقال أقل من تطبيقات جانب العميل.

نموذج الإحماء

POST /api/models/{modelId}/predict/warmup

قم بتحميل نموذج مسبقًا للحصول على استنتاج أول أسرع. قم باستدعاء هذا قبل تشغيل التنبؤات لتجنب التأخير في الطلب الأولي.


واجهة برمجة تطبيقات التدريب

بدء مهام التدريب السحابي ومراقبتها وإلغاؤها.

graph LR
    A[POST /training/start] --> B[Job Created]
    B --> C{Training}
    C -->|progress| D[GET /models/id/training]
    C -->|cancel| E[DELETE /models/id/training]
    C -->|complete| F[Model Ready]
    F --> G[Deploy or Export]

ابدأ التدريب

POST /api/training/start
curl -X POST \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "modelId": "MODEL_ID",
    "projectId": "PROJECT_ID",
    "gpuType": "rtx-4090",
    "trainArgs": {
      "model": "yolo11n.pt",
      "data": "ul://username/datasets/my-dataset",
      "epochs": 100,
      "imgsz": 640,
      "batch": 16
    }
  }' \
  https://platform.ultralytics.com/api/training/start
resp = requests.post(
    "https://platform.ultralytics.com/api/training/start",
    headers={"Authorization": f"Bearer {API_KEY}"},
    json={
        "modelId": "MODEL_ID",
        "projectId": "PROJECT_ID",
        "gpuType": "rtx-4090",
        "trainArgs": {
            "model": "yolo11n.pt",
            "data": "ul://username/datasets/my-dataset",
            "epochs": 100,
            "imgsz": 640,
            "batch": 16,
        },
    },
)

GPU

تشمل GPU المتاحة ما يلي rtx-4090, a100-80gb-pcie, a100-80gb-sxm, h100-sxm, rtx-pro-6000، وغيرها. انظر التدريب السحابي للحصول على القائمة الكاملة مع الأسعار.

الحصول على حالة التدريب

GET /api/models/{modelId}/training

إرجاع حالة مهمة التدريب الحالية والمقاييس والتقدم المحرز لنموذج ما.

إلغاء التدريب

DELETE /api/models/{modelId}/training

ينهي تشغيل مثيل الحوسبة ويضع علامة على المهمة على أنها ملغاة.


واجهة برمجة تطبيقات عمليات النشر

إنشاء وإدارة نقاط نهاية استدلال مخصصة.

graph LR
    A[Create] --> B[Deploying]
    B --> C[Ready]
    C -->|stop| D[Stopped]
    D -->|start| C
    C -->|delete| E[Deleted]
    D -->|delete| E
    C -->|predict| F[Inference Results]

سرد عمليات النشر

GET /api/deployments

معلمات الاستعلام:

المعلمةالنوعالوصف
modelIdسلسلة نصيةتصفية حسب النموذج
statusسلسلة نصيةتصفية حسب الحالة
limitعدد صحيحالنتائج القصوى (الافتراضي: 20، الحد الأقصى: 100)
ownerسلسلة نصيةاسم المستخدم لمالك مساحة العمل

إنشاء عملية نشر

POST /api/deployments

الجسم:

{
    "modelId": "model_abc123",
    "name": "my-deployment",
    "region": "us-central1",
    "resources": {
        "cpu": 1,
        "memoryGi": 2,
        "minInstances": 0,
        "maxInstances": 1
    }
}
الحقلالنوعمطلوبالوصف
modelIdسلسلة نصيةنعممعرف النموذج المراد نشره
nameسلسلة نصيةنعماسم النشر
regionسلسلة نصيةنعممنطقة النشر
resourcesكائنلاتكوين الموارد (cpu، ذاكرة Gi، الحد الأدنى من الحالات، الحد الأقصى من الحالات)

ينشئ نقطة نهاية استدلال مخصصة في المنطقة المحددة. يمكن الوصول إلى نقطة النهاية عالميًا عبر عنوان URL فريد.

اختيار المنطقة

اختر منطقة قريبة من المستخدمين للحصول على أقل زمن انتقال. تعرض واجهة المستخدم للمنصة تقديرات زمن الانتقال لجميع المناطق الـ 43 المتاحة.

الحصول على عملية نشر

GET /api/deployments/{deploymentId}

حذف عملية النشر

DELETE /api/deployments/{deploymentId}

بدء عملية النشر

POST /api/deployments/{deploymentId}/start

استئناف النشر المتوقف.

إيقاف عملية النشر

POST /api/deployments/{deploymentId}/stop

إيقاف النشر قيد التشغيل مؤقتًا (إيقاف الفوترة).

فحص السلامة

GET /api/deployments/{deploymentId}/health

إرجاع حالة صحة نقطة نهاية النشر.

تشغيل الاستدلال عند النشر

POST /api/deployments/{deploymentId}/predict

إرسال صورة مباشرة إلى نقطة نهاية النشر للاستدلال. وظيفياً، هذا مكافئ لتنبؤ النموذج، ولكن يتم توجيهه عبر نقطة النهاية المخصصة لزمن انتقال أقل.

نموذج متعدد الأجزاء:

الحقلالنوعالوصف
fileملفملف صورة (JPEG، PNG، WebP)
confعائمعتبة الثقة (الافتراضية: 0.25)
iouعائمIoU (الافتراضية: 0.7)
imgszعدد صحيححجم الصورة بالبكسل (الافتراضي: 640)

الحصول على المقاييس

GET /api/deployments/{deploymentId}/metrics

يعرض عدد الطلبات المرتجعة ومقاييس زمن الاستجابة ومعدل الأخطاء مع بيانات sparkline.

معلمات الاستعلام:

المعلمةالنوعالوصف
rangeسلسلة نصيةالنطاق الزمني: 1h, 6h, 24h (افتراضي)، 7d, 30d
sparklineسلسلة نصيةاضبط على true للحصول على بيانات خطية مصغرة محسّنة لعرض لوحة المعلومات

الحصول على السجلات

GET /api/deployments/{deploymentId}/logs

معلمات الاستعلام:

المعلمةالنوعالوصف
severityسلسلة نصيةمرشح مفصول بفواصل: DEBUG, INFO, WARNING, ERROR, CRITICAL
limitعدد صحيحعدد الإدخالات (الافتراضي: 50، الحد الأقصى: 200)
pageTokenسلسلة نصيةرمز ترقيم الصفحات من الاستجابة السابقة

واجهة برمجة التطبيقات للمراقبة

المقاييس المجمعة

GET /api/monitoring

يعرض المقاييس المجمعة عبر جميع عمليات النشر الخاصة بالمستخدمين: إجمالي الطلبات، وعمليات النشر النشطة، ومعدل الأخطاء، ومتوسط زمن الاستجابة.


واجهة برمجة تطبيقات التصدير

تحويل النماذج إلى تنسيقات محسّنة للنشر على الحافة.

سرد عمليات التصدير

GET /api/exports

معلمات الاستعلام:

المعلمةالنوعالوصف
modelIdسلسلة نصيةرقم الطراز (مطلوب)
statusسلسلة نصيةتصفية حسب الحالة
limitعدد صحيحالنتائج القصوى (الافتراضي: 20، الحد الأقصى: 100)

إنشاء عملية تصدير

POST /api/exports

الجسم:

الحقلالنوعمطلوبالوصف
modelIdسلسلة نصيةنعممعرف نموذج المصدر
formatسلسلة نصيةنعمتنسيق التصدير (انظر الجدول أدناه)
gpuTypeسلسلة نصيةمشروطمطلوب عند format هو engine (TensorRT)
argsكائنلاتصدير الحجج (imgsz, half, dynamic، إلخ)
curl -X POST \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"modelId": "MODEL_ID", "format": "onnx"}' \
  https://platform.ultralytics.com/api/exports
resp = requests.post(
    "https://platform.ultralytics.com/api/exports",
    headers={"Authorization": f"Bearer {API_KEY}"},
    json={"modelId": "MODEL_ID", "format": "onnx"},
)
export_id = resp.json()["exportId"]

التنسيقات المدعومة:

التنسيقالقيمةحالة الاستخدام
ONNXonnxالاستدلال عبر المنصات
TorchScripttorchscriptنشر PyTorch
OpenVINOopenvinoIntel
TensorRTengineGPU الرسومات NVIDIA
CoreMLcoremlأجهزة Apple
TFLitetfliteالمحمول والمدمج
TF SavedModelsaved_modelTensorFlow
TF GraphDefpbرسم بياني TensorFlow
PaddlePaddlepaddleبايدو PaddlePaddle
NCNNncnnشبكة عصبية متنقلة
Edge TPUedgetpuأجهزة Google
TF.jstfjsاستنتاج المتصفح
MNNmnnاستنتاجات أليبابا للهواتف المحمولة
RKNNrknnوحدة المعالجة العصبية Rockchip
IMXimxمستشعر Sony IMX500
Axeleraaxeleraمسرعات Axelera AI
ExecuTorchexecutorchوقت تشغيل Meta ExecuTorch

الحصول على حالة التصدير

GET /api/exports/{exportId}

إلغاء التصدير

DELETE /api/exports/{exportId}

تتبع التصدير تنزيل

POST /api/exports/{exportId}/track-download

واجهة برمجة تطبيقات النشاط

track وإدارة أحداث النشاط لحسابك.

سرد النشاط

GET /api/activity

معلمات الاستعلام:

المعلمةالنوعالوصف
limitعدد صحيححجم الصفحة (الافتراضي: 20، الحد الأقصى: 100)
pageعدد صحيحرقم الصفحة (افتراضي: 1)
archivedقيمة منطقيةtrue لعلامة التبويب "الأرشيف"، false لصندوق الوارد
searchسلسلة نصيةالبحث غير الحساس لحالة الأحرف في حقول الأحداث

وضع علامة على الأحداث المشاهدة

POST /api/activity/mark-seen

الجسم:

{
    "all": true
}

أو تمرير معرفات محددة:

{
    "eventIds": ["EVENT_ID_1", "EVENT_ID_2"]
}

أرشفة الأحداث

POST /api/activity/archive

الجسم:

{
    "all": true,
    "archive": true
}

أو تمرير معرفات محددة:

{
    "eventIds": ["EVENT_ID_1", "EVENT_ID_2"],
    "archive": false
}

واجهة برمجة تطبيقات سلة المهملات

إدارة الموارد المحذوفة مؤقتًا (احتفاظ لمدة 30 يومًا).

عرض سلة المهملات

GET /api/trash

معلمات الاستعلام:

المعلمةالنوعالوصف
typeسلسلة نصيةمرشح: all, project, dataset, model
pageعدد صحيحرقم الصفحة (افتراضي: 1)
limitعدد صحيحالعناصر في كل صفحة (الافتراضي: 50، الحد الأقصى: 200)
ownerسلسلة نصيةاسم المستخدم لمالك مساحة العمل

استعادة عنصر

POST /api/trash

الجسم:

{
    "id": "item_abc123",
    "type": "dataset"
}

حذف العنصر نهائياً

DELETE /api/trash

الجسم:

{
    "id": "item_abc123",
    "type": "dataset"
}

لا رجعة فيه

لا يمكن التراجع عن الحذف الدائم. سيتم إزالة المورد وجميع البيانات المرتبطة به.

إفراغ سلة المهملات

DELETE /api/trash/empty

يحذف جميع العناصر الموجودة في سلة المهملات بشكل دائم.


واجهة برمجة تطبيقات الفواتير

إدارة الائتمانات والاشتراكات وطرق الدفع.

وحدات العملة

تستخدم مبالغ الفواتير السنتات (creditsCents) حيث 100 = $1.00.

الحصول على الرصيد

GET /api/billing/balance

معلمات الاستعلام:

المعلمةالنوعالوصف
ownerسلسلة نصيةاسم المستخدم لمالك مساحة العمل

الاستجابة:

{
    "creditsCents": 2500,
    "plan": "free",
    "cashBalance": 25,
    "creditBalance": 0,
    "reservedAmount": 0,
    "totalBalance": 25
}

الحصول على ملخص الاستخدام

GET /api/billing/usage-summary

يعرض تفاصيل الخطة والحدود ومقاييس الاستخدام.

الحصول على المعاملات

GET /api/billing/transactions

يعرض سجل المعاملات (الأحدث أولاً).

معلمات الاستعلام:

المعلمةالنوعالوصف
ownerسلسلة نصيةاسم المستخدم لمالك مساحة العمل

إنشاء جلسة إتمام الدفع

POST /api/billing/checkout-session

الجسم:

{
    "amount": 25,
    "owner": "team-username"
}
الحقلالنوعمطلوبالوصف
amountرقمنعمالمبلغ بالدولار (5-1000 دولار)
ownerسلسلة نصيةلااسم المستخدم الخاص بالفريق لإعادة تعبئة رصيد مساحة العمل (يتطلب دور المسؤول)

ينشئ جلسة دفع لشراء بالائتمان.

إنشاء إتمام دفع الاشتراك

POST /api/billing/subscription-checkout

ينشئ جلسة دفع لترقية الاشتراك في Pro.

الجسم:

{
    "planId": "pro",
    "billingCycle": "monthly",
    "owner": "team-username"
}
الحقلالنوعمطلوبالوصف
planIdسلسلة نصيةنعمخطط للاشتراك في (pro)
billingCycleسلسلة نصيةلادورة الفوترة: monthly (افتراضي) أو yearly
ownerسلسلة نصيةلااسم المستخدم الخاص بالفريق لترقية مساحة العمل (يتطلب دور المسؤول)

إنشاء جلسة بوابة

POST /api/billing/portal-session

يعيد عنوان URL إلى بوابة الفوترة لإدارة الاشتراك.

التعبئة التلقائية

إضافة رصيد تلقائيًا عندما ينخفض الرصيد عن الحد الأدنى.

الحصول على تكوين إعادة التعبئة التلقائية

GET /api/billing/auto-topup

معلمات الاستعلام:

المعلمةالنوعالوصف
ownerسلسلة نصيةاسم المستخدم لمالك مساحة العمل

تحديث إعدادات التعبئة التلقائية

PATCH /api/billing/auto-topup

الجسم:

{
    "enabled": true,
    "thresholdCents": 500,
    "amountCents": 2500
}

طرق الدفع

قائمة طرق الدفع

GET /api/billing/payment-methods

إنشاء نية الإعداد

POST /api/billing/payment-methods/setup

إرجاع سر العميل لإضافة طريقة دفع جديدة.

تعيين طريقة الدفع الافتراضية

POST /api/billing/payment-methods/default

الجسم:

{
    "paymentMethodId": "pm_123"
}

تحديث معلومات الفوترة

PATCH /api/billing/payment-methods

الجسم:

{
    "name": "Jane Doe",
    "address": {
        "line1": "123 Main St",
        "city": "San Francisco",
        "state": "CA",
        "postal_code": "94105",
        "country": "US"
    }
}

حذف طريقة الدفع

DELETE /api/billing/payment-methods/{id}

واجهة برمجة تطبيقات التخزين

الحصول على معلومات التخزين

GET /api/storage

الاستجابة:

{
    "tier": "free",
    "usage": {
        "storage": {
            "current": 1073741824,
            "limit": 107374182400,
            "percent": 1.0
        }
    },
    "region": "us",
    "username": "johndoe",
    "updatedAt": "2024-01-15T10:00:00Z",
    "breakdown": {
        "byCategory": {
            "datasets": { "bytes": 536870912, "count": 2 },
            "models": { "bytes": 268435456, "count": 4 },
            "exports": { "bytes": 268435456, "count": 3 }
        },
        "topItems": [
            {
                "_id": "dataset_abc123",
                "name": "my-dataset",
                "slug": "my-dataset",
                "sizeBytes": 536870912,
                "type": "dataset"
            },
            {
                "_id": "model_def456",
                "name": "experiment-1",
                "slug": "experiment-1",
                "sizeBytes": 134217728,
                "type": "model",
                "parentName": "My Project",
                "parentSlug": "my-project"
            }
        ]
    }
}

إعادة حساب السعة التخزينية

POST /api/storage

يؤدي إلى إعادة حساب استخدام التخزين.


تحميل واجهة برمجة التطبيقات

تستخدم عمليات تحميل الملفات المباشرة تدفق URL الموقع بخطوتين.

احصل على عنوان URL للتحميل الموقع

POST /api/upload/signed-url

اطلب عنوان URL موقّع لتحميل ملف مباشرة إلى التخزين السحابي. يتجاوز عنوان URL الموقّع خادم API لنقل الملفات الكبيرة.

الجسم:

{
    "assetType": "images",
    "assetId": "abc123",
    "filename": "my-image.jpg",
    "contentType": "image/jpeg",
    "totalBytes": 5242880
}
الحقلالنوعالوصف
assetTypeسلسلة نصيةنوع الأصل: models, datasets, images, videos
assetIdسلسلة نصيةمعرف الأصل المستهدف
filenameسلسلة نصيةاسم الملف الأصلي
contentTypeسلسلة نصيةنوع MIME
totalBytesعدد صحيححجم الملف بالبايت

الاستجابة:

{
    "sessionId": "session_abc123",
    "uploadUrl": "https://storage.example.com/...",
    "objectPath": "images/abc123/my-image.jpg",
    "downloadUrl": "https://cdn.example.com/...",
    "expiresAt": "2026-02-22T12:00:00Z"
}

تحميل كامل

POST /api/upload/complete

أخبر المنصة بأن تحميل الملف قد اكتمل حتى تبدأ في معالجته.

الجسم:

{
    "datasetId": "abc123",
    "objectPath": "datasets/abc123/images/my-image.jpg",
    "filename": "my-image.jpg",
    "contentType": "image/jpeg",
    "size": 5242880
}

واجهة برمجة تطبيقات مفاتيح API

عرض مفاتيح API

GET /api/api-keys

إنشاء مفتاح API

POST /api/api-keys

الجسم:

{
    "name": "training-server"
}

حذف مفتاح API

DELETE /api/api-keys

معلمات الاستعلام:

المعلمةالنوعالوصف
keyIdسلسلة نصيةمعرف مفتاح API المطلوب إلغاؤه

مثال:

curl -X DELETE \
  -H "Authorization: Bearer $API_KEY" \
  "https://platform.ultralytics.com/api/api-keys?keyId=KEY_ID"

واجهة برمجة التطبيقات للفرق والأعضاء

إدارة التعاون في مساحة العمل مع الفرق والأعضاء والدعوات.

قائمة الفرق

GET /api/teams

إنشاء فريق

POST /api/teams/create

الجسم:

{
    "username": "my-team",
    "fullName": "My Team"
}

قائمة الأعضاء

GET /api/members

يعرض أعضاء مساحة العمل الحالية.

دعوة عضو

POST /api/members

الجسم:

{
    "email": "user@example.com",
    "role": "editor"
}

أدوار الأعضاء

الدورالصلاحيات
viewerوصول للقراءة فقط إلى موارد مساحة العمل
editorإنشاء الموارد وتحريرها وحذفها
adminوصول كامل بما في ذلك إدارة الأعضاء

انظر Teams للحصول على تفاصيل الدور في واجهة المستخدم.

تحديث دور العضو

PATCH /api/members/{userId}

إزالة عضو

DELETE /api/members/{userId}

نقل الملكية

POST /api/members/transfer-ownership

دعوات

قبول الدعوة

POST /api/invites/accept

احصل على معلومات الدعوة

GET /api/invites/info

معلمات الاستعلام:

المعلمةالنوعالوصف
tokenسلسلة نصيةرمز الدعوة

إلغاء الدعوة

DELETE /api/invites/{inviteId}

إعادة إرسال الدعوة

POST /api/invites/{inviteId}/resend

استكشف واجهة برمجة التطبيقات

البحث في المحتوى العام

GET /api/explore/search

معلمات الاستعلام:

المعلمةالنوعالوصف
qسلسلة نصيةاستعلام البحث
typeسلسلة نصيةنوع المورد: all (افتراضي)، projects, datasets
sortسلسلة نصيةترتيب الفرز: stars (افتراضي)، newest, oldest, name-asc, name-desc, count-desc, count-asc
offsetعدد صحيحإزاحة ترقيم الصفحات (الافتراضي: 0). تعرض النتائج 20 عنصرًا في كل صفحة.
GET /api/explore/sidebar

يعرض محتوى مختارًا للشريط الجانبي "استكشاف".


واجهات برمجة التطبيقات الخاصة بالمستخدم والإعدادات

الحصول على المستخدم حسب اسم المستخدم

GET /api/users

معلمات الاستعلام:

المعلمةالنوعالوصف
usernameسلسلة نصيةاسم المستخدم المطلوب البحث عنه

متابعة أو إلغاء متابعة المستخدم

PATCH /api/users

الجسم:

{
    "username": "target-user",
    "followed": true
}

تحقق من توفر اسم المستخدم

GET /api/username/check

معلمات الاستعلام:

المعلمةالنوعالوصف
usernameسلسلة نصيةاسم المستخدم للتحقق
suggestمنطقياختياري: true لتضمين اقتراح إذا تم أخذه

الإعدادات

GET /api/settings
POST /api/settings

الحصول على إعدادات ملف تعريف المستخدم أو تحديثها (الاسم المعروض، السيرة الذاتية، الروابط الاجتماعية، إلخ).

أيقونة الملف الشخصي

POST /api/settings/icon
DELETE /api/settings/icon

تحميل أو إزالة الصورة الشخصية للملف الشخصي.

التأهيل

POST /api/onboarding

إكمال عملية التسجيل (تعيين منطقة البيانات واسم المستخدم).


واجهة برمجة تطبيقات GDPR

نقاط نهاية الامتثال للائحة العامة لحماية البيانات (GDPR) لتصدير البيانات وحذفها.

احصل على حالة وظيفة GDPR

GET /api/gdpr

معلمات الاستعلام:

المعلمةالنوعالوصف
jobIdسلسلة نصيةرقم الوظيفة GDPR للتحقق

يعرض حالة المهمة. بالنسبة لمهام التصدير المكتملة، تتضمن الاستجابة downloadUrl.

بدء التصدير أو حذف التدفق

POST /api/gdpr

الجسم:

{
    "action": "export"
}
{
    "action": "delete",
    "confirmationWord": "DELETE"
}

اختياري لمساحات عمل الفريق:

{
    "action": "delete",
    "confirmationWord": "DELETE",
    "teamUsername": "my-team"
}

إجراء لا رجعة فيه

حذف الحساب دائم ولا يمكن التراجع عنه. سيتم حذف جميع البيانات والنماذج وعمليات النشر.


رموز الأخطاء

الرمزحالة HTTPالوصف
UNAUTHORIZED401مفتاح API غير صالح أو مفقود
FORBIDDEN403أذونات غير كافية
NOT_FOUND404المورد غير موجود
VALIDATION_ERROR400بيانات الطلب غير صالحة
RATE_LIMITED429عدد كبير جداً من الطلبات
INTERNAL_ERROR500خطأ في الخادم

Python

لتسهيل عملية التكامل، استخدمPython Ultralytics Python التي تتولى المصادقة والتحميل وتدفق المقاييس في الوقت الفعلي تلقائيًا.

التثبيت والإعداد

pip install ultralytics

تحقق من التثبيت:

yolo check

متطلبات إصدار الحزمة

يتطلب تكامل المنصة ultralytics>=8.4.14. الإصدارات الأقدم لن تعمل مع المنصة.

المصادقة

yolo settings api_key=YOUR_API_KEY
export ULTRALYTICS_API_KEY=YOUR_API_KEY
from ultralytics import settings

settings.api_key = "YOUR_API_KEY"

استخدام مجموعات بيانات المنصة

مجموعات البيانات المرجعية مع ul:// URIs:

from ultralytics import YOLO

model = YOLO("yolo11n.pt")

# Train on your Platform dataset
model.train(
    data="ul://your-username/your-dataset",
    epochs=100,
    imgsz=640,
)

تنسيق URI:

النمطالوصف
ul://username/datasets/slugمجموعة البيانات
ul://username/project-nameالمشروع
ul://username/project/model-nameنموذج محدد
ul://ultralytics/yolo26/yolo26nالنموذج الرسمي

الدفع إلى المنصة

إرسال النتائج إلى مشروع منصة:

from ultralytics import YOLO

model = YOLO("yolo11n.pt")

# Results automatically sync to Platform
model.train(
    data="coco8.yaml",
    epochs=100,
    project="ul://your-username/my-project",
    name="experiment-1",
)

ما الذي يتزامن:

  • مقاييس التدريب (في الوقت الفعلي)
  • أوزان النموذج النهائي
  • مخططات التحقق
  • إخراج وحدة التحكم
  • مقاييس النظام

أمثلة على واجهة برمجة التطبيقات

تحميل نموذج من المنصة:

# Your own model
model = YOLO("ul://username/project/model-name")

# Official model
model = YOLO("ul://ultralytics/yolo26/yolo26n")

تشغيل الاستدلال:

results = model("image.jpg")

# Access results
for r in results:
    boxes = r.boxes  # Detection boxes
    masks = r.masks  # Segmentation masks
    keypoints = r.keypoints  # Pose keypoints
    probs = r.probs  # Classification probabilities

نموذج التصدير:

# Export to ONNX
model.export(format="onnx", imgsz=640, half=True)

# Export to TensorRT
model.export(format="engine", imgsz=640, half=True)

# Export to CoreML
model.export(format="coreml", imgsz=640)

التحقق من الصحة:

metrics = model.val(data="ul://username/my-dataset")

print(f"mAP50: {metrics.box.map50}")
print(f"mAP50-95: {metrics.box.map}")

Webhooks

تقوم Webhooks بإخطار الخادم الخاص بك بأحداث المنصة عبر استدعاءات HTTP POST:

الحدثالوصف
training.startedبدء مهمة التدريب
training.epochاكتمل العصر
training.completedاكتمل التدريب
training.failedفشل التدريب
export.completedالتصدير جاهز

ميزة المؤسسة

نقاط نهاية webhook المخصصة متاحة في خطط Enterprise. تعمل webhooks التدريبية لـ Python تلقائيًا في جميع الخطط.


الأسئلة الشائعة

كيف يمكنني تقسيم النتائج الكبيرة إلى صفحات؟

تستخدم معظم نقاط النهاية limit المعلمة للتحكم في عدد النتائج التي يتم إرجاعها لكل طلب:

curl -H "Authorization: Bearer $API_KEY" \
  "https://platform.ultralytics.com/api/datasets?limit=50"

تدعم نقاط النهاية Activity و Trash أيضًا page معلمة للترقيم الصفحي القائم على الصفحات:

curl -H "Authorization: Bearer $API_KEY" \
  "https://platform.ultralytics.com/api/activity?page=2&limit=20"

تستخدم نقطة نهاية البحث Explore Search offset بدلاً من page، مع حجم صفحة ثابت يبلغ 20:

curl "https://platform.ultralytics.com/api/explore/search?type=datasets&offset=20&sort=stars"

هل يمكنني استخدام واجهة برمجة التطبيقات (API) بدون حزمة تطوير البرامج (SDK)؟

نعم، جميع الوظائف متاحة عبر REST. Python عبارة عن غلاف ملائم يضيف ميزات مثل البث المباشر للمقاييس وتحميل النماذج تلقائيًا.

هل توجد مكتبات عميل لواجهة برمجة التطبيقات (API)؟

حاليًا، استخدم حزمة Ultralytics python أو قم بإجراء طلبات HTTP مباشرة. يجري التخطيط لمكتبات عميل رسمية للغات أخرى.

كيف أتعامل مع قيود المعدل؟

استخدم Retry-After رأس من الاستجابة 429 للانتظار المدة المناسبة:

import time

import requests


def api_request_with_retry(url, headers, max_retries=3):
    for attempt in range(max_retries):
        response = requests.get(url, headers=headers)
        if response.status_code != 429:
            return response
        wait = int(response.headers.get("Retry-After", 2**attempt))
        time.sleep(wait)
    raise Exception("Rate limit exceeded")

كيف يمكنني العثور على معرف النموذج أو مجموعة البيانات الخاصة بي؟

يتم إرجاع معرفات الموارد عند إنشاء الموارد عبر واجهة برمجة التطبيقات. يمكنك أيضًا العثور عليها في عنوان URL الخاص بالمنصة:

https://platform.ultralytics.com/username/project/model-name
                                  ^^^^^^^^ ^^^^^^^ ^^^^^^^^^^
                                  username project   model

استخدم نقاط نهاية القائمة للبحث حسب الاسم أو التصفية حسب المشروع.



📅 تم الإنشاء قبل 1 شهر ✏️ تم التحديث قبل 5 أيام
glenn-jochersergiuwaxmannLaughing-q

تعليقات