في هذه الصفحة
- نظرة عامة
- البدء
- الأتمتة عبر وكيل
- المصادقة
- الرموز والأسعار
- واجهة لوحة SMM
- services
- add
- status
- balance
- cancel
- واجهة المنصة
- الدليل
- الحساب
- التحقق بخطوتين وتسجيل الدخول
- التفضيلات والتنبيهات
- الحملات
- إنشاء طلب
- تعديل طلب
- السجلات والتحليلات
- ملفات التصويت والوكيل
- رموز ديسكورد
- الفوترة والمدفوعات
- السلة المحفوظة
- الواجهات الداخلية
- أشكال الاستجابات
- كائن الموقع
- كائن الحملة
- حالة الحملة
- التقدّم والاستردادات
- مثال من البداية إلى النهاية
- الأخطاء
- حدود المعدل
- الحدود وملاحظات
نظرة عامة
تقدّم Toplistbot واجهتَي HTTP. كلتاهما JSON عبر HTTPS، وكلتاهما تنفقان الرصيد نفسه من الرموز، وأي واحدة منهما تكفي لتشغيل الحملات دون فتح لوحة التحكم أبدًا.
واجهة لوحة SMM
نقطة نهاية واحدة متوافقة مع Perfect Panel. إن كانت لوحتك تتحدث بروتوكول SMM القياسي فوجّهها إلى هنا وستعمل دون أي تعديل في الشيفرة.
واجهة المنصة
واجهة REST التي تعمل خلف لوحة التحكم: تصفّح الفهرس، وإنشاء الحملات وتوجيهها، وقراءة سجلات التسليم صوتًا بصوت، وإدارة الملفات والوكلاء والفواتير.
العنوان الأساسي
https://backend.toplistbot.com/api
https://backend.toplistbot.comالمرجع أدناه مكتوب لهذين المضيفين. اختيارك بينهما يحدد طريقة المصادقة — راجع قسم المصادقة.
البدء
من حساب جديد إلى حملة قيد التشغيل في خمس خطوات. كل ما يلي يستخدم نقطة اتصال SMM لأنها الأسرع؛ وتعمل واجهة المنصة بالطريقة نفسها بمجرد حصولك على JWT.
أنشئ حسابًا
سجّل حسابًا وفعّل بريدك الإلكتروني. يمنحك التفعيل 100 رمز مجاني في رصيدك، وهو ما يكفي لتشغيل حملة حقيقية قبل أن تنفق شيئًا.
انسخ مفتاح API
افتح لوحة التحكم وأنشئ مفتاح API. تعامل معه كأنه كلمة مرور — فهو ينفق من رصيد الرموز لديك. يمكنك تجديده في أي وقت، وعندها يبطل المفتاح القديم فورًا.
ابحث عن الخدمة المطلوبة
اعرض كل المواقع التي يمكنك الطلب عليها. لكل عنصر معرّف خدمة رقمي وسعر بالرموز لكل 1000 إجراء. دوّن معرّف الموقع الذي تريد الترويج عليه.
cURLcurl -X POST https://backend.toplistbot.com/api/v2 -d "key=YOUR_API_KEY" -d "action=services"أنشئ طلبك الأول
أرسل معرّف الخدمة، والرابط الذي ستعمل عليه الحملة، وعدد الإجراءات المطلوبة. تُخصم التكلفة فورًا، وتتضمن الاستجابة معرّف الطلب.
cURLcurl -X POST https://backend.toplistbot.com/api/v2 \ -d "key=YOUR_API_KEY" \ -d "action=add" \ -d "service=9" \ -d "link=https://arena-top100.com/index.php?a=in&u=yourserver" \ -d "quantity=1000"تابع التنفيذ
استعلم عن معرّف الطلب لمعرفة ما تم تنفيذه. وعندما تطمئن إلى سير العمل، اربط الاستدعاءات نفسها بلوحتك أو بسكربتاتك.
cURLcurl -X POST https://backend.toplistbot.com/api/v2 -d "key=YOUR_API_KEY" -d "action=status" -d "orders=184223"
ربط Perfect Panel
إذا كنت تستخدم Perfect Panel أو برنامج لوحة SMM متوافقًا، فلا حاجة لكتابة أي كود — أضف Toplistbot كمزوّد بهذه الإعدادات ثم استورد قائمة الخدمات.
- رابط API
- https://backend.toplistbot.com/api/v2
- مفتاح API
- YOUR_API_KEY
- طريقة HTTP
- POST
ابدأ بكمية صغيرة على موقع واحد للتأكد من قبول صيغة الرابط قبل التوسّع. فالرابط الخاطئ يستهلك رموزًا أيضًا.
الأتمتة عبر وكيل ذكاء اصطناعي
لهذه الصفحة توأم نصي مكتوب للآلات. أعطِ الوكيل ذلك الرابط ومفتاح API الخاص بك وسيكون لديه كل ما يلزم: قائمة نقاط النهاية كاملة، وأشكال الطلبات والاستجابات، وحساب الأسعار، ورموز الأخطاء، وأمثلة كاملة.
مرجع قابل للقراءة آليًا
مستند واحد، بلا مصادقة وبلا جافاسكربت. نزّله، أو الصقه في موجّه، أو أعطِ الرابط لأداة تستطيع التصفح.
https://toplistbot.com/llms.txtموجّه البداية
الصق هذا في Claude أو في أي وكيل يستطيع إرسال طلبات HTTP. احتفظ بالمفتاح في متغير بيئة بدلًا من كتابته داخل الرسالة.
Read https://toplistbot.com/llms.txt — it is the complete Toplistbot API reference.
My API key is in the TOPLISTBOT_KEY environment variable. Using the API-key
surface (paths without the /api prefix):
1. list the sites in the catalog that cost under 20 tokens per 1,000 votes
2. tell me my token balance
3. propose a campaign for <my vote URL> that fits a budget of <N> tokens
Do not place the order until I confirm the cost.مفتاح API هو بيانات الاعتماد المناسبة للوكيل: لا تنتهي صلاحيته، ولا يتأثر بالتحقق بخطوتين، وتدويره من لوحة التحكم يلغي الوصول فورًا عند الحاجة.
المصادقة
هناك نوعان من بيانات الاعتماد، وأيّهما تحتاج يعتمد على المسار لا على نقطة النهاية. فمعظم نقاط النهاية مركّبة مرتين.
البادئة /api هي التي تحدد بيانات الاعتماد
المعالج نفسه يقف خلف المسارين. احذف البادئة /api فتقبل واجهة المنصة مفتاح API طويل الأمد؛ أبقِها فتتوقع نقطة النهاية رمز JWT ناتجًا عن تسجيل الدخول.
| المسار | بيانات الاعتماد | استخدمه لـ |
|---|---|---|
| /api/orders/getAll | JWT | أي شيء يسجّل فيه شخص الدخول |
| /orders/getAll | مفتاح API | السكربتات والمهام المجدولة والوكلاء |
للأتمتة، فضّل المسارات بلا بادئة. لا تسجيل دخول ولا انتهاء صلاحية ولا جلسة تحتاج إلى إبقائها حية — مفتاح واحد يفعل كل شيء، والتحقق بخطوتين لا يعترض طريقك أبدًا.
مفتاح API
أرسل مفتاحك في حقل `key` مع أي طلب: كمعامل استعلام، أو حقل نموذج، أو حقل JSON، أو ترويسة `Authorization: Bearer`. أنشئه ودوّره من لوحة التحكم. طلب GET إلى /api/v2 يعيد الحالة ok وهو طريقة رخيصة للتأكد من أن المفتاح فعّال.
# any of these three carry the key
curl "https://backend.toplistbot.com/orders/getAll?key=YOUR_API_KEY"
curl -X POST https://backend.toplistbot.com/orders/pause -d "key=YOUR_API_KEY" -d "id=184223"
curl https://backend.toplistbot.com/orders/getAll -H "Authorization: Bearer YOUR_API_KEY"curl https://backend.toplistbot.com/api/v2?key=YOUR_API_KEYJWT
سجّل الدخول لتحصل على رمز، ثم أرسله كرمز bearer على مسارات /api. تنتهي صلاحية الرموز، لذا استدعِ /auth/refresh قبل ذلك. وإن كان التحقق بخطوتين مفعّلًا على الحساب فسيحتاج تسجيل الدخول أيضًا إلى `two_factor_code`.
curl -X POST https://backend.toplistbot.com/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","password":"..."}'{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"token_type": "bearer",
"expires_in": 3600,
"user": { "id": 4211, "email": "[email protected]", "tokens": 528.41, "...": "..." }
}curl https://backend.toplistbot.com/api/orders/getAll \
-H "Authorization: Bearer YOUR_JWT"الاستدعاء من المتصفح
كل المسارات تجيب بترويسة Access-Control-Allow-Origin مفتوحة، لذا تستطيع صفحة أو إضافة متصفح أو وكيل يعمل داخل المتصفح استدعاء الواجهة مباشرة دون أن تبني وسيطًا خاصًا بك. ويبقى التحذير أعلاه قائمًا: المفتاح الذي ترسله إلى المتصفح مفتاح نشرته، فهذا للأدوات الخاصة بك لا لصفحة عامة.
// Works from a page, an extension, or a browser-based agent.
const sites = await fetch(
'https://backend.toplistbot.com/orders/getAllWebsites'
).then(r => r.json())مفتاح API ينفق رصيدًا حقيقيًا من الرموز. أبقِه على الخادم: أي مفتاح يصل إلى المتصفح أو يُرفع إلى مستودع يجب اعتباره مكشوفًا وتدويره من لوحة التحكم.
الرموز والأسعار
تُدفع الحملات بالرموز التي تشتريها مسبقًا. ولكل موقع سعر معلن — عدد الرموز اللازمة لتنفيذ 1000 إجراء عليه — يُعاد في الحقل `rate` ضمن إجراء services.
cost_in_tokens = (rate * quantity) / 1000موقع سعره 13 يكلّف 13 رمزًا لكل 1000 إجراء، وبالتالي يكلّف طلب من 500 إجراء 6.5 رمز. تُخصم التكلفة عند قبول الطلب، ويعيد الإلغاء ما لم يُستهلك منها.
تشير استجابتا balance وstatus إلى حقل عملة بقيمة USD من أجل التوافق مع Perfect Panel، لكن القيمة هي رصيد رموز وليست دولارات. تعامل مع الرقم على أنه رموز.
واجهة لوحة SMM
نقطة اتصال واحدة تنفّذ كل شيء. أرسل حقل `action` مع كل طلب POST لاختيار العملية؛ ويحمل كل طلب أيضًا قيمة `key` الخاصة بك.
https://backend.toplistbot.com/api/v2| الإجراء | المعاملات |
|---|---|
services | — |
add | service, link, quantity, interval? |
status | orders |
balance | — |
cancel | orders |
تُقبل `refill` و`refill_status` للتوافق فقط وكلتاهما تجيبان بأنها غير منفّذة. لا شيء هنا قابل لإعادة التعبئة؛ أنشئ طلبًا جديدًا بدلًا من ذلك.
action=services
تعرض كل المواقع التي يمكنك الطلب عليها مع السعر الحالي والحدود. استخدم معرّف `service` في استدعاءات add.
curl -X POST https://backend.toplistbot.com/api/v2 \
-d "key=YOUR_API_KEY" \
-d "action=services"[
{
"service": 9,
"name": "arena-top100.com 1000 upvotes",
"type": "Default",
"category": "Votes",
"rate": 15,
"min": 1,
"max": 50000,
"refill": false,
"cancel": true
}
]`rate` بالرموز لكل 1000 إجراء. وقيمة `min` هي 1 و`max` هي 50000 لكل الخدمات.
action=add
ينشئ حملة ويخصم تكلفتها من رصيدك فورًا.
| المعامل | النوع | الوصف |
|---|---|---|
keyمطلوب | string | مفتاح API الخاص بك. |
actionمطلوب | string | يجب أن يكون `add`. |
serviceمطلوب | integer | معرّف الخدمة المأخوذ من إجراء services. |
linkمطلوب | url | الرابط الذي ستعمل عليه الحملة. يجب أن يكون رابطًا صالحًا. |
quantityمطلوب | integer | عدد الإجراءات المطلوب تنفيذها، بين 1 و50000. |
interval | integer | عدد الإجراءات في الساعة. الافتراضي 15، وبحد أقصى 4000، ولا يمكن أن يتجاوز الحد الأقصى للموقع نفسه. |
curl -X POST https://backend.toplistbot.com/api/v2 \
-d "key=YOUR_API_KEY" \
-d "action=add" \
-d "service=9" \
-d "link=https://arena-top100.com/index.php?a=in&u=yourserver" \
-d "quantity=1000" \
-d "interval=60"{
"order_id": 184223
}action=status
يعيد تقدّم طلب واحد أو أكثر. مرّر معرّفًا واحدًا للحصول على كائن مباشر، أو قائمة مفصولة بفواصل.
curl -X POST https://backend.toplistbot.com/api/v2 \
-d "key=YOUR_API_KEY" \
-d "action=status" \
-d "orders=184223"{
"charge": 13.5,
"start_count": 0,
"status": "Completed",
"remains": 1000,
"currency": "USD"
}مع عدة معرّفات تُفهرس الاستجابة حسب معرّف الطلب، وتعيد الطلبات المجهولة أو غير التابعة لك مدخل خطأ بدل إفشال الطلب بأكمله.
{
"184223": { "charge": 13.5, "start_count": 0, "status": "Completed", "remains": 1000, "currency": "USD" },
"184224": { "error": "Incorrect order ID" }
}اقرأ `remains` لا `status`
قيمة `status` هي دائمًا النص "Completed". يوجد الحقل لأن كل عميل Perfect Panel يطلبه، واللوحات تعامل أي قيمة أخرى كمرشّح لإعادة التعبئة، وهو ما لا تقدمه هذه المنصة. التقدّم في الأرقام: `remains` هو عدد الأصوات المقبولة المتبقية للتسليم، لذا فإن `remains == 0` يعني أن الطلب انتهى. و`start_count` هو ما سُلّم حتى الآن، و`charge` هو ما كلّفه. وكلاهما يُقاس مقابل معدل قبول الموقع، أي أنهما يعدّان الأصوات التي اشتريتها لا المحاولات الخام.
تقبل `status` و`cancel` ما لا يزيد عن 100 معرّف طلب في الاستدعاء الواحد. اجمعها بدل التكرار: استدعاء واحد بمئة معرّف أرخص كثيرًا للطرفين من مئة استدعاء.
action=balance
يعيد رصيدك المتبقي من الرموز.
curl -X POST https://backend.toplistbot.com/api/v2 \
-d "key=YOUR_API_KEY" \
-d "action=balance"{
"balance": 528.41,
"currency": "USD"
}action=cancel
يوقف الطلب ويعيد ما لم يُستهلك إلى رصيدك. ولا يمكن إلغاء الطلبات المكتملة.
curl -X POST https://backend.toplistbot.com/api/v2 \
-d "key=YOUR_API_KEY" \
-d "action=cancel" \
-d "orders=184223,184224"[
{ "order": "184223", "cancel": 1, "refund": 4.5 },
{ "order": "184224", "cancel": { "error": "Incorrect order ID" } }
]واجهة المنصة
واجهة REST نفسها التي تستخدمها لوحة التحكم. المسارات أدناه مكتوبة بصيغة مفتاح API، أي بلا البادئة /api. أضف /api واستبدل المفتاح برمز JWT لاستخدام صيغة الجلسة؛ ونقاط النهاية الموسومة بـ JWT موجودة تحت /api فقط.
الفهرس والاستكشاف
عام ولا يحتاج بيانات اعتماد. ابدأ من getAllWebsites: فهو يحمل المعرّف والسعر والسقف الساعي ومعدل القبول، وهي كل ما تحتاجه لتسعير الطلب وضبط حجمه.
- GET
/orders/getAllWebsitesعامالفهرس الكامل: كل موقع مع أسعاره وحدوده وبياناته الوصفية - GET
/orders/getAllBasicWebsitesDetailsعام20 اسم موقع عشوائيًا، للودجات والإكمال التلقائي - POST
/orders/getWebsiteDetailsByNameعامموقع واحد باسمه الدقيق - POST
/products/getSuggestionsعاممواقع مرتبطة بمجموعة من المعرّفات - GET
/products/demand?days=30عاممقدار الطلب على كل موقع مؤخرًا - GET
/products/tokensعامباقات الرموز المتاحة للشراء - POST
/products/suggestمفتاح APIاطلب منا إضافة موقع جديد - GET
/api/news/timelineعامسجل تغييرات المنتج
curl "https://backend.toplistbot.com/orders/getAllWebsites"اطلب أقل
الفهرس الكامل نحو 665 كيلوبايت لـ 396 موقعًا، ونصف ذلك الحجم يأتي من حقلين لن تطلب بهما أبدًا: كتلة JSON للشعبية والوصف التسويقي. اقتصر على الحقول التي تطلب بها واستبعد المواقع غير الفعّالة فيصبح نحو 40 كيلوبايت.
# The whole catalog is ~665 KB across 396 sites.
# Projected to what you actually order with: ~40 KB.
curl -s "https://backend.toplistbot.com/orders/getAllWebsites" \
| jq '[.[]
| select(.active == 1)
| {id, name, price_per_1000, max_per_hour, accept_rate, subscribeable}]'بالنسبة لوكيل ذكاء اصطناعي هذا هو الفرق بين نحو 170,000 رمز و10,000: بين أن ينجح الاستدعاء الأول وأن يستنفد نافذة السياق. رشّح قبل أن تحلّل.
الحساب والجلسات
يحتاج التسجيل إلى متصفح لأنه محمي بتحدٍّ من Cloudflare. سجّل مرة واحدة على app.toplistbot.com ثم أتمت كل ما بعد ذلك.
- POST
/api/auth/registerعامإنشاء حساب — من المتصفح فقط، محمي بكابتشا - POST
/api/auth/loginعاماستبدال بيانات الاعتماد برمز JWT - POST
/api/auth/refreshJWTإصدار رمز JWT جديد من آخر توشك صلاحيته على الانتهاء - POST
/api/auth/logoutJWTإبطال رمز JWT الحالي - GET
/api/auth/user-profileJWTالحساب المسجّل دخوله، مع الرصيد ومفتاح API - GET
/api/userJWTكائن المستخدم نفسه على مسار أقصر - GET
/api/api_tokenمفتاح APIتحديد صاحب مفتاح API — استخدمه للتحقق من مفتاح - POST
/api/auth/reset-api-keyJWTتدوير مفتاح API؛ والقديم يبطل فورًا - POST
/api/auth/fingerprintJWTتسجيل بصمة متصفح على الحساب - POST
/api/auth/ipJWTتسجيل عنوان IP الحالي للحساب - POST
/api/auth/forgot-passwordعامإرسال رابط إعادة تعيين صالح 60 دقيقة - POST
/api/auth/reset-passwordعامتعيين كلمة مرور جديدة بالرمز المرسل بالبريد
التحقق بخطوتين وتسجيل الدخول
يحمي التحقق بخطوتين تسجيل الدخول بكلمة المرور، ولا ينطبق على مفاتيح API، ولهذا يكون المفتاح خيارًا أفضل للعمل دون إشراف.
- POST
/api/2fa/enableJWTبدء التسجيل: يعيد السر ورابط رمز QR ورموز الاسترداد - POST
/api/2fa/verifyJWTتأكيد رمز من ستة أرقام وتفعيل التحقق بخطوتين - POST
/api/2fa/disableJWTإيقاف التحقق بخطوتين - POST
/api/account/verification/requestJWTإرسال رابط تحقق إلى عنوان الحساب - GET
/api/account/verification/confirm?token=عامعرض صفحة التأكيد — لا تكتب شيئًا - POST
/api/account/verification/confirmعامإتمام التحقق - GET
/api/auth/googleعامبدء تسجيل الدخول بجوجل - GET
/api/auth/google/callbackعامعودة تسجيل الدخول بجوجل - GET
/api/auth/discordعامبدء تسجيل الدخول بديسكورد - GET
/api/auth/discord/callbackعامعودة تسجيل الدخول بديسكورد
التفضيلات والتنبيهات
مفاتيح البريد والإشعارات، وسجل تنبيهات الحساب.
- GET
/api/user/email-preferencesJWTحالة الاشتراك في رسائل التسويق - POST
/api/user/email-preferencesJWTتغييرها - GET
/api/user/notification-preferencesJWTتفضيل إشعارات التصويت الحية - POST
/api/user/notification-preferencesJWTتغييره: يجب أن يكون قيمة منطقية JSON حقيقية - GET
/api/user/alerts?limit=20JWTتنبيهات الحساب، الأحدث أولًا، مقسّمة بـ ?before - POST
/api/user/alerts/readJWTوسم تنبيه كمقروء - POST
/api/user/alerts/dismissJWTإخفاء تنبيه - GET
/api/email/unsubscribe?token=عامإلغاء الاشتراك بنقرة واحدة عبر رمز مُرسل بالبريد
الحملات
أنشئ الحملات ووجّهها أثناء عملها وأنهها. هذا هو قلب واجهة المنصة.
- GET
/orders/getAllمفتاح APIحملاتك، الأحدث أولًا، ومعها بيانات مواقعها - GET
/orders/get/{id}مفتاح APIحملة واحدة - POST
/orders/checkoutمفتاح APIإنشاء حملات وخصم قيمتها من الرصيد - POST
/orders/updateمفتاح APIتعديل حملة - POST
/orders/pauseمفتاح APIإيقاف حملة عاملة مؤقتًا - POST
/orders/unpauseمفتاح APIاستئناف حملة موقوفة - POST
/orders/archiveمفتاح APIأرشفة حملة - POST
/orders/unarchiveمفتاح APIاستعادة حملة مؤرشفة - PATCH
/orders/updateLimitمفتاح APIضبط أو إزالة السقف اليومي للأصوات
POST /orders/checkout
الجسم مصفوفة JSON من سطور السلة في المستوى الأعلى، لا كائنًا. كل سطر حملة. تُتحقَّق السلة كاملة قبل أي خصم، والخصم والإدراج معاملة واحدة: فإما أن يتم الطلب كله أو لا يتم أصلًا.
سطر بكمية ثابتة
الحالة المعتادة: تسليم عدد محدد من الأصوات إلى رابط واحد.
| المعامل | النوع | الوصف |
|---|---|---|
idمطلوب | integer | معرّف الموقع من /orders/getAllWebsites. |
amountمطلوب | integer | عدد الأصوات المطلوب تسليمها. صفر فأكثر، وبحد أقصى 2,147,483,647. |
ownNameمطلوب | url | رابط التصويت. يُحفظ في حقل `url` للطلب. |
custom_max_per_hour | integer | سقف التسليم، ويُقصّ إلى الحد الأقصى للموقع نفسه. |
extra_col | string | حقل نصي حر يُحفظ مع الطلب. |
curl -X POST "https://backend.toplistbot.com/orders/checkout?key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{
"id": 9,
"amount": 1000,
"ownName": "https://arena-top100.com/index.php?a=in&u=yourserver",
"custom_max_per_hour": 60
}
]'200 OK
Successfully purchased with token balanceسطر اشتراك
للمواقع التي قيمة `subscribeable` فيها 1. يُسعَّر من subscription_price_1d للموقع مضروبًا في عدد الأيام وفي خصم المستوى: Weekly هو 0.90، وMonthly هو 0.80، وأي شيء آخر 1.00. أما الكمية المسلَّمة فتُشتق في الخادم من subscription_speed الخاص بالموقع، فلا شيء ترسله يغيّرها.
[
{
"type": "subscription",
"website": { "id": 9 },
"subscription_days": 30,
"tier": { "name": "Monthly" },
"url": "https://arena-top100.com/index.php?a=in&u=yourserver"
}
]الاستجابات
200أُنشئت كل السطور وخُصم المبلغ من الرصيد. الجسم نص بسيط.400الجسم لم يكن JSON صالحًا.402الرصيد غير كافٍ. الرسالة تذكر المبلغ المطلوب ولم يُخصم شيء.422سطر أو أكثر غير صحيح. لم يُخصم شيء.429أُرسلت السلة نفسها خلال آخر 60 ثانية. أعد المحاولة بعد المدة المذكورة.
استجابة 422 تسمّي السطر المخالف: تُفهرس الأخطاء بصيغة items.[index].[field]، فسلة فيها ثلاثة سطور خاطئة تُصلَح في جولة واحدة لا في ثلاث.
{
"errors": {
"items.2.amount": ["Enter 0 or more votes; a negative amount is not allowed."]
}
}POST /orders/update
`id` مطلوب؛ وأرسل فقط الحقول التي تغيّرها. ولا يمكن تعديل طلبات الاشتراك.
| المعامل | النوع | الوصف |
|---|---|---|
idمطلوب | integer | الحملة المراد تعديلها. |
amount_to_do | integer | إجمالي الأصوات الجديد. الزيادة تُخصم فرقها، والنقصان يُعاد، وبين التغييرين مهلة 30 ثانية. |
url | url | رابط التصويت. |
custom_name | string | التسمية التي تختارها للحملة. |
custom_max_per_hour | integer | سقف التسليم. |
username_profile_id | integer | ربط ملف تصويت. |
proxy_profile_id | integer | ربط ملف وكيل. |
http_referral | url | المُحيل المرسل مع كل صوت. |
extra_col | string | حقل نصي حر. |
curl -X POST "https://backend.toplistbot.com/orders/update?key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"id":184223,"amount_to_do":2000,"custom_name":"EU launch"}'السقف اليومي
القيمة `type: "delete"` تزيل السقف. ومع ذلك يظل المدقق يطلب `max_votes_per_day` في تلك الحالة: أرسل أي عدد صحيح.
curl -X PATCH "https://backend.toplistbot.com/orders/updateLimit?key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"id":184223,"max_votes_per_day":500,"type":"set"}'السجلات والتحليلات
بيانات التسليم، صوتًا بصوت ومجمّعة. تقرأ قاعدة سجلات منفصلة وهي أبطأ من بقية الواجهة: استعلمها كل دقائق لا كل ثوانٍ.
- GET
/orders/logs/{id}مفتاح APIسجل تسليم الحملة صوتًا بصوت - GET
/orders/graph/{id}مفتاح APIسلسلة زمنية لحملة واحدة، جاهزة للرسم - GET
/api/orders/graph/summaryJWTسلسلة واحدة تشمل كل حملاتك - GET
/orders/grouped/usernames/{id}مفتاح APIالتسليمات مجمّعة حسب اسم المستخدم المصوّت - POST
/orders/averageمفتاح APIمتوسط التسليم عبر عدة حملات - GET
/api/logs/{id}/filtered-graphJWTسلسلة زمنية مُرشّحة
ملفات التصويت والوكيل
ملف التصويت هو قائمة مسمّاة بأسماء المستخدمين التي تصوّت بها الحملة. وملف الوكيل هو قائمة دول مسموح بها لعناوين IP المستخدمة. اربط أيًّا منهما بحملة عبر username_profile_id أو proxy_profile_id في /orders/update.
- GET
/advanced/profile/getمفتاح APIملفات التصويت الخاصة بك - GET
/advanced/profile/get/{id}مفتاح APIملف تصويت واحد - POST
/advanced/profile/createمفتاح APIإنشاء ملف تصويت، أو الكتابة فوق واحد بالمعرّف - DELETE
/advanced/profile/delete/{id}مفتاح APIحذف ملف تصويت - GET
/advanced/profile/proxy/getمفتاح APIملفات الوكيل الخاصة بك - GET
/advanced/profile/proxy/get/{id}مفتاح APIملف وكيل واحد - POST
/advanced/profile/proxy/createمفتاح APIإنشاء ملف وكيل، أو الكتابة فوق واحد بالمعرّف - DELETE
/advanced/profile/proxy/delete/{id}مفتاح APIحذف ملف وكيل
رموز ديسكورد
للقوائم التي توثّق المصوّتين عبر ديسكورد. وإضافة الرمز نفسه مرتين تُرفض كنسخة مكررة.
- GET
/api/discord-tokensJWTرموز ديسكورد الخاصة بك - POST
/api/discord-tokensJWTإضافة رمز - GET
/api/discord-tokens/statsJWTإحصاءات استخدام رموزك - GET
/api/discord-tokens/{id}JWTرمز واحد - PATCH
/api/discord-tokens/{id}JWTتغيير رمز أو حالة تفعيله - DELETE
/api/discord-tokens/{id}JWTإزالة رمز - PUT
/api/discord-tokens/{id}/toggleJWTتبديل الرمز بين مفعّل ومعطّل
الفوترة والمدفوعات
شراء الرموز ينتهي دائمًا في صفحة دفع مستضافة، لذا لا يمكن أن يكون الشحن آليًا بالكامل. أما كل ما بعد الشحن فيمكن.
- GET
/invoices/getمفتاح APIسجل الفوترة - GET
/api/subscriptions/subscriptionsJWTالاشتراكات الفعّالة - GET
/products/tokensByUserمفتاح APIباقات الرموز بأسعار حسابك - POST
/company/getمفتاح APIعنوان الفوترة الخاص بك - POST
/company/createمفتاح APIضبطه: country وregion وcity وaddress وpostalCode - GET
/api/stripe/checkout?product_id=JWTرابط Stripe Checkout لباقة رموز - GET
/api/stripe/subscription?plan=JWTرابط Stripe Checkout لخطة - GET
/api/stripe/portalJWTرابط بوابة الفوترة في Stripe - GET
/api/stripe/documentsJWTفواتير وإيصالات Stripe - GET
/coinpayments/checkoutمفتاح APIرابط دفع بالعملات الرقمية
السلة المحفوظة
سلة لوحة التحكم، محفوظة على الخادم لتبقى بعد تغيير الجهاز. لست بحاجة إليها لإنشاء الطلبات: فـ /orders/checkout يستقبل السلة داخل الطلب نفسه.
- GET
/api/cartJWTالسلة المحفوظة - PUT
/api/cartJWTاستبدالها - POST
/api/cartJWTاستبدالها، مثل PUT تمامًا - DELETE
/api/cartJWTتفريغها
الواجهات الداخلية
توجد من أجل Stripe ومجدول المهام وتحدي مكافحة إساءة التسجيل. تُوثَّق بأسرار مشتركة أو تواقيع وليست جزءًا من واجهة التكامل: أُدرجت هنا فقط ليكتمل الجرد.
- POST
/api/stripe/webhookأحداث الدفع من Stripe، موثّقة بالتوقيع - POST
/api/jobs/tickتشغيل المهام المستحقة، موثّق بسر مشترك - POST
/api/pow/challengeتحدي إثبات العمل عند التسجيل - POST
/api/logs/updateتتبّع نشاط البريد - POST
/api/order/{email}ينشئ طلبًا على حساب آخر — لقائمة المشرفين فقط - GET
/reset-password/{token}صفحة إعادة تعيين كلمة المرور القديمة المولّدة من الخادم، أُبقيت من أجل الروابط المرسلة سابقًا - GET
/عامفحص الجاهزية
أشكال الاستجابات
كل ما ستقرأه تقريبًا يأتي في كائنين: الموقع، وتعيده نقاط نهاية الفهرس، والحملة، وتعيدها نقاط نهاية الطلبات. في كل منهما نحو أربعين عمودًا؛ والجداول أدناه هي ما يحتاجه التكامل فعلًا.
ثلاثة حقول تصل كسلاسل JSON رغم أنها تحمل أرقامًا: accept_rate وtimeout في الموقع، وcustom_max_per_hour في الحملة. حوّلها إلى أرقام قبل الحساب، وإلا ستجمع نصوصًا بدل الأرقام.
{
"accept_rate": "70", // string, not number
"timeout": "150000", // string, not number
"custom_max_per_hour": "60" // string, not number
}كائن الموقع
تعيده /orders/getAllWebsites و/orders/getWebsiteDetailsByName، وهو مضمَّن داخل كل حملة تحت المفتاح `website`.
| المعامل | النوع | الوصف |
|---|---|---|
id | integer | معرّف الموقع. أرسله كـ `id` في سطر السلة، أو كـ `service` في نقطة نهاية SMM. |
name | string | الاسم المعروض، وهو النص الدقيق الذي تطابقه /orders/getWebsiteDetailsByName. |
price_per_1000 | number | رموز لكل 1,000 صوت مقبول. هذا هو الرقم الذي تستخدمه معادلة التكلفة. |
accept_rate | string | نسبة الأصوات المرسلة التي تُقبل. كل حسابات التقدّم والاسترداد تعتمد عليها. |
max_per_hour | integer | سقف التسليم الخاص بالموقع. يُقصّ إليه كل من custom_max_per_hour وinterval في SMM. |
active | integer | القيمة 1 تعني أنه قابل للطلب. المواقع غير الفعّالة تُعاد أيضًا، فرشّحها بنفسك. |
vote_reset_time | integer | عدد الساعات قبل أن تتمكن الهوية نفسها من التصويت مجددًا. |
speed_changeable | integer | القيمة 1 تعني أن الموقع يحترم سرعة تسليم مخصّصة. |
referer_must_be_set | integer | القيمة 1 تعني أن http_referral يجب ضبطه على الحملة. |
optional_data_possible | integer | القيمة 1 تعني أن الموقع يقبل حقل optional_data الخاص بالحملة. |
track_votes | integer | القيمة 1 تعني توفّر سجلات تسليم صوتًا بصوت لحملات هذا الموقع. |
subscribeable | integer | القيمة 1 تعني قبول سطور الاشتراك. |
subscription_price_1d | number | رموز لكل يوم اشتراك، قبل خصم المستوى. |
subscription_speed | integer | عدد الأصوات في الساعة التي يسلّمها الاشتراك. تُشتق الكمية من هذا على الخادم، لا من طلبك. |
الحقول غير المذكورة هنا تخدم واجهة لوحة التحكم نفسها. اقرأها إن شئت، لكنها ليست جزءًا من عقد التكامل وقد تتغير دون إشعار.
كائن الحملة
تعيده /orders/getAll و/orders/get/. لاحظ ما هو غائب: لا يوجد حقل للحالة.
| المعامل | النوع | الوصف |
|---|---|---|
id | integer | معرّف الحملة. كل نقاط النهاية في قسم الحملات تستقبله باسم `id`. |
vote_website_id | integer | الموقع الذي تعمل عليه هذه الحملة. |
website | object | كائن الموقع كاملًا، مضمَّنًا. موجود في /orders/getAll وغائب في /orders/get/. |
url | string | رابط التصويت: وهو `ownName` الذي أرسلته عند إنشاء الطلب. |
custom_name | string | تسميتك الخاصة للحملة، أو null. |
amount_to_do | integer | الأصوات المقبولة المشتراة. يعدّ الأصوات المقبولة لا المحاولات. |
amount_done | integer | الأصوات المرسَلة حتى الآن. وحدة مختلفة عن amount_to_do — راجع قسم التقدّم. |
running | integer | القيمة 1 تعني أنها تسلّم، و0 تعني موقوفة مؤقتًا. |
done | integer | القيمة 1 تعني مغلقة: أُلغيت واستُردت قيمتها وصُفّرت الكميتان. وهي ليست مؤشر اكتمال. |
archive | integer | القيمة 1 تعني مؤرشفة. والحملات المؤرشفة تظل تُعاد من /orders/getAll. |
custom_max_per_hour | string | سقف التسليم الذي حدّدته لهذه الحملة، كنص. |
max_votes_per_day | integer | السقف اليومي للأصوات، أو null إن لم يكن هناك سقف. |
is_subscription | integer | القيمة 1 تعني اشتراكًا. والاشتراكات لا يمكن تعديلها بعد الشراء. |
paused_unpaused | datetime | آخر مرة أُوقفت فيها الحملة أو استُؤنفت أو غُيّر حجمها. ومن هنا تبدأ مهلة الثلاثين ثانية بين التعديلات. |
الحقول غير المذكورة هنا تخدم واجهة لوحة التحكم نفسها. اقرأها إن شئت، لكنها ليست جزءًا من عقد التكامل وقد تتغير دون إشعار.
هل تعمل؟ هل انتهت؟
ليس للحملة حقل حالة، لذا تستنتج حالتها من أربعة أعمدة. قيّم الشروط بالترتيب وخذ أول تطابق.
| الفحص | يعني |
|---|---|
1done === 1 | أُلغيت. استُرد ما لم يُنفق، وصُفّرت الكميتان، وأُرشفت الحملة. |
2running === 0 | أوقفتها أنت مؤقتًا. استأنفها عبر /orders/unpause. |
3remaining_accepted === 0 | سُلّم كل ما اشتريته. |
4running === 1 | تعمل بشكل طبيعي. |
5archive === 1 | مخفية في لوحة التحكم لكنها ما زالت تُعاد من /orders/getAll. رشّحها إن أردت أن تطابق قائمتك ما تعرضه اللوحة. |
الترتيب مهم. فالإلغاء يضبط done وarchive معًا، لذا فحص archive أولًا سيُظهر حملة ملغاة على أنها مؤرشفة فحسب، وفحص المتبقي قبل running سيُظهر حملة موقوفة مؤقتًا على أنها تسلّم.
التقدّم والاستردادات
يعدّ amount_to_do الأصوات المقبولة، ويعدّ amount_done الإرسالات. ولا يُقبل من الإرسالات إلا نسبة accept_rate، فالحقلان بوحدتين مختلفتين وطرح أحدهما من الآخر مباشرة خطأ.
هذا أشيع خطأ في التكامل، وهو يفشل بصمت: تبقى الأرقام معقولة المظهر بينما شريط التقدّم خاطئ ببساطة. فعند نسبة قبول 70 بالمئة تظهر حملة منتهية كأنها أُنجزت بنسبة 70 بالمئة، وعند 50 بالمئة تظهر حملة سُلّم نصفها كأنها لم تبدأ. حوّل الإرسالات إلى أصوات مقبولة أولًا، في كل مرة.
// accept_rate arrives as a STRING, and it is per-site, not global.
const rate = Number(order.website.accept_rate)
// amount_done counts SUBMISSIONS; amount_to_do counts ACCEPTED votes.
// Convert before comparing them.
const delivered = order.amount_done * rate / 100
const remaining = Math.max(order.amount_to_do - delivered, 0)
const percent = 100 * delivered / order.amount_to_do
// What cancelling right now would put back on your balance:
const refund = (remaining / 1000) * order.website.price_per_1000الحساب نفسه يسعّر الإلغاء: فالمبلغ المسترد هو ما لم يُنفق بسعر قائمة الموقع، ما يتيح لك معرفة قيمة إيقاف حملة قبل أن تقرر.
حملة من البداية إلى النهاية
ست استدعاءات، ومفتاح API واحد، بلا متصفح وبلا تسجيل دخول. والشيء نفسه عبر نقطة نهاية SMM هو ثلاثة استدعاءات — services وadd وstatus — ولا يمس واجهة المنصة إطلاقًا.
KEY=YOUR_API_KEY
BASE=https://backend.toplistbot.com
# 1. What can I order, and what does it cost?
curl -s "$BASE/orders/getAllWebsites" \
| jq '.[] | {id, name, price_per_1000, max_per_hour}'
# 2. What can I afford?
curl -s -X POST "$BASE/api/v2" -d "key=$KEY" -d "action=balance"
# 3. Launch it. cost = price_per_1000 * amount / 1000
curl -s -X POST "$BASE/orders/checkout?key=$KEY" \
-H "Content-Type: application/json" \
-d '[{"id":9,"amount":1000,
"ownName":"https://arena-top100.com/index.php?a=in&u=me",
"custom_max_per_hour":60}]'
# 4. Find the campaign that was just created.
curl -s "$BASE/orders/getAll?key=$KEY" | jq '.[0] | {id, url, amount_to_do, amount_done}'
# 5. Watch it. Poll every few minutes.
curl -s "$BASE/orders/graph/184223?key=$KEY"
# 6. Slow it down, or stop it.
curl -s -X PATCH "$BASE/orders/updateLimit?key=$KEY" \
-H "Content-Type: application/json" -d '{"id":184223,"max_votes_per_day":200,"type":"set"}'
curl -s -X POST "$BASE/orders/pause?key=$KEY" \
-H "Content-Type: application/json" -d '{"id":184223}'الأخطاء
تعود الأخطاء برمز حالة HTTP مطابق. وتعيد أخطاء التحقق كائن `errors` مفهرسًا حسب اسم الحقل.
400تعذّرت قراءة الطلب أصلًا: JSON تالف، أو إجراء لا تعرفه نقطة نهاية SMM.401بيانات اعتماد مفقودة أو منتهية أو خاطئة.402الرصيد غير كافٍ. لم يُخصم شيء.403موثّق، لكن غير مسموح له بهذا الإجراء.404لا يوجد سجل بهذا المعرّف — بما في ذلك سجل يخص شخصًا آخر.409يتعارض مع الحالة الحالية للحساب، مثل تفعيل التحقق بخطوتين مرتين.422فشل التحقق. والجسم يسمّي كل حقل.429تجاوز الحد. والرسالة تذكر مدة الانتظار.500خطأ من طرفنا. لم يُخصم شيء.503خدمة معتمدة غير متاحة. أعد المحاولة لاحقًا.
{
"errors": {
"quantity": ["The quantity must be at least 1."]
}
}حين يكون جسم الطلب مصفوفة، تحمل مفاتيح الخطأ رقم السطر الذي فشل.
بعض نقاط النهاية تجيب بنص بسيط لا بـ JSON، ومنها /orders/checkout و/orders/pause و/orders/updateLimit. اعتمد على رمز الحالة لا على شكل الجسم.
حدود المعدل
استجابة 429 تذكر دائمًا مدة الانتظار. التزم بها بدل إعادة المحاولة عشوائيًا.
- تُقبل السلة نفسها مرة واحدة كل 60 ثانية على الأكثر.
- يمكن تغيير إجمالي أصوات الحملة مرة كل 30 ثانية.
- محاولات تسجيل الدخول محدودة لكل عنوان ولكل IP.
- إعادة تعيين كلمة المرور: 3 لكل عنوان و10 لكل IP كل 15 دقيقة.
- تقبل `status` و`cancel` ما لا يزيد عن 100 معرّف طلب في الاستدعاء الواحد.
- تابع التقدّم كل دقائق لا كل ثوانٍ. فالتسليم يُقاس بالأصوات في الساعة.
الحدود وملاحظات
- يجب أن تتراوح كمية الطلب بين 1 و50000 إجراء.
- الفاصل الافتراضي 15 في الساعة بحد أقصى 4000. وطلب قيمة أعلى من الحد الأقصى للموقع يُرفض بالخطأ 400 مع بيان الحد.
- إجراءا `refill` و`refill_status` غير مطبَّقين — أنشئ طلبًا جديدًا بدلًا من ذلك.
- حقل `status` هو دائمًا النص "Completed" وليس مؤشر تقدّم. استخدم `remains == 0` لتعرف أن الطلب انتهى، و`start_count` لمعرفة ما سُلّم.
- لا يمكن تعديل الاشتراكات بعد الشراء — أوقفها مؤقتًا أو ألغها.
- تضع مواقع الإدراج قواعدها الخاصة وتغيّرها مع الوقت. وأنت مسؤول عن التأكد من توافق استخدامك مع شروط أي موقع تروّج عليه. ولا نَعِد بأي ترتيب أو موضع معيّن.
