التوثيق

توثيق واجهة API

كل ما تفعله لوحة التحكم متاح عبر HTTP. وجّه لوحة SMM إلى نقطة نهاية واحدة، أو أدر المنصة بالكامل — الفهرس والحملات والسجلات والفواتير — من سكربت أو من وكيل ذكاء اصطناعي.

في هذه الصفحة

نظرة عامة

تقدّم Toplistbot واجهتَي HTTP. كلتاهما JSON عبر HTTPS، وكلتاهما تنفقان الرصيد نفسه من الرموز، وأي واحدة منهما تكفي لتشغيل الحملات دون فتح لوحة التحكم أبدًا.

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

Base URL
https://backend.toplistbot.com/api
https://backend.toplistbot.com

المرجع أدناه مكتوب لهذين المضيفين. اختيارك بينهما يحدد طريقة المصادقة — راجع قسم المصادقة.

البدء

من حساب جديد إلى حملة قيد التشغيل في خمس خطوات. كل ما يلي يستخدم نقطة اتصال SMM لأنها الأسرع؛ وتعمل واجهة المنصة بالطريقة نفسها بمجرد حصولك على JWT.

  1. أنشئ حسابًا

    سجّل حسابًا وفعّل بريدك الإلكتروني. يمنحك التفعيل 100 رمز مجاني في رصيدك، وهو ما يكفي لتشغيل حملة حقيقية قبل أن تنفق شيئًا.

  2. انسخ مفتاح API

    افتح لوحة التحكم وأنشئ مفتاح API. تعامل معه كأنه كلمة مرور — فهو ينفق من رصيد الرموز لديك. يمكنك تجديده في أي وقت، وعندها يبطل المفتاح القديم فورًا.

  3. ابحث عن الخدمة المطلوبة

    اعرض كل المواقع التي يمكنك الطلب عليها. لكل عنصر معرّف خدمة رقمي وسعر بالرموز لكل 1000 إجراء. دوّن معرّف الموقع الذي تريد الترويج عليه.

    cURL
    curl -X POST https://backend.toplistbot.com/api/v2 -d "key=YOUR_API_KEY" -d "action=services"
  4. أنشئ طلبك الأول

    أرسل معرّف الخدمة، والرابط الذي ستعمل عليه الحملة، وعدد الإجراءات المطلوبة. تُخصم التكلفة فورًا، وتتضمن الاستجابة معرّف الطلب.

    cURL
    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"
  5. تابع التنفيذ

    استعلم عن معرّف الطلب لمعرفة ما تم تنفيذه. وعندما تطمئن إلى سير العمل، اربط الاستدعاءات نفسها بلوحتك أو بسكربتاتك.

    cURL
    curl -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. احتفظ بالمفتاح في متغير بيئة بدلًا من كتابته داخل الرسالة.

Prompt
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/getAllJWTأي شيء يسجّل فيه شخص الدخول
/orders/getAllمفتاح APIالسكربتات والمهام المجدولة والوكلاء

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

مفتاح API

أرسل مفتاحك في حقل `key` مع أي طلب: كمعامل استعلام، أو حقل نموذج، أو حقل JSON، أو ترويسة `Authorization: Bearer`. أنشئه ودوّره من لوحة التحكم. طلب GET إلى /api/v2 يعيد الحالة ok وهو طريقة رخيصة للتأكد من أن المفتاح فعّال.

cURL
# 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"
Health check
curl https://backend.toplistbot.com/api/v2?key=YOUR_API_KEY

JWT

سجّل الدخول لتحصل على رمز، ثم أرسله كرمز bearer على مسارات /api. تنتهي صلاحية الرموز، لذا استدعِ /auth/refresh قبل ذلك. وإن كان التحقق بخطوتين مفعّلًا على الحساب فسيحتاج تسجيل الدخول أيضًا إلى `two_factor_code`.

Login
curl -X POST https://backend.toplistbot.com/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","password":"..."}'
Response
{
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
  "token_type": "bearer",
  "expires_in": 3600,
  "user": { "id": 4211, "email": "[email protected]", "tokens": 528.41, "...": "..." }
}
Authenticated request
curl https://backend.toplistbot.com/api/orders/getAll \
  -H "Authorization: Bearer YOUR_JWT"

الاستدعاء من المتصفح

كل المسارات تجيب بترويسة Access-Control-Allow-Origin مفتوحة، لذا تستطيع صفحة أو إضافة متصفح أو وكيل يعمل داخل المتصفح استدعاء الواجهة مباشرة دون أن تبني وسيطًا خاصًا بك. ويبقى التحذير أعلاه قائمًا: المفتاح الذي ترسله إلى المتصفح مفتاح نشرته، فهذا للأدوات الخاصة بك لا لصفحة عامة.

JavaScript
// 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 formula
cost_in_tokens = (rate * quantity) / 1000

موقع سعره 13 يكلّف 13 رمزًا لكل 1000 إجراء، وبالتالي يكلّف طلب من 500 إجراء 6.5 رمز. تُخصم التكلفة عند قبول الطلب، ويعيد الإلغاء ما لم يُستهلك منها.

تشير استجابتا balance وstatus إلى حقل عملة بقيمة USD من أجل التوافق مع Perfect Panel، لكن القيمة هي رصيد رموز وليست دولارات. تعامل مع الرقم على أنه رموز.

واجهة لوحة SMM

نقطة اتصال واحدة تنفّذ كل شيء. أرسل حقل `action` مع كل طلب POST لاختيار العملية؛ ويحمل كل طلب أيضًا قيمة `key` الخاصة بك.

POSThttps://backend.toplistbot.com/api/v2
الإجراءالمعاملات
services
addservice, link, quantity, interval?
statusorders
balance
cancelorders

تُقبل `refill` و`refill_status` للتوافق فقط وكلتاهما تجيبان بأنها غير منفّذة. لا شيء هنا قابل لإعادة التعبئة؛ أنشئ طلبًا جديدًا بدلًا من ذلك.

action=services

تعرض كل المواقع التي يمكنك الطلب عليها مع السعر الحالي والحدود. استخدم معرّف `service` في استدعاءات add.

cURL
curl -X POST https://backend.toplistbot.com/api/v2 \
  -d "key=YOUR_API_KEY" \
  -d "action=services"
Response
[
  {
    "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.
intervalintegerعدد الإجراءات في الساعة. الافتراضي 15، وبحد أقصى 4000، ولا يمكن أن يتجاوز الحد الأقصى للموقع نفسه.
cURL
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"
Response
{
  "order_id": 184223
}

action=status

يعيد تقدّم طلب واحد أو أكثر. مرّر معرّفًا واحدًا للحصول على كائن مباشر، أو قائمة مفصولة بفواصل.

cURL
curl -X POST https://backend.toplistbot.com/api/v2 \
  -d "key=YOUR_API_KEY" \
  -d "action=status" \
  -d "orders=184223"
Response — single order
{
  "charge": 13.5,
  "start_count": 0,
  "status": "Completed",
  "remains": 1000,
  "currency": "USD"
}

مع عدة معرّفات تُفهرس الاستجابة حسب معرّف الطلب، وتعيد الطلبات المجهولة أو غير التابعة لك مدخل خطأ بدل إفشال الطلب بأكمله.

Response — multiple orders
{
  "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
curl -X POST https://backend.toplistbot.com/api/v2 \
  -d "key=YOUR_API_KEY" \
  -d "action=balance"
Response
{
  "balance": 528.41,
  "currency": "USD"
}

action=cancel

يوقف الطلب ويعيد ما لم يُستهلك إلى رصيدك. ولا يمكن إلغاء الطلبات المكتملة.

cURL
curl -X POST https://backend.toplistbot.com/api/v2 \
  -d "key=YOUR_API_KEY" \
  -d "action=cancel" \
  -d "orders=184223,184224"
Response
[
  { "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
curl "https://backend.toplistbot.com/orders/getAllWebsites"

اطلب أقل

الفهرس الكامل نحو 665 كيلوبايت لـ 396 موقعًا، ونصف ذلك الحجم يأتي من حقلين لن تطلب بهما أبدًا: كتلة JSON للشعبية والوصف التسويقي. اقتصر على الحقول التي تطلب بها واستبعد المواقع غير الفعّالة فيصبح نحو 40 كيلوبايت.

cURL + jq
# 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_hourintegerسقف التسليم، ويُقصّ إلى الحد الأقصى للموقع نفسه.
extra_colstringحقل نصي حر يُحفظ مع الطلب.
cURL
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
    }
  ]'
Response
200 OK
Successfully purchased with token balance

سطر اشتراك

للمواقع التي قيمة `subscribeable` فيها 1. يُسعَّر من subscription_price_1d للموقع مضروبًا في عدد الأيام وفي خصم المستوى: Weekly هو 0.90، وMonthly هو 0.80، وأي شيء آخر 1.00. أما الكمية المسلَّمة فتُشتق في الخادم من subscription_speed الخاص بالموقع، فلا شيء ترسله يغيّرها.

Body
[
  {
    "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]، فسلة فيها ثلاثة سطور خاطئة تُصلَح في جولة واحدة لا في ثلاث.

422 body
{
  "errors": {
    "items.2.amount": ["Enter 0 or more votes; a negative amount is not allowed."]
  }
}

POST /orders/update

`id` مطلوب؛ وأرسل فقط الحقول التي تغيّرها. ولا يمكن تعديل طلبات الاشتراك.

المعاملالنوعالوصف
idمطلوبintegerالحملة المراد تعديلها.
amount_to_dointegerإجمالي الأصوات الجديد. الزيادة تُخصم فرقها، والنقصان يُعاد، وبين التغييرين مهلة 30 ثانية.
urlurlرابط التصويت.
custom_namestringالتسمية التي تختارها للحملة.
custom_max_per_hourintegerسقف التسليم.
username_profile_idintegerربط ملف تصويت.
proxy_profile_idintegerربط ملف وكيل.
http_referralurlالمُحيل المرسل مع كل صوت.
extra_colstringحقل نصي حر.
cURL
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
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 في الحملة. حوّلها إلى أرقام قبل الحساب، وإلا ستجمع نصوصًا بدل الأرقام.

Types to watch
{
  "accept_rate": "70",          // string, not number
  "timeout": "150000",          // string, not number
  "custom_max_per_hour": "60"   // string, not number
}

كائن الموقع

تعيده /orders/getAllWebsites و/orders/getWebsiteDetailsByName، وهو مضمَّن داخل كل حملة تحت المفتاح `website`.

المعاملالنوعالوصف
idintegerمعرّف الموقع. أرسله كـ `id` في سطر السلة، أو كـ `service` في نقطة نهاية SMM.
namestringالاسم المعروض، وهو النص الدقيق الذي تطابقه /orders/getWebsiteDetailsByName.
price_per_1000numberرموز لكل 1,000 صوت مقبول. هذا هو الرقم الذي تستخدمه معادلة التكلفة.
accept_ratestringنسبة الأصوات المرسلة التي تُقبل. كل حسابات التقدّم والاسترداد تعتمد عليها.
max_per_hourintegerسقف التسليم الخاص بالموقع. يُقصّ إليه كل من custom_max_per_hour وinterval في SMM.
activeintegerالقيمة 1 تعني أنه قابل للطلب. المواقع غير الفعّالة تُعاد أيضًا، فرشّحها بنفسك.
vote_reset_timeintegerعدد الساعات قبل أن تتمكن الهوية نفسها من التصويت مجددًا.
speed_changeableintegerالقيمة 1 تعني أن الموقع يحترم سرعة تسليم مخصّصة.
referer_must_be_setintegerالقيمة 1 تعني أن http_referral يجب ضبطه على الحملة.
optional_data_possibleintegerالقيمة 1 تعني أن الموقع يقبل حقل optional_data الخاص بالحملة.
track_votesintegerالقيمة 1 تعني توفّر سجلات تسليم صوتًا بصوت لحملات هذا الموقع.
subscribeableintegerالقيمة 1 تعني قبول سطور الاشتراك.
subscription_price_1dnumberرموز لكل يوم اشتراك، قبل خصم المستوى.
subscription_speedintegerعدد الأصوات في الساعة التي يسلّمها الاشتراك. تُشتق الكمية من هذا على الخادم، لا من طلبك.

الحقول غير المذكورة هنا تخدم واجهة لوحة التحكم نفسها. اقرأها إن شئت، لكنها ليست جزءًا من عقد التكامل وقد تتغير دون إشعار.

كائن الحملة

تعيده /orders/getAll و/orders/get/. لاحظ ما هو غائب: لا يوجد حقل للحالة.

المعاملالنوعالوصف
idintegerمعرّف الحملة. كل نقاط النهاية في قسم الحملات تستقبله باسم `id`.
vote_website_idintegerالموقع الذي تعمل عليه هذه الحملة.
websiteobjectكائن الموقع كاملًا، مضمَّنًا. موجود في /orders/getAll وغائب في /orders/get/.
urlstringرابط التصويت: وهو `ownName` الذي أرسلته عند إنشاء الطلب.
custom_namestringتسميتك الخاصة للحملة، أو null.
amount_to_dointegerالأصوات المقبولة المشتراة. يعدّ الأصوات المقبولة لا المحاولات.
amount_doneintegerالأصوات المرسَلة حتى الآن. وحدة مختلفة عن amount_to_do — راجع قسم التقدّم.
runningintegerالقيمة 1 تعني أنها تسلّم، و0 تعني موقوفة مؤقتًا.
doneintegerالقيمة 1 تعني مغلقة: أُلغيت واستُردت قيمتها وصُفّرت الكميتان. وهي ليست مؤشر اكتمال.
archiveintegerالقيمة 1 تعني مؤرشفة. والحملات المؤرشفة تظل تُعاد من /orders/getAll.
custom_max_per_hourstringسقف التسليم الذي حدّدته لهذه الحملة، كنص.
max_votes_per_dayintegerالسقف اليومي للأصوات، أو null إن لم يكن هناك سقف.
is_subscriptionintegerالقيمة 1 تعني اشتراكًا. والاشتراكات لا يمكن تعديلها بعد الشراء.
paused_unpauseddatetimeآخر مرة أُوقفت فيها الحملة أو استُؤنفت أو غُيّر حجمها. ومن هنا تبدأ مهلة الثلاثين ثانية بين التعديلات.

الحقول غير المذكورة هنا تخدم واجهة لوحة التحكم نفسها. اقرأها إن شئت، لكنها ليست جزءًا من عقد التكامل وقد تتغير دون إشعار.

هل تعمل؟ هل انتهت؟

ليس للحملة حقل حالة، لذا تستنتج حالتها من أربعة أعمدة. قيّم الشروط بالترتيب وخذ أول تطابق.

الفحصيعني
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 بالمئة تظهر حملة سُلّم نصفها كأنها لم تبدأ. حوّل الإرسالات إلى أصوات مقبولة أولًا، في كل مرة.

JavaScript
// 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 — ولا يمس واجهة المنصة إطلاقًا.

bash
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خدمة معتمدة غير متاحة. أعد المحاولة لاحقًا.
Validation error
{
  "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` لمعرفة ما سُلّم.
  • لا يمكن تعديل الاشتراكات بعد الشراء — أوقفها مؤقتًا أو ألغها.
  • تضع مواقع الإدراج قواعدها الخاصة وتغيّرها مع الوقت. وأنت مسؤول عن التأكد من توافق استخدامك مع شروط أي موقع تروّج عليه. ولا نَعِد بأي ترتيب أو موضع معيّن.
ابدأ مجاناً

ابدأ الترويج الآن!

أكّد بريدك الإلكتروني واحصل على 100 رمز مجاني لتجربة خدمتنا. دون أي التزام.

بلا بطاقة ائتمان
إلغاء في أي وقت
دعم على مدار الساعة