المرجع

واجهة REST API

ارفع الملفات، أنشئ مجموعات، وادِر المشاركات عبر HTTP. جميع الردود بصيغة JSON؛ لا يلزم مفتاح API لعمليات الرفع المجهولة.

عنوان URL الأساسيhttps://storage.to/api
33 نقطة نهاية · JSON

كيف يعمل الرفع

تعمل واجهة storage.to API على تشغيل سطر الأوامر (CLI) وتطبيق سطح المكتب وأداة رفع الويب وأي عميل تابع لجهة خارجية تريد بناؤه. تدفق الرفع على ثلاث خطوات:

01 · POST /upload/init
تهيئة
أخبرنا أنك تريد رفع ملف. سنُرجع عنوان URL مُوقّعًا مسبقًا واحدًا أو أكثر يشير إلى حافة التخزين لدينا.
02 · PUT {upload_url}
رفع
استخدم PUT لإرسال بياناتك (bytes) مباشرةً إلى عناوين URL المُوقَّعة مسبقًا. لا تمر البيانات عبر خوادمنا.
03 · POST /upload/confirm
تأكيد
أخبرنا أن عملية الرفع اكتملت. سننشئ سجل File ونزوّدك بعنوان URL قابلًا للمشاركة.

جميع نقاط النهاية أدناه مرتبطة بهذا الأساس. مثال: POST /upload/init تعني POST https://storage.to/api/upload/init.

المصادقة

تعمل عمليات الرفع المجهولة دون مصادقة، ولكن بحدود صارمة. تقتصر الاستدعاءات بدون مفتاح على 50 ملفًا لكل 24 ساعة لكل جهاز أو عنوان IP، بالإضافة إلى حصص النطاق الترددي أدناه، وتنتهي صلاحية الملفات بعد 3 أيام.

المصادقة بحساب مجاني تتيح لك:

  • لا يوجد حد يومي للملفات
  • بدون حصة لنطاق الرفع
  • عمليات الرفع المرتبطة بحسابك (تظهر في /dashboard)
  • ميزات Premium (ملفات دائمة، مساحة تخزين أكبر)
  • عمليات تعديل بناءً على الملكية (حذف، تعيين كلمة مرور، تغيير تاريخ الانتهاء) دون الحاجة إلى مطابقة visitor-token

نظرة سريعة على الحدود

بدون رمز (مجهول)
رمز حساب مجاني
رمز حساب مدفوع
ملفات في اليوم
50 / 24 ساعة
غير محدود
غير محدود
نطاق الرفع
100 GB / 24 ساعة (500 GB لكل عنوان IP)
غير محدود
غير محدود
الحد الأقصى لحجم الملف
25 GB
25 GB
100 GB
انتهاء صلاحية الملف
3 أيام افتراضياً وحتى 7 عبر expiry_days
3 أيام افتراضياً وحتى 7 عبر expiry_days
أبداً (الملفات دائمة)
مساحة التخزين
لا يوجد (تنتهي صلاحية الملفات)
لا يوجد (تنتهي صلاحية الملفات)
100 غيغابايت - 1 تيرابايت بشكل دائم حسب الخطة
عرض الخطط →

لا توجد حصص شهرية - جميع الحدود هي نوافذ متجددة مدتها 24 ساعة أو حدود في الدقيقة. الخطة المجانية ليس لها مساحة تخزين ثابتة: كل ملف تنتهي صلاحيته من تلقاء نفسه، فلا يتراكم شيء ضمن الحصة.

للتوثيق، أنشئ رمز API شخصي من حسابك وأرسله كـ bearer token في كل طلب: تحتاج إلى تسجيل الدخول. يتم عرض الرمز الكامل مرة واحدة فقط عند الإنشاء، لذا انسخه في مكان آمن. يمكنك إلغاء أي رمز في أي وقت من نفس الصفحة. إنشاء رمز API →
Authorization: Bearer <token>

إثبات الملكية

رمز المالكموصى به
كل نقطة نهاية تنشئ موردًا (/upload/init multipart، /upload/confirm، /file/reserve، /collection) تُرجع owner_token ضمن الاستجابة. الرمز هو إثبات ملكية مُوقّع مرتبط بهذا المورد تحديدًا، ومستقل عن عنوان IP أو رمز الزائر لديك. تعيش الرموز طالما أن المورد موجود، وهي آمنة للاحتفاظ بها ولا تنتهي بشكل مستقل. يعني فقدان الرمز فقدان السيطرة على ذلك المورد (الملف/المجموعة/الرفع) - تعامل معها مثل كلمات المرور المحلية.
Authorization: Owner <token>
# أو، إلى جانب جلسة Bearer
X-Owner-Token: <token>
رمز الزائر
تحتاج التطبيقات/العملاء المجهولون إلى طريقة لإثبات ملكيتهم لعمليات الرفع الخاصة بهم بدون حساب. نستخدم رمز الزائر (visitor token) - سلسلة عشوائية ينشئها العميل مرة واحدة ويعيد استخدامها. أرسلها مع كل طلب: على الويب، يتم تخزين الرمز تلقائيًا في ملف تعريف الارتباط visitor_token. يقوم سطر الأوامر (CLI) بتخزينه في ~/.config/storageto/token (انظر مستندات CLI).
X-Visitor-Token: <random-string>

بالنسبة لنقاط النهاية الخاصة بالعمليات (delete، set password، change expiry)، يتم تأكيد الملكية إذا إما كان رمز الزائر مطابقًا أو إذا جاءت الطلب من نفس عنوان IP الذي أنشأ الملف. يمكن أن يضيع كلاهما (حذف الكوكيز، تغييرات الشبكة). يُعدّ رمز المالك هو الدليل المفضل للمضي قدمًا.

الأخطاء

تتبع الأخطاء شكلًا ثابتًا: { "success": false, "error": "…" }

200حسنًا.
201تم الإنشاء.
400طلب غير صالح (مثل تجاوز حد حجم المجموعة).
401كلمة المرور مطلوبة أو غير صحيحة.
403غير مصرح (لست مالك المورد).
404لم يتم العثور على المورد أو أنه انتهت صلاحيته.
422فشل التحقق، أو يوجد تقييد على الخطة/الحصة.
429تم تجاوز حد المعدّل أو حصة الرفع.
500خطأ في الخادم. تحقق من الحالة.

حدود المعدّل

جميع حدود المعدّل لكل عنوان IP. تتضمن استجابة 429 رؤوس Retry-After و X-RateLimit-Limit و X-RateLimit-Remaining القياسية.

بدء الرفع / تأكيد / إلغاء60 / دقيقة
إكمال الرفع متعدد الأجزاء500 / دقيقة
روابط أجزاء الرفع متعدد الأجزاء120 / دقيقة
بدء / تأكيد دفعي500 / دقيقة
استعلامات الحالة (الملف والمجموعة)120 / دقيقة
الإعدادات (كلمة المرور، تاريخ الانتهاء، الحد الأقصى للتنزيلات)30 / دقيقة
التحقق من كلمة المرور10 / دقيقة
إنشاء مجموعة30 / دقيقة
إدارة (ready، delete)60 / دقيقة
رفع صورة مصغّرة120 / دقيقة
رفع عبر ShareX20 / يوم
تحليلات التطبيق / الأخطاء120 و 60 / دقيقة

حصة الرفع: لدى العملاء المجهولين حدّان يعملان بالتوازي - 100 جيجابايت / 24 ساعة لكل رمز الزائر (visitor token) و 500 جيجابايت / 24 ساعة لكل IP (حد IP يلتقط حركة المرور بدون رموز والشبكات المشتركة). عند تجاوز أي منهما ستحصل على 429 مع التفاصيل. هذا حدّ رفع فقط - التنزيلات غير محدودة وغير مُقيّدة.

رفع

8 نقاط نهاية

تدفق الرفع من ثلاث خطوات لأي ملف، بما في ذلك الملفات التي تتجاوز 5 جيجابايت (يتم تلقائيًا تقسيمها إلى أجزاء multipart). إذا كنت تحتاج فقط إلى رفع سريع بأسلوب لقطة شاشة، فراجع ShareX بدلًا من ذلك.

POST/upload/init60/min

ابدأ عملية رفع. للملفات >50 ميجابايت تكون الاستجابة رفعًا متعدد الأجزاء (حقل type: "multipart")؛ وإلا فسيكون PUT واحد مُوقّع مسبقًا.

نص الطلب

الحقلالنوعالوصف
filenamestring · requiredاسم الملف الأصلي. بحد أقصى 255 حرفًا.
content_typestring · requiredنوع MIME.
sizeinteger · requiredحجم الملف بالبايت. الحد الأدنى 1.
Request
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
  }'
Response · single upload
{
  "success": true,
  "type": "single",
  "upload_url": "https://r2.cloudflarestorage.com/...signed...",
  "headers": { "Host": ["..."] },
  "r2_key": "uuid-abc123"
}
Response · multipart
{
  "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_..."
}
POST/upload/partsللمالك فقط120/min

اطلب عناوين URL إضافية للأجزاء لرفع متعدد الأجزاء قيد التنفيذ. يُستخدم عندما تُرجع /init عناوين URL أقل مما لديك من أجزاء (أو كانت قد انتهت صلاحيتها).

نص الطلب

الحقلالنوعالوصف
upload_idstring · required‏upload_id القادم من /init.
part_numbersarray<int> · requiredأرقام الأجزاء للحصول على عناوين URL لها.
Request
curl -X POST https://storage.to/api/upload/parts \
  -H "Content-Type: application/json" \
  -d '{
    "upload_id": "01HXYZ...",
    "part_numbers": [3, 4]
  }'
Response
{
  "success": true,
  "part_urls": [
    { "partNumber": 3, "url": "https://..." },
    { "partNumber": 4, "url": "https://..." }
  ]
}
POST/upload/complete-multipartللمالك فقط500/min

أكمل رفع متعدد الأجزاء بمجرد رفع جميع الأجزاء.

نص الطلب

الحقلالنوعالوصف
upload_idstring · required‏upload_id القادم من /init.
partsarray · requiredكل إدخال: { partNumber, etag } من استجابة رفع الجزء.
Request
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...\"" }
    ]
  }'
Response
{ "success": true }
POST/upload/abortللمالك فقط60/min

ألغِ رفعًا متعدد الأجزاء ونظّف أي بيانات جزئية.

نص الطلب

الحقلالنوعالوصف
upload_idstring · requiredالرفع الذي يجب إلغاؤه.
Request
curl -X POST https://storage.to/api/upload/abort \
  -H "Content-Type: application/json" \
  -d '{ "upload_id": "01HXYZ..." }'
POST/upload/confirm60/min

أكد أن الرفع اكتمل. عندها ننشئ سجل File ونُرجع عنوان URL القابل للمشاركة.

نص الطلب

الحقلالنوعالوصف
filenamestring · requiredاسم الملف الأصلي.
sizeinteger · requiredحجم الملف بالبايت.
content_typestring · requiredنوع MIME.
r2_keystring · required‏r2_key القادم من /init.
collection_idstring · optionalإرفاقه إلى مجموعة.
crc32integer · optionalمجموع CRC32 للتحقق من سلامة البيانات.
file_idstring(9) · optionalإتمام معرف ملف محجوز سابقًا.
Request
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"
  }'
Response
{
  "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_..."
}
POST/file/reserve60/min

احجز معرف ملف وعنوان URL قابل للمشاركة قبل أن تصبح البيانات جاهزة. مفيد عندما تحتاج إلى مشاركة رابط أولًا ثم إتمام الرفع لاحقًا. ترتبط الملكية برمز الزائر + عنوان IP الخاصين بك. أنهِ الرفع لاحقًا باستخدام /upload/init + /upload/confirm، مع تمرير file_id للتأكيد.

نص الطلب

الحقلالنوعالوصف
filenamestring · optionalاسم ملف بديل. القيمة الافتراضية هي "Pending".
content_typestring · optionalنوع MIME بديل.
Request
curl -X POST https://storage.to/api/file/reserve \
  -H "X-Visitor-Token: abc123"
Response
{
  "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 جيجابايت.

POST/collection30/min

أنشئ مجموعة جديدة. أرفق الملفات لاحقًا عبر تمرير collection_id على /upload/confirm.

نص الطلب

الحقلالنوعالوصف
expected_file_countinteger · optionalتلميح لتعليم المجموعة تلقائيًا أنها جاهزة بمجرد تأكيد جميع الملفات المتوقعة.
Request
curl -X POST https://storage.to/api/collection \
  -H "Content-Type: application/json" \
  -H "X-Visitor-Token: abc123" \
  -d '{ "expected_file_count": 3 }'
Response
{
  "success": true,
  "collection": {
    "id": "ABC123xyz",
    "url": "https://storage.to/c/ABC123xyz",
    "expires_at": "2026-04-15T12:00:00Z"
  },
  "owner_token": "owner_v1_..."
}

استعلم عن حالة المجموعة. كما يعلّم المجموعة تلقائيًا أنها جاهزة إذا تم تأكيد جميع الملفات المتوقعة.

Request
curl https://storage.to/api/collection/ABC123xyz/status
Response
{
  "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"
}
POST/collection/{id}/readyللمالك فقط60/min

علّم المجموعة على أنها جاهزة للتنزيل. هذا ليس مطلوبًا عادةً - تصبح المجموعات جاهزة تلقائيًا بمجرد الوصول إلى expected_file_count.

DELETE/collection/{id}للمالك فقط60/min

احذف مجموعة وجميع ملفاتها.

POST/collection/{id}/passwordللمالك فقط30/min

عيّن كلمة مرور للمجموعة. تتطلب 4–100 حرفًا.

نص الطلب

الحقلالنوعالوصف
passwordstring · required4–100 حرفًا.
Request
curl -X POST https://storage.to/api/collection/ABC123xyz/password \
  -H "X-Visitor-Token: abc123" \
  -d '{ "password": "hunter22" }'
DELETE/collection/{id}/passwordللمالك فقط30/min

إزالة كلمة المرور من المجموعة.

تحقق من كلمة المرور. تُرجع 200 عند النجاح و 401 عند كلمة مرور غير صحيحة.

نص الطلب

الحقلالنوعالوصف
passwordstring · required
POST/collection/{id}/expiryللمالك فقطدائم: مدفوع30/min

تغيير مدة انتهاء صلاحية المجموعة (collection).

نص الطلب

الحقلالنوعالوصف
daysinteger · optionalمن 1 إلى 7 أيام من الآن، ولكن ليس بعد 7 أيام من الرفع (أو تاريخ الانتهاء الحالي إن كان أبعد). احذفه أو استخدم null للتخزين الدائم (للمشتركين المميزين فقط).
POST/collection/{id}/max-downloadsللمالك فقط30/min

حدّد سقفًا للتنزيل (burn-after-N-downloads). يتم حذف المجموعة تلقائيًا عند الوصول إلى الحد.

نص الطلب

الحقلالنوعالوصف
max_downloadsinteger · optional1–1000. يجب أن يتجاوز عدد التنزيلات الحالي. استخدم null لإزالة السقف.

الملفات

8 نقاط نهاية

تطابق جميع إعدادات مستوى الملف (كلمة المرور، الانتهاء، الحد الأقصى للتنزيلات) نقاط نهاية المجموعة. للمالك فقط.

تحقق مما إذا كان الملف لا يزال بانتظار رفعه.

Response
{ "pending": false }
DELETE/file/{id}للمالك فقط60/min

احذف الملف فورًا.

POST/file/{id}/thumbnailللمالك فقط120/min

ارفع صورة مصغّرة لفيديو أو ملف صورة (تُستخدم في صفحة التنزيل). بحد أقصى 2 ميجابايت.

نص الطلب

الحقلالنوعالوصف
thumbnailimage · requiredرفع متعدد الأجزاء. بحد أقصى 2 ميجابايت.
Response
{
  "success": true,
  "thumbnail_url": "https://..."
}
POST/file/{id}/passwordللمالك فقط30/min

عيّن كلمة مرور لملف. تتطلب 4–100 حرفًا.

DELETE/file/{id}/passwordللمالك فقط30/min

إزالة كلمة مرور الملف.

التحقق من كلمة مرور الملف.

POST/file/{id}/expiryللمالك فقطدائم: مدفوع30/min

تغيير مدة انتهاء صلاحية الملف.

نص الطلب

الحقلالنوعالوصف
daysinteger · optionalمن 1 إلى 7 أيام من الآن، ولكن ليس بعد 7 أيام من الرفع (أو تاريخ الانتهاء الحالي إن كان أبعد). احذفه أو استخدم null للتخزين الدائم (للمشتركين المميزين فقط).
POST/file/{id}/max-downloadsللمالك فقط30/min

تحديد الحد الأقصى لإجمالي تنزيلات الملف. يتم الحذف تلقائيًا عند الوصول إلى الحد.

رفع عبر ShareX

نقطة نهاية واحدة

نقطة رفع بنقرة واحدة - أرسل ملفًا متعدد الأجزاء (multipart) وستحصل على رابط قابل للمشاركة. لا توجد رقصة init/confirm. مثالي لأدوات لقطات الشاشة. دليل الإعداد الكامل في /docs/sharex.

POST/sharex/upload20/day

ارفع صورة أو ملفًا مباشرةً (نموذج multipart، حقل file). بحد أقصى 25 ميجابايت.

Request
curl -X POST https://storage.to/api/sharex/upload \
  -F "file=@screenshot.png"
Response
{
  "success": true,
  "url": "https://storage.to/FQxyz1234",
  "filename": "screenshot.png",
  "expires_at": "2026-04-15T12:00:00Z"
}

مصادقة سطح المكتب

نقطتا نهاية

للعملاء المسجّلين الدخول، مثل تطبيق سطح المكتب، الذين يملكون رمز Bearer.

GET/userرمز Bearer

إرجاع المستخدم المُصادَق عليه.

Request
curl https://storage.to/api/user \
  -H "Authorization: Bearer <token>"
Response
{
  "id": 42,
  "name": "Ada",
  "email": "ada@example.com",
  "is_premium": true
}
POST/auth/logoutرمز Bearer

إبطال رمز الوصول الحالي.

متفرقات

5 نقاط نهاية

الحالة والحصص وقياسات العملاء عن بُعد.

فحص الجاهزية. يعيد 200 مع { "status": "ok" } عندما يكون عامل الـ API يعمل.

Response
{ "status": "ok" }

بث نشاط مباشر لواجهة الكرة على الصفحة الرئيسية. يتم تخزينه مؤقتًا على الحافة.

استخدام حصة الرفع الحالية للمتصل - يستخدمه CLI وتطبيق سطح المكتب لعرض السعة المتبقية. شكل الاستجابة يختلف للمستخدمين المُعرّفين. وعلى الرغم من اسم الرابط، فهذا يتتبع رفع بالبايت فقط؛ لا يتم احتساب التنزيلات.

Response · anonymous
{
  "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
}
Response · authenticated
{
  "success": true,
  "authenticated": true,
  "plan": "premium"
}
POST/app-analytics120/min

إرسال حدث استخدام من أداة سطر الأوامر (CLI) أو تطبيق سطح المكتب.

نص الطلب

الحقلالنوعالوصف
appstring · requireddesktop أو cli أو web.
versionstring · optionalإصدار العميل.
eventstring · requiredاسم الحدث، مثل upload_complete.
contextobject · optionalبيانات تعريف إضافية.
POST/app-errors60/min

أرسل تقرير خطأ من CLI أو تطبيق سطح المكتب. إزالة التكرار تتم على الخادم - بحد أقصى 10 من نفس الخطأ لكل ساعة.

نص الطلب

الحقلالنوعالوصف
appstring · requireddesktop أو cli أو web.
typestring · requiredفئة/نوع الخطأ.
messagestring · requiredرسالة الخطأ.
stackstring · optionalتتبّع المكدس (Stack trace).
version, os, os_version, arch, contextvarious · optionalبيانات تعريف تشخيصية.