واجهة REST API
ارفع الملفات، أنشئ مجموعات، وادِر المشاركات عبر HTTP. جميع الردود بصيغة JSON؛ لا يلزم مفتاح API لعمليات الرفع المجهولة.
كيف يعمل الرفع
تعمل واجهة storage.to API على تشغيل سطر الأوامر (CLI) وتطبيق سطح المكتب وأداة رفع الويب وأي عميل تابع لجهة خارجية تريد بناؤه. تدفق الرفع على ثلاث خطوات:
PUT لإرسال بياناتك (bytes) مباشرةً إلى عناوين URL المُوقَّعة مسبقًا. لا تمر البيانات عبر خوادمنا.File ونزوّدك بعنوان URL قابلًا للمشاركة.جميع نقاط النهاية أدناه مرتبطة بهذا الأساس. مثال: POST /upload/init تعني POST https://storage.to/api/upload/init.
المصادقة
تعمل عمليات الرفع المجهولة دون مصادقة، ولكن بحدود صارمة. تقتصر الاستدعاءات بدون مفتاح على 50 ملفًا لكل 24 ساعة لكل جهاز أو عنوان IP، بالإضافة إلى حصص النطاق الترددي أدناه، وتنتهي صلاحية الملفات بعد 3 أيام.
المصادقة بحساب مجاني تتيح لك:
- لا يوجد حد يومي للملفات
- بدون حصة لنطاق الرفع
- عمليات الرفع المرتبطة بحسابك (تظهر في /dashboard)
- ميزات Premium (ملفات دائمة، مساحة تخزين أكبر)
- عمليات تعديل بناءً على الملكية (حذف، تعيين كلمة مرور، تغيير تاريخ الانتهاء) دون الحاجة إلى مطابقة visitor-token
نظرة سريعة على الحدود
expiry_daysexpiry_daysلا توجد حصص شهرية - جميع الحدود هي نوافذ متجددة مدتها 24 ساعة أو حدود في الدقيقة. الخطة المجانية ليس لها مساحة تخزين ثابتة: كل ملف تنتهي صلاحيته من تلقاء نفسه، فلا يتراكم شيء ضمن الحصة.
إثبات الملكية
/upload/init multipart، /upload/confirm، /file/reserve، /collection) تُرجع owner_token ضمن الاستجابة. الرمز هو إثبات ملكية مُوقّع مرتبط بهذا المورد تحديدًا، ومستقل عن عنوان IP أو رمز الزائر لديك. تعيش الرموز طالما أن المورد موجود، وهي آمنة للاحتفاظ بها ولا تنتهي بشكل مستقل. يعني فقدان الرمز فقدان السيطرة على ذلك المورد (الملف/المجموعة/الرفع) - تعامل معها مثل كلمات المرور المحلية.# أو، إلى جانب جلسة Bearer
X-Owner-Token: <token>
visitor_token. يقوم سطر الأوامر (CLI) بتخزينه في ~/.config/storageto/token (انظر مستندات CLI).بالنسبة لنقاط النهاية الخاصة بالعمليات (delete، set password، change expiry)، يتم تأكيد الملكية إذا إما كان رمز الزائر مطابقًا أو إذا جاءت الطلب من نفس عنوان IP الذي أنشأ الملف. يمكن أن يضيع كلاهما (حذف الكوكيز، تغييرات الشبكة). يُعدّ رمز المالك هو الدليل المفضل للمضي قدمًا.
الأخطاء
تتبع الأخطاء شكلًا ثابتًا: { "success": false, "error": "…" }
حدود المعدّل
جميع حدود المعدّل لكل عنوان IP. تتضمن استجابة 429 رؤوس Retry-After و X-RateLimit-Limit و X-RateLimit-Remaining القياسية.
حصة الرفع: لدى العملاء المجهولين حدّان يعملان بالتوازي - 100 جيجابايت / 24 ساعة لكل رمز الزائر (visitor token) و 500 جيجابايت / 24 ساعة لكل IP (حد IP يلتقط حركة المرور بدون رموز والشبكات المشتركة). عند تجاوز أي منهما ستحصل على 429 مع التفاصيل. هذا حدّ رفع فقط - التنزيلات غير محدودة وغير مُقيّدة.
رفع
8 نقاط نهايةتدفق الرفع من ثلاث خطوات لأي ملف، بما في ذلك الملفات التي تتجاوز 5 جيجابايت (يتم تلقائيًا تقسيمها إلى أجزاء multipart). إذا كنت تحتاج فقط إلى رفع سريع بأسلوب لقطة شاشة، فراجع ShareX بدلًا من ذلك.
ابدأ عملية رفع. للملفات >50 ميجابايت تكون الاستجابة رفعًا متعدد الأجزاء (حقل type: "multipart")؛ وإلا فسيكون PUT واحد مُوقّع مسبقًا.
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
filename | string · required | اسم الملف الأصلي. بحد أقصى 255 حرفًا. |
content_type | string · required | نوع MIME. |
size | integer · required | حجم الملف بالبايت. الحد الأدنى 1. |
curl -X POST https://storage.to/api/upload/init \ -H "Content-Type: application/json" \ -H "X-Visitor-Token: abc123" \ -d '{ "filename": "report.pdf", "content_type": "application/pdf", "size": 2202009 }'
{ "success": true, "type": "single", "upload_url": "https://r2.cloudflarestorage.com/...signed...", "headers": { "Host": ["..."] }, "r2_key": "uuid-abc123" }
{ "success": true, "type": "multipart", "upload_id": "01HXYZ...", "r2_key": "uuid-abc123", "part_size": 33554432, "total_parts": 4, "initial_urls": { "1": "https://...", "2": "https://..." }, "owner_token": "owner_v1_..." }
اطلب عناوين URL إضافية للأجزاء لرفع متعدد الأجزاء قيد التنفيذ. يُستخدم عندما تُرجع /init عناوين URL أقل مما لديك من أجزاء (أو كانت قد انتهت صلاحيتها).
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
upload_id | string · required | upload_id القادم من /init. |
part_numbers | array<int> · required | أرقام الأجزاء للحصول على عناوين URL لها. |
curl -X POST https://storage.to/api/upload/parts \ -H "Content-Type: application/json" \ -d '{ "upload_id": "01HXYZ...", "part_numbers": [3, 4] }'
{ "success": true, "part_urls": [ { "partNumber": 3, "url": "https://..." }, { "partNumber": 4, "url": "https://..." } ] }
أكمل رفع متعدد الأجزاء بمجرد رفع جميع الأجزاء.
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
upload_id | string · required | upload_id القادم من /init. |
parts | array · required | كل إدخال: { partNumber, etag } من استجابة رفع الجزء. |
curl -X POST https://storage.to/api/upload/complete-multipart \ -H "Content-Type: application/json" \ -d '{ "upload_id": "01HXYZ...", "parts": [ { "partNumber": 1, "etag": "\"abc...\"" }, { "partNumber": 2, "etag": "\"def...\"" } ] }'
{ "success": true }
ألغِ رفعًا متعدد الأجزاء ونظّف أي بيانات جزئية.
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
upload_id | string · required | الرفع الذي يجب إلغاؤه. |
curl -X POST https://storage.to/api/upload/abort \ -H "Content-Type: application/json" \ -d '{ "upload_id": "01HXYZ..." }'
أكد أن الرفع اكتمل. عندها ننشئ سجل File ونُرجع عنوان URL القابل للمشاركة.
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
filename | string · required | اسم الملف الأصلي. |
size | integer · required | حجم الملف بالبايت. |
content_type | string · required | نوع MIME. |
r2_key | string · required | r2_key القادم من /init. |
collection_id | string · optional | إرفاقه إلى مجموعة. |
crc32 | integer · optional | مجموع CRC32 للتحقق من سلامة البيانات. |
file_id | string(9) · optional | إتمام معرف ملف محجوز سابقًا. |
curl -X POST https://storage.to/api/upload/confirm \ -H "Content-Type: application/json" \ -H "X-Visitor-Token: abc123" \ -d '{ "filename": "report.pdf", "size": 2202009, "content_type": "application/pdf", "r2_key": "uuid-abc123" }'
{ "success": true, "file": { "id": "FQxyz1234", "url": "https://storage.to/FQxyz1234", "filename": "report.pdf", "size": 2202009, "human_size": "2.1 MB", "expires_at": "2026-04-15T12:00:00Z" }, "owner_token": "owner_v1_..." }
احجز معرف ملف وعنوان URL قابل للمشاركة قبل أن تصبح البيانات جاهزة. مفيد عندما تحتاج إلى مشاركة رابط أولًا ثم إتمام الرفع لاحقًا. ترتبط الملكية برمز الزائر + عنوان IP الخاصين بك. أنهِ الرفع لاحقًا باستخدام /upload/init + /upload/confirm، مع تمرير file_id للتأكيد.
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
filename | string · optional | اسم ملف بديل. القيمة الافتراضية هي "Pending". |
content_type | string · optional | نوع MIME بديل. |
curl -X POST https://storage.to/api/file/reserve \ -H "X-Visitor-Token: abc123"
{ "success": true, "file": { "id": "FQxyz1234", "url": "https://storage.to/FQxyz1234", "expires_at": "2026-04-12T18:00:00Z" }, "owner_token": "owner_v1_..." }
مكافئ الدفعات لـ /upload/init، مُحسّن لرافع الويب. يبدأ حتى 250 ملفًا في رحلة واحدة.
يُستخدم داخليًا بواسطة رافع الويب. يجب أن يفضّل معظم العملاء استخدام /upload/init لملف واحد.
مكافئ الدفعات لـ /upload/confirm. يؤكد رفع العديد من الملفات في رحلة واحدة.
المجموعات
9 نقاط نهايةتجمع المجموعة عدة ملفات تحت عنوان URL واحد للمشاركة (/c/{id}). حتى 10,000 ملف وبإجمالي 25 جيجابايت.
أنشئ مجموعة جديدة. أرفق الملفات لاحقًا عبر تمرير collection_id على /upload/confirm.
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
expected_file_count | integer · optional | تلميح لتعليم المجموعة تلقائيًا أنها جاهزة بمجرد تأكيد جميع الملفات المتوقعة. |
curl -X POST https://storage.to/api/collection \ -H "Content-Type: application/json" \ -H "X-Visitor-Token: abc123" \ -d '{ "expected_file_count": 3 }'
{ "success": true, "collection": { "id": "ABC123xyz", "url": "https://storage.to/c/ABC123xyz", "expires_at": "2026-04-15T12:00:00Z" }, "owner_token": "owner_v1_..." }
استعلم عن حالة المجموعة. كما يعلّم المجموعة تلقائيًا أنها جاهزة إذا تم تأكيد جميع الملفات المتوقعة.
curl https://storage.to/api/collection/ABC123xyz/status
{ "success": true, "files": [ /* file objects: id, url, filename, size, ... */ ], "is_uploading": false, "file_count": 3, "expected_file_count": 3, "total_size": 6291456, "human_total_size": "6 MB" }
علّم المجموعة على أنها جاهزة للتنزيل. هذا ليس مطلوبًا عادةً - تصبح المجموعات جاهزة تلقائيًا بمجرد الوصول إلى expected_file_count.
احذف مجموعة وجميع ملفاتها.
عيّن كلمة مرور للمجموعة. تتطلب 4–100 حرفًا.
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
password | string · required | 4–100 حرفًا. |
curl -X POST https://storage.to/api/collection/ABC123xyz/password \ -H "X-Visitor-Token: abc123" \ -d '{ "password": "hunter22" }'
إزالة كلمة المرور من المجموعة.
تحقق من كلمة المرور. تُرجع 200 عند النجاح و 401 عند كلمة مرور غير صحيحة.
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
password | string · required |
تغيير مدة انتهاء صلاحية المجموعة (collection).
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
days | integer · optional | من 1 إلى 7 أيام من الآن، ولكن ليس بعد 7 أيام من الرفع (أو تاريخ الانتهاء الحالي إن كان أبعد). احذفه أو استخدم null للتخزين الدائم (للمشتركين المميزين فقط). |
حدّد سقفًا للتنزيل (burn-after-N-downloads). يتم حذف المجموعة تلقائيًا عند الوصول إلى الحد.
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
max_downloads | integer · optional | 1–1000. يجب أن يتجاوز عدد التنزيلات الحالي. استخدم null لإزالة السقف. |
الملفات
8 نقاط نهايةتطابق جميع إعدادات مستوى الملف (كلمة المرور، الانتهاء، الحد الأقصى للتنزيلات) نقاط نهاية المجموعة. للمالك فقط.
تحقق مما إذا كان الملف لا يزال بانتظار رفعه.
{ "pending": false }
احذف الملف فورًا.
ارفع صورة مصغّرة لفيديو أو ملف صورة (تُستخدم في صفحة التنزيل). بحد أقصى 2 ميجابايت.
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
thumbnail | image · required | رفع متعدد الأجزاء. بحد أقصى 2 ميجابايت. |
{ "success": true, "thumbnail_url": "https://..." }
عيّن كلمة مرور لملف. تتطلب 4–100 حرفًا.
إزالة كلمة مرور الملف.
التحقق من كلمة مرور الملف.
تغيير مدة انتهاء صلاحية الملف.
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
days | integer · optional | من 1 إلى 7 أيام من الآن، ولكن ليس بعد 7 أيام من الرفع (أو تاريخ الانتهاء الحالي إن كان أبعد). احذفه أو استخدم null للتخزين الدائم (للمشتركين المميزين فقط). |
تحديد الحد الأقصى لإجمالي تنزيلات الملف. يتم الحذف تلقائيًا عند الوصول إلى الحد.
مصادقة سطح المكتب
نقطتا نهايةللعملاء المسجّلين الدخول، مثل تطبيق سطح المكتب، الذين يملكون رمز Bearer.
إرجاع المستخدم المُصادَق عليه.
curl https://storage.to/api/user \ -H "Authorization: Bearer <token>"
{ "id": 42, "name": "Ada", "email": "ada@example.com", "is_premium": true }
إبطال رمز الوصول الحالي.
متفرقات
5 نقاط نهايةالحالة والحصص وقياسات العملاء عن بُعد.
فحص الجاهزية. يعيد 200 مع { "status": "ok" } عندما يكون عامل الـ API يعمل.
{ "status": "ok" }
بث نشاط مباشر لواجهة الكرة على الصفحة الرئيسية. يتم تخزينه مؤقتًا على الحافة.
استخدام حصة الرفع الحالية للمتصل - يستخدمه CLI وتطبيق سطح المكتب لعرض السعة المتبقية. شكل الاستجابة يختلف للمستخدمين المُعرّفين. وعلى الرغم من اسم الرابط، فهذا يتتبع رفع بالبايت فقط؛ لا يتم احتساب التنزيلات.
{ "success": true, "authenticated": false, "has_token": true, "limit_bytes": 107374182400, "limit_gb": 100, "used_bytes": 12345678, "used_gb": 0.01, "remaining_bytes": 107361836722, "remaining_gb": 99.99, "window_hours": 24 }
{ "success": true, "authenticated": true, "plan": "premium" }
إرسال حدث استخدام من أداة سطر الأوامر (CLI) أو تطبيق سطح المكتب.
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
app | string · required | desktop أو cli أو web. |
version | string · optional | إصدار العميل. |
event | string · required | اسم الحدث، مثل upload_complete. |
context | object · optional | بيانات تعريف إضافية. |
أرسل تقرير خطأ من CLI أو تطبيق سطح المكتب. إزالة التكرار تتم على الخادم - بحد أقصى 10 من نفس الخطأ لكل ساعة.
نص الطلب
| الحقل | النوع | الوصف |
|---|---|---|
app | string · required | desktop أو cli أو web. |
type | string · required | فئة/نوع الخطأ. |
message | string · required | رسالة الخطأ. |
stack | string · optional | تتبّع المكدس (Stack trace). |
version, os, os_version, arch, context | various · optional | بيانات تعريف تشخيصية. |