توثيق API
واجهة REST API لتفريغ الصوت والفيديو. يستخدم العملاء المدفوعون مفتاح API يتم إنشاؤه من إعدادات الحساب لتوثيق التكاملات الخارجية.
عنوان URL الأساسي
https://scribe.uustudio.cc
المصادقة
يجب أن ترسل التكاملات الخارجية مفتاح API لحساب مدفوع في رأس Authorization.
رأس Authorization
Authorization: Bearer {token}أنشئ المفاتيح وألغها من صفحة مفاتيح API في الإعدادات. نقاط مصادقة التطبيق مخصصة للعملاء الرسميين فقط.
استجابات الخطأ
ترجع جميع الأخطاء جسم JSON مع حقل message .
خطأ قياسي
{
"message": "Description of the error"
}خطأ في التحقق (422)
{
"message": "The name field is required.",
"errors": {
"name": ["The name field is required."]
}
}| الحالة | الوصف |
|---|---|
| 401 | غير مصادق (التوكن مفقود أو غير صالح) |
| 403 | محظور أو تجاوز حد الخطة |
| 404 | المورد غير موجود |
| 422 | فشل التحقق |
| 429 | محدود المعدل أو عدد كبير جداً من المهام المتزامنة |
| 500 | خطأ في الخادم الداخلي |
حدود المعدل
نقاط نهاية API المصادق عليها محدودة بـ 10 طلبات في الدقيقة لكل توكن.
حدود الاستخدام
توفر API
واجهة REST API الخارجية غير متاحة في الخطة المجانية. قم بالترقية إلى Pro أو Max، أو اشترِ باقة الدفع حسب الاستخدام، لإنشاء مفاتيح API واستخدامها.
- الحد الأقصى لحجم الملف
- 2 GB
- المهام المتزامنة
- الحد الأقصى 3
- الحد الأقصى لإعادة المحاولة لكل مهمة
- 3
مقارنة الخطط المدفوعة
| الميزة | Pay as you go | Pro | Max |
|---|---|---|---|
| الرفع اليومي | غير محدود | غير محدود | غير محدود |
| صيغ التصدير | الكل | الكل | الكل |
| أولوية المهمة | متوسطة | متوسطة | عالية |
سير العمل
رفع ملف صوتي/مرئي
POST /api/uploads/sign→ الحصول على upload_id ومعلومات الجزءPUT {presigned_url}→ رفع كل جزء إلى التخزينPOST /api/uploads/complete→ إنهاء الرفع، إنشاء تلقائي للمهمةGET /api/tasks/{id}→ استطلاع الحالة (pending -> scribing -> finished)GET /api/tasks/{id}/download/srt→ تصدير (اختياري)
إنشاء مهمة يدوياً
POST /api/tasks→ إنشاء بـ disk و path و nameGET /api/tasks/{id}→ استطلاع الحالةGET /api/tasks/{id}→ الحصول على segments و summary و mindmap
المصادقة
/api/loginالمصادقة بالبريد الإلكتروني وكلمة المرور. يرجع توكن Sanctum.
جسم الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
| string | Yes | بريد المستخدم الإلكتروني (الحد الأقصى 255) | |
| password | string | Yes | كلمة مرور المستخدم |
الاستجابة 200
{
"token": "1|abc123...",
"user": {
"id": 1,
"name": "Zhang San",
"email": "[email protected]"
}
}محدود بـ 5 محاولات في الدقيقة لكل بريد إلكتروني.
/api/registerإنشاء حساب جديد. يرجع توكن Sanctum.
جسم الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
| name | string | Yes | اسم العرض (الحد الأقصى 255) |
| string | Yes | بريد إلكتروني فريد (الحد الأقصى 255) | |
| password | string | Yes | يجب التأكيد |
| password_confirmation | string | Yes | تأكيد كلمة المرور |
الاستجابة 201
{
"token": "1|abc123...",
"user": {
"id": 1,
"name": "Zhang San",
"email": "[email protected]"
}
}/api/logoutإلغاء توكن الوصول الحالي.
الاستجابة 204
لا يرجع جسماً.
المهام
/api/tasksإنشاء مهمة تفريغ. الحد الأقصى 3 مهام متزامنة لكل مستخدم.
جسم الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
| disk | string | Yes | r2 / remote / youtube معرف مصدر التخزين |
| name | string | Yes | اسم المهمة (الحد الأقصى 255) |
| path | string | Yes | مسار الملف أو عنوان URL المصدر |
| file | string | No | اسم الملف الأصلي (الحد الأقصى 255) |
| size | integer | No | حجم الملف بالبايت |
| duration | integer | No | المدة بالثواني |
| cost | integer | No | التكلفة بالثواني |
| segments | array | No | مقاطع التفريغ |
| speaker_diarization | boolean | لا | app.tasks.speaker_diarization_api_description |
الاستجابة 201
{
"id": 1,
"name": "Meeting Recording",
"status": "pending",
"speaker_diarization": true,
"created_at": "2026-03-02T10:30:00+08:00"
}الأخطاء
| الحالة | الوصف |
|---|---|
| 403 | لا يمكن للمستخدمين المجانيين إرسال روابط YouTube عبر API. |
| 429 | تم الوصول إلى الحد الأقصى للمهام المتزامنة (3) |
/api/tasks/{id}الحصول على تفاصيل المهمة الكاملة بما في ذلك نتائج التفريغ.
الاستجابة
{
"id": 1,
"name": "Meeting Recording",
"file": "meeting.mp3",
"path": "2026-03-02/01HQX...mp3",
"disk": "r2",
"size": 50545869,
"duration": 1965,
"cost": 33,
"status": "finished",
"attempts": 1,
"quality": 3,
"created_at": "2026-03-02T10:30:00+08:00",
"updated_at": "2026-03-02T10:45:00+08:00",
"summary": "The meeting discussed three topics...",
"mindmap": "# Topic\n## Sub-topic 1",
"folder": "Work",
"tags": ["Work"],
"url": "https://youtube.com/watch?v=...",
"segments": [
{
"id": 1,
"start": 0,
"end": 5000,
"speaker": "Speaker 1",
"tokens": ["Okay", "so let's", "begin"],
"text": "Okay, so let's begin..."
}
],
"export": {
"allowed_formats": ["txt", "srt", "vtt", "csv", "pdf", "docx"],
"heavy_formats": ["pdf", "docx"],
"version": "20260302104500"
}
}حقول الاستجابة
| الحقل | النوع | الوصف |
|---|---|---|
| disk | string|null | قرص التخزين: r2 / remote / youtube |
| size | int|null | حجم الملف بالبايت |
| cost | int|null | التكلفة بالثواني |
| attempts | int | عدد إعادة المحاولات |
| quality | int|null | درجة الجودة (0-5) |
| summary | string|null | ملخص مولّد بالذكاء الاصطناعي |
| mindmap | string|null | خريطة ذهنية مولّدة بالذكاء الاصطناعي |
| folder | string|null | اسم أول وسم (المجلد) |
| tags | array | جميع أسماء الوسوم |
| url | string|null | عنوان URL المصدر (لمهام YouTube) |
| segments | array|null | مقاطع التفريغ |
| segments[].start | int | وقت البدء (مللي ثانية) |
| segments[].end | int | وقت الانتهاء (مللي ثانية) |
| segments[].text | string | نص المقطع |
| segments[].speaker | string|null | معرف المتحدث |
| segments[].tokens | array|null | مصفوفة رموز الكلمات |
| export | object | البيانات الوصفية للتصدير (allowed_formats و heavy_formats و version) |
/api/tasksمعاملات الاستعلام
| المعامل | النوع | الافتراضي | الوصف |
|---|---|---|---|
| status | string | all | تصفية حسب الحالة |
| search | string | — | البحث بالاسم |
| folder | string | — | تصفية حسب المجلد (أو Uncategorized) |
| page | int | 1 | رقم الصفحة |
| per_page | int | 25 | العناصر لكل صفحة (الحد الأقصى 100) |
الاستجابة
{
"data": [
{
"id": 1,
"name": "Meeting Recording",
"file": "meeting.mp3",
"disk": "r2",
"size": 50545869,
"duration": 1965,
"cost": 33,
"status": "finished",
"attempts": 1,
"quality": 3,
"folder": "Work",
"created_at": "2026-03-02T10:30:00+08:00"
}
],
"current_page": 1,
"last_page": 1,
"per_page": 25,
"total": 1
}/api/tasks/{id}/retryإعادة محاولة مهمة فاشلة. يضبط الحالة على pending (R2) أو waiting (remote/YouTube). الحد الأقصى 3 محاولات.
الاستجابة 200
{
"id": 1,
"status": "pending",
"attempts": 2
}/api/tasks/{id}/download/{format}تصدير التفريغ. الصيغ الخفيفة ترجع الملف مباشرة. الصيغ الثقيلة (pdf/docx) قد ترجع 202 أثناء المعالجة.
معاملات المسار
| المعامل | الوصف |
|---|---|
| format | txt / srt / vtt / csv / pdf / docx |
الاستجابات
200 - الملف جاهز (صيغ خفيفة)
يرجع ملفاً ثنائياً.
200 - الملف جاهز (صيغ ثقيلة، طلب JSON)
{
"status": "ready",
"url": "https://scribe.uustudio.cc/api/tasks/1/download/pdf"
}202 - جاري معالجة الصيغة الثقيلة
{
"status": "processing",
"message": "Your export is being generated. Please try again shortly."
}/api/tasks/{id}/audioتدفق ملف الصوت أو الفيديو الأصلي مباشرة من التخزين (R2 فقط).
الاستجابة
200 - دفق ثنائي لملف الصوت أو الفيديو. يرجع 404 إذا كان الملف مفقوداً أو غير مخزن على قرص R2.
/api/tasks/{id}/refresh-summaryتحديث وإرجاع أحدث ملخص وخريطة ذهنية مولّدَين بالذكاء الاصطناعي.
الاستجابة
{
"summary": "The meeting discussed three topics...",
"mindmap": "# Topic\n## Sub-topic 1"
}/api/tasks/{id}تحديث حقول المهمة. جميع الحقول اختيارية.
جسم الطلب
| الحقل | النوع | الوصف |
|---|---|---|
| name | string | الاسم الجديد (الحد الأقصى 255) |
| folder | string|null | اسم المجلد (null يزيل المهمة من مجلد) |
| duration | integer | المدة بالثواني |
| cost | integer | التكلفة بالثواني |
| segments | array | مصفوفة المقاطع الكاملة للاستبدال |
| text | string | نص التفريغ الكامل |
| quality | integer | درجة الجودة (0-5) |
| index | integer | فهرس ترتيب المهمة |
الاستجابة 200
يرجع كائن المهمة الكامل (نفس تفاصيل المهمة).
/api/tasks/{id}Response 200
{
"message": "Task deleted successfully"
}/api/tasks/bulkحذف مهام متعددة دفعة واحدة. سيتم حذف المهام التابعة للمستخدم المصادق عليه فقط. يتم تجاهل المعرفات التي لا تنتمي للمستخدم.
جسم الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
| ids | array | Yes | مصفوفة من معرّفات المهام للحذف (1 كحد أدنى) |
الاستجابة 200
{
"message": "2 task(s) deleted successfully",
"deleted_count": 2
}/api/tasks/bulk/moveنقل مهام متعددة إلى مجلد دفعة واحدة. سيتم نقل المهام التابعة للمستخدم المصادق عليه فقط.
جسم الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
| ids | array | Yes | مصفوفة من معرّفات المهام للنقل (1 كحد أدنى) |
| folder | string | Yes | اسم المجلد الهدف (الحد الأقصى 255) |
الاستجابة 200
{
"message": "2 task(s) moved to Work",
"moved_count": 2
}الرفع
الرفع متعدد الأجزاء/api/uploads/signجسم الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
| file | string | Yes | اسم الملف (يجب استخدام صيغة مدعومة) |
| content_type | string | Yes | نوع MIME (يجب أن يطابق امتداد الملف) |
| size | integer | Yes | حجم الملف بالبايت (الحد الأقصى 2,147,483,648 / 2 GB) |
| duration | integer | No | مدة الصوت بالثواني |
الاستجابة
{
"path": "2026-03-02/01HQX...mp3",
"upload_id": "abc123",
"part_size": 5242880,
"part_count": 10,
"expires_at": "2026-03-02T10:40:00+08:00"
}/api/uploads/sign-partجسم الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
| path | string | Yes | مسار الرفع (الحد الأقصى 2048) |
| upload_id | string | Yes | معرف الرفع (الحد الأقصى 2048) |
| part_number | integer | Yes | رقم الجزء (1-10000) |
الاستجابة
{
"url": "https://storage.example.com/...?X-Amz-...",
"headers": {
"Content-Type": "audio/mpeg"
}
}استخدم PUT مع عنوان URL والرؤوس المرجعة لرفع الجزء.
/api/uploads/completeإكمال رفع متعدد الأجزاء. ينشئ هذا مهمة تفريغ تلقائياً ويرجع 403 عندما تكون API غير متاحة أو يتم تجاوز حد الخطة.
جسم الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
| path | string | Yes | مسار الرفع (الحد الأقصى 2048) |
| upload_id | string | Yes | معرف الرفع (الحد الأقصى 2048) |
| original_name | string | Yes | اسم الملف الأصلي (يجب استخدام صيغة مدعومة) |
| content_type | string | Yes | نوع MIME (يجب أن يطابق امتداد الملف) |
| size | integer | Yes | حجم الملف بالبايت (الحد الأقصى 2 GB) |
| name | string | No | اسم المهمة (الافتراضي اسم الملف بدون امتداد) |
| duration | integer | No | المدة بالثواني (الحد الأدنى 1) |
| speaker_diarization | boolean | لا | app.tasks.speaker_diarization_api_description |
الاستجابة 201
{
"message": "File uploaded to the upload server successfully.",
"task": {
"id": 1,
"name": "meeting",
"path": "2026-03-02/01HQX...mp3",
"size": 50545869,
"status": "pending",
"speaker_diarization": true
}
}/api/uploads/abortجسم الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
| path | string | Yes | مسار الرفع (الحد الأقصى 2048) |
| upload_id | string | Yes | معرف الرفع (الحد الأقصى 2048) |
الاستجابة
{
"message": "Multipart upload cancelled successfully."
}المجلدات
مستند بالوسوم/api/foldersسرد جميع المجلدات مع أعداد المهام.
الاستجابة
{
"folders": [
{"id": 1, "name": "Work", "count": 5},
{"id": 2, "name": "Personal", "count": 3}
],
"uncategorized_count": 2,
"total_count": 10
}/api/foldersجسم الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
| name | string | Yes | اسم المجلد (الحد الأقصى 14 حرفاً / 7 أحرف صينية، فريد لكل مستخدم) |
الاستجابة 201
{
"id": 1,
"name": "Work"
}/api/folders/{name}جسم الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
| name | string | Yes | اسم المجلد الجديد (نفس قيود الإنشاء) |
الاستجابة 200
{
"id": 1,
"name": "New Name"
}/api/folders/{name}Response 200
{
"message": "Folder deleted successfully"
}المستخدم
/api/userالاستجابة
{
"id": 1,
"name": "Zhang San",
"email": "[email protected]",
"avatar": "https://...",
"balance": {
"used_seconds": 9000,
"remaining_seconds": 36000,
"allowance_remaining_seconds": 30000,
"top_up_remaining_seconds": 6000,
"total_seconds": 45000,
"usage_percent": 20
},
"subscription": {
"plan": "year",
"plan_key": "max_yearly",
"tier": "max",
"billing_interval": "yearly",
"active": true,
"access_tier": "max"
},
"queue": {
"pending_count": 1,
"running_count": 1,
"failed_count": 0
}
}حقول الرصيد
| الحقل | النوع | الوصف |
|---|---|---|
| used_seconds | int | الثواني المستخدمة منذ آخر منحة شهرية |
| remaining_seconds | int | الثواني المتبقية |
| total_seconds | int | إجمالي الثواني |
| usage_percent | int | نسبة الاستخدام (0-100) |
/api/userجسم الطلب
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
| name | string | No | اسم العرض (الحد الأقصى 255) |
| string | لا | البريد الإلكتروني الجديد (يجب أن يكون فريداً) | |
| avatar | file | No | ملف صورة (الحد الأقصى 5 MB) |
الاستجابة 200
{
"id": 1,
"name": "New Name",
"email": "[email protected]",
"avatar": "https://..."
}الإشعارات
/api/notificationsالحصول على آخر 10 إشعارات.
الاستجابة
[
{
"id": "abc123",
"title": "Task Completed",
"message": "Meeting Recording has been transcribed.",
"read_at": null,
"created_at": "2026-03-02T10:45:00+08:00"
}
]/api/notifications/mark-all-as-readتحديد جميع الإشعارات غير المقروءة كمقروءة.
Response 200
{
"success": true
}الدفع
/api/checkout/{plan}الحصول على رابط دفع Paddle لخطة اشتراك.
معاملات المسار
| المعامل | الوصف |
|---|---|
| plan | test / month / year |
الاستجابة
يرجع كائن خيارات الدفع من Paddle. يرجع 404 لخطة غير صالحة.
/api/healthنقطة نهاية فحص الصحة العامة. لا تتطلب مصادقة.
الاستجابة 200
{
"status": "ok"
}
/api/auth/social-loginالمصادقة عبر Google OAuth. ينشئ حساباً إذا لم يكن موجوداً.
جسم الطلب
googleالمزودون المدعومونالاستجابة 200