AR

التوثيق

API التبادل للشركاء

واجهة REST JSON API لدمج تبادل العملات المشفرة في موقعك أو بوتك أو خدمتك: كتالوج الأصول ← عرض السعر ← إنشاء التبادل ← متابعة الحالة.

Base URL https://snapex.pro/api/v1/partner

1. نظرة عامة

تتيح لك API التبادل للشركاء تنفيذ عمليات تبادل العملات المشفرة من تطبيقك عبر طلبات HTTP بسيطة. ترسل JSON — فتُعيد API سعر الصرف وعنوان الإيداع وحالة التبادل. يشرح هذا القسم المسار العام؛ وكل خطوة مشروحة بالتفصيل أدناه.

كيف يتم التبادل

يتبع كل تبادل المسار نفسه المكوّن من أربع خطوات:

  1. الكتالوج (GET /assets). تعرّف على الأصول المتاحة وحدودها. يوفّر الكتالوج الرموز المختصرة للأصول — usdt وbtc وeth وxmr وغيرها.
  2. عرض السعر (POST /quotes). تسأل: "كم BTC سيحصل العميل مقابل 20 USDT؟" فتجيب API بسعر الصرف والمبالغ الدقيقة. عرض السعر غير ملزم ويبقى صالحًا لمدة دقيقتين.
  3. إنشاء التبادل (POST /exchanges). تؤكّد عرض السعر — فتفتح API طلبًا وتُعيد عنوان إيداع يجب على العميل إرسال الأموال إليه.
  4. الحالة (GET /exchanges/{quote_id}). تستعلم من API لمعرفة ما إذا وصل الإيداع وتم إرسال الدفعة.

ما تحتاجه للبدء

  1. حساب في لوحة تحكم الشريك.
  2. طلب وصول إلى API تمت الموافقة عليه (يُرسل من لوحة التحكم ويراجعه المشرف).
  3. مفتاح API يبدأ بـ spx_… — يُصدر في لوحة التحكم بعد الموافقة. يُعرض المفتاح مرة واحدة فقط عند إصداره أو إعادة إصداره: احفظه في مكان آمن فورًا.

الطرق

الطريقة المسار رمز HTTP عند النجاح الغرض
GET /assets 200 كتالوج الأصول والحدود
POST /quotes 201 عرض السعر (سعر الصرف والمبالغ)
POST /exchanges 201 إنشاء التبادل والحصول على عنوان الإيداع
GET /exchanges/{quote_id} 200 الحالة الحالية لعرض السعر أو التبادل

صيغة البيانات

  • جميع الطلبات والاستجابات بصيغة JSON وبترميز UTF-8.
  • جميع المبالغ المالية نصوص (strings): "20"، "0.000312". الفاصل العشري هو النقطة. استخدام النصوص مقصود: الأرقام العشرية العائمة تفقد الدقة مع مبالغ العملات المشفرة.
  • التواريخ بصيغة ISO-8601 مع المنطقة الزمنية، مثل 2026-07-27T13:02:00+00:00.

الترويسات (headers) لكل طلب

X-API-Key: spx_your_key
Content-Type: application/json   (POST requests only)
Accept: application/json

القواعد الأساسية

  • عرض السعر صالح لمدة دقيقتين (الحقل expires_at) — يجب إنشاء التبادل قبل انتهاء صلاحيته.
  • طلب واحد كحد أقصى لكل عنوان IP كل 7 ثوانٍ عبر جميع الطرق؛ تجاوز ذلك يُعيد HTTP 429 (انظر "الأخطاء والحدود").
  • إعادة محاولة إنشاء التبادل بالمعاملات نفسها آمنة: لا يُنشأ تبادل مكرر — بل يُعاد التبادل نفسه.

2. المصادقة

يجب أن يتضمن كل طلب إلى API الترويسة X-API-Key مع مفتاحك. لا رموز ولا تواقيع ولا جلسات — هذه الترويسة فقط.

GET https://snapex.pro/api/v1/partner/assets
X-API-Key: spx_your_key
Accept: application/json

من أين تحصل على المفتاح

لوحة تحكم الشريك ← تبويب "API" ← "إصدار مفتاح". يبدأ المفتاح بـ spx_ ويُعرض مرة واحدة. إعادة الإصدار تُبطل المفتاح القديم فورًا.

أخطاء المصادقة

HTTP error السبب ما الذي تفعله
401 unauthorized الترويسة X-API-Key مفقودة أو المفتاح غير صالح تحقّق من إرسال الترويسة ومن نسخ المفتاح كاملًا
403 api_access_pending طلب الوصول لا يزال قيد المراجعة انتظر موافقة المشرف
403 api_not_approved لم تتم الموافقة على الوصول إلى API تواصل مع الدعم

3. كتالوج الأصول — GET /assets

دليل الأصول المتاحة وحدود مبالغ الإرسال. يبدأ الدمج من هنا: فهو يوفّر رموز الأصول لعروض الأسعار ونطاقات المبالغ المسموح بها. الاستجابة عند النجاح — HTTP 200.

تقبل API فقط الرموز المختصرة من الحقل code في هذا الكتالوج (usdt وbtc وeth وxmr وغيرها). لا تُقبل المعرّفات الداخلية الخام للبلوكتشين. نادرًا ما يتغير الكتالوج — يمكنك تخزينه مؤقتًا لديك لمدة 5–10 دقائق.

مثال على الطلب

GET https://snapex.pro/api/v1/partner/assets
X-API-Key: spx_your_key
Accept: application/json

مثال على الاستجابة

{
  "assets": [
    {
      "code": "usdt",
      "network": "TRON",
      "symbol": "USDT",
      "name": "USDT TRON",
      "min_amount": "10",
      "max_amount": "5000",
      "min_usd": "10",
      "max_usd": "5000"
    },
    {
      "code": "btc",
      "network": "Bitcoin",
      "symbol": "BTC",
      "name": "BTC",
      "min_amount": "0.000085",
      "max_amount": "0.0425",
      "min_usd": "10",
      "max_usd": "5000"
    }
  ]
}

حقول الاستجابة

الحقل الوصف
assets[].code الرمز المختصر للأصل. هذا بالضبط ما تمرّره في from_asset_id وto_asset_id
assets[].network شبكة البلوكتشين (TRON وBitcoin وEthereum وغيرها)
assets[].symbol رمز تداول الأصل (USDT، BTC…)
assets[].name اسم مقروء
assets[].min_amount / max_amount الحد الأدنى والأقصى لمبلغ الإرسال بوحدات الأصل (محوّلة من حدود USD بسعر الصرف الحالي)
assets[].min_usd / max_usd الحدود نفسها بالدولار الأمريكي

حدود USD حسب نوع المسار

تعتمد الحدود على ما إذا كانت Monero (XMR) جزءًا من التبادل. يُطبَّق التحقق على قيمة USD للمبلغ الذي يرسله العميل.

المسار الحد الأدنى USD الحد الأقصى USD
تبادل عادي (TOKEN ↔ TOKEN) $10 $7000
إرسال XMR (XMR → TOKEN) $10 $1000
استلام XMR (TOKEN → XMR) $10 $1000

الكتالوج الحالي

يعرض الجدول أدناه البيانات نفسها التي يُعيدها GET /assets، للرجوع السريع.

رمز API الشبكة الأصل الحد الأدنى للإرسال الحد الأقصى للإرسال الحد الأدنى USD الحد الأقصى USD
aave APTOS AAVE 0.05911913 41.38338753 $10 $7000
btc_aptos APTOS BTC 0.00012054 0.08437395 $10 $7000
doge APTOS DOGE 116.24257501 81369.80250387 $10 $7000
eth APTOS ETH 0.00398663 2.79063463 $10 $7000
link APTOS LINK 0.76569679 535.98774885 $10 $7000
sol APTOS SOL 0.0909091 63.63636364 $10 $7000
uni APTOS UNI 1.30890053 916.23036649 $10 $7000
xrp APTOS XRP 7.142858 5000 $10 $7000
zec APTOS ZEC 0.00815222 5.70655275 $10 $7000
avax Avalanche AVAX 0.96432016 675.024108 $10 $7000
cfi Base CFI 15268.57422054 10688001.9543775 $10 $7000
btc Bitcoin BTC 0.00012054 0.08437395 $10 $7000
aster BNB Chain ASTER 14.01243183 9808.70228066 $10 $7000
aurora BNB Chain AURORA 163.17206495 114220.44545974 $10 $7000
bnb BNB Chain BNB 0.01335595 9.34916459 $10 $7000
usdc HYPERCORE USDC 10.00325106 7002.27573962 $10 $7000
mon Monad MON 395.30801017 276715.60711602 $10 $7000
xmr Monero XMR 0.0191703 1.91702909 $10 $1000
op Optimism OP 70.13065341 49091.45738511 $10 $7000
usdt0 Optimism USDT0 10.00953 7006.67035 $10 $7000
pol Polygon POL 97.83969944 68487.78960551 $10 $7000
rhea Solana RHEA 119.41011404 83587.07982566 $10 $7000
strk Solana STRK 86.68891683 60682.24177539 $10 $7000
zec_solana Solana ZEC 0.00815222 5.70655275 $10 $7000
xlm Stellar XLM 50.9325755 35652.8028196 $10 $7000
gram TON GRAM 6.84931507 4794.52054795 $10 $7000
usdt TRON USDT 10.008568 7005.997134 $10 $7000
okb X Layer OKB 0.07948494 55.63945632 $10 $7000

4. عرض السعر — POST /quotes

يحسب سعر الصرف ومبالغ التبادل الدقيقة. لا يُنشئ شيئًا ولا يُلزمك بشيء: لا يُخصَّص عنوان إيداع ولا تُحجز أي أموال. الاستجابة عند النجاح — HTTP 201. عرض السعر صالح لمدة دقيقتين.

وضعان: side=send وside=receive

تحدد المعاملة side أيّ المبلغين هو الثابت:
side=send — "يرسل العميل X بالضبط، فكم سيستلم؟" يُحدَّد المبلغ بأصل الإرسال (from).
side=receive — "يريد العميل استلام Y بالضبط، فكم يجب أن يرسل؟" يُحدَّد المبلغ بأصل الاستلام (to).

الوضع amount — بأي أصل amount_usd
side=send بأصل from_asset_id (ما يرسله العميل) مسموح: مبلغ الإرسال بـ USD بدلًا من amount
side=receive بأصل to_asset_id (ما يستلمه العميل) غير مسموح — amount فقط

مرّر إما amount أو amount_usd — واحدًا منهما فقط. إرسال الاثنين معًا يُعيد الخطأ 422.

مثال على الطلب

POST https://snapex.pro/api/v1/partner/quotes
Content-Type: application/json
X-API-Key: spx_your_key

{
  "from_asset_id": "usdt",
  "to_asset_id": "btc",
  "side": "send",
  "amount": "20",
  "recipient_address": "bc1qexampleaddress"
}

معاملات الطلب

الحقل إلزامي الوصف
from_asset_id نعم رمز الأصل الذي يرسله العميل (من كتالوج GET /assets)
to_asset_id نعم رمز الأصل الذي يستلمه العميل. يجب أن يختلف عن from_asset_id
side نعم send أو receive — انظر الجدول أعلاه
amount نعم، ما لم يُستخدم amount_usd المبلغ كنص، مثل "20" أو "0.0005". في send — بأصل from، وفي receive — بأصل to
amount_usd لا مع side=send فقط: مبلغ الإرسال بالدولار الأمريكي، مثل "100". لا يُستخدم مع amount
recipient_address نعم عنوان محفظة العميل على شبكة أصل الاستلام (to). مطلوب منذ مرحلة عرض السعر — إذ يُستخدم للتحقق من المسار. اسم بديل: recipient

مثال على الاستجابة

{
  "quote_id": "pq_abc123",
  "status": "quoted",
  "side": "send",
  "from_symbol": "USDT",
  "to_symbol": "BTC",
  "from_network": "TRON",
  "to_network": "Bitcoin",
  "request_amount": "20",
  "send_amount": "20",
  "receive_amount": "0.000312",
  "amount_in_usd": "20",
  "amount_out_usd": "19.85",
  "expires_at": "2026-07-27T13:02:00+00:00"
}

حقول الاستجابة

الحقل الوصف
quote_id معرّف عرض السعر (pq_…). مطلوب لإنشاء التبادل والتحقق من حالته
status quoted — عرض السعر نشط، ولم يُنشأ تبادل بعد
side وضع تثبيت المبلغ من طلبك
from_symbol / to_symbol رموز تداول أصلي الإرسال والاستلام
from_network / to_network شبكات الأصول
request_amount المبلغ من طلبك
send_amount المبلغ الذي يجب أن يرسله العميل
receive_amount المبلغ الذي سيستلمه العميل
amount_in_usd / amount_out_usd تقديرات USD لمبلغي الإرسال والاستلام
request_amount_usd يظهر فقط إذا استخدم الطلب amount_usd
expires_at لحظة انتهاء صلاحية عرض السعر (ISO-8601). بعدها لا يمكن استخدام quote_id هذا لإنشاء تبادل

5. إنشاء التبادل — POST /exchanges

يحوّل عرض السعر إلى تبادل فعلي: يُفتح طلب ويُعاد عنوان إيداع لتحويل العميل. استدعِه قبل انتهاء صلاحية عرض السعر (دقيقتان). الاستجابة عند النجاح — HTTP 201.

مثال على الطلب

POST https://snapex.pro/api/v1/partner/exchanges
Content-Type: application/json
X-API-Key: spx_your_key

{
  "quote_id": "pq_abc123",
  "recipient_address": "bc1qexampleaddress"
}

معاملات الطلب

الحقل إلزامي الوصف
quote_id نعم المعرّف من استجابة POST /quotes
recipient_address نعم عنوان صرف الدفعة للعميل. عادةً هو نفسه المستخدم في عرض السعر. اسم بديل: recipient

ما الذي يحدث عند هذا الاستدعاء

  1. تعثر API على عرض السعر الخاص بك وتتحقق من أنه لم تنتهِ صلاحيته.
  2. يُعاد التحقق من سعر الصرف مقابل السوق. إذا تحرّك عكس عرض السعر بأكثر من 2%، فلن يُنشأ تبادل ويُعاد 422 (ما عليك إلا طلب عرض سعر جديد).
  3. يُفتح طلب ويُخصَّص عنوان إيداع.
  4. تتضمن الاستجابة الكتلة deposit — العنوان والمبلغ اللذين يجب على العميل تحويلهما.

مثال على الاستجابة

{
  "quote_id": "pq_abc123",
  "status": "awaiting_deposit",
  "side": "send",
  "from_symbol": "USDT",
  "to_symbol": "BTC",
  "from_network": "TRON",
  "to_network": "Bitcoin",
  "request_amount": "20",
  "send_amount": "20",
  "receive_amount": "0.000312",
  "amount_in_usd": "20",
  "amount_out_usd": "19.85",
  "expires_at": "2026-07-27T13:02:00+00:00",
  "deposit": {
    "asset": "USDT",
    "amount": "20",
    "address": "TXyz…",
    "amount_usd": "20"
  },
  "exchange": {
    "public_id": "ex_…",
    "status": "awaiting_deposit",
    "recipient_address": "bc1qexampleaddress"
  }
}

الحقول الجديدة مقارنةً بعرض السعر

الحقل الوصف
status عادةً awaiting_deposit — بانتظار تحويل العميل. أما quoting فتعني أن عنوان الإيداع لا يزال قيد التجهيز: استعلم عن الحالة مجددًا بعد قليل
deposit.asset الأصل الذي يجب على العميل تحويله
deposit.amount مبلغ التحويل الدقيق
deposit.address عنوان الإيداع — اعرضه على العميل
deposit.amount_usd المعادل بـ USD (عند توفره)
exchange.public_id المعرّف العام للتبادل
exchange.status حالة الطلب (تطابق status في المستوى الأعلى)
exchange.recipient_address عنوان صرف الدفعة للعميل

إعادة المحاولة (Idempotency)

إذا انقطع الاتصال ولم تتلقَّ أي استجابة — فقط كرّر الطلب بنفس quote_id وrecipient_address. لن يُنشأ تبادل مكرر: ستُعيد API التبادل الموجود بالفعل. لا يمكن تغيير recipient_address بعد الإنشاء — ومحاولة ذلك تُعيد 422.

الأخطاء المحتملة

  • 409 quote_expired — انتهت صلاحية عرض السعر (مرّ أكثر من دقيقتين). اطلب عرضًا جديدًا عبر POST /quotes.
  • 422 validation_error — معاملات غير صالحة؛ أو محاولة تغيير recipient_address عند إعادة المحاولة؛ أو تحرّك سعر الصرف بأكثر من 2% — اطلب عرض سعر جديدًا.
  • 404 not_found — quote_id غير موجود أو يخص شريكًا آخر.
  • 503 upstream_unavailable — عطل مؤقت لدى مزوّد السيولة. أعد المحاولة لاحقًا بنفس عرض السعر (إن كان لا يزال صالحًا) أو بعرض جديد.

6. الحالة — GET /exchanges/{quote_id}

يُعيد الحالة الحالية لعرض السعر أو التبادل. صيغة الاستجابة مطابقة لاستجابة الإنشاء. الاستجابة عند النجاح — HTTP 200. استعلم مرة واحدة كل 7 ثوانٍ كحد أقصى.

مثال على الطلب

GET https://snapex.pro/api/v1/partner/exchanges/pq_abc123
X-API-Key: spx_your_key
Accept: application/json

قيم status

القيمة المعنى ما الذي تفعله
quoted يوجد عرض سعر فقط، ولم يُنشأ تبادل أنشئ التبادل قبل expires_at أو اطلب عرض سعر جديدًا
quoting جارٍ إنشاء التبادل وتجهيز عنوان الإيداع استعلم عن الحالة مجددًا بعد بضع ثوانٍ
awaiting_deposit بانتظار تحويل العميل إلى عنوان الإيداع اعرض على العميل العنوان والمبلغ من الكتلة deposit
processing تم استلام الإيداع، والتبادل قيد التنفيذ تابع الاستعلام
completed اكتمل التبادل وأُرسلت الأموال إلى العميل حالة نهائية — توقّف عن الاستعلام
error فشل التبادل حالة نهائية. تواصل مع الدعم مع ذكر exchange.public_id
cancelled تم إلغاء التبادل حالة نهائية
expired انتهت صلاحية عرض السعر، ولم يُنشأ تبادل حالة نهائية. اطلب عرض سعر جديدًا

الحالات النهائية: completed وerror وcancelled وexpired. لا تتغير الحالة بعدها — ولا داعي لمزيد من الاستعلام.

عندما تكون status=completed، قد تتضمن الكتلة exchange الحقل partner_api_earning_usd — أرباحك من الصفقة بالدولار الأمريكي.

مثال على الاستجابة

{
  "quote_id": "pq_abc123",
  "status": "completed",
  "side": "send",
  "from_symbol": "USDT",
  "to_symbol": "BTC",
  "from_network": "TRON",
  "to_network": "Bitcoin",
  "request_amount": "20",
  "send_amount": "20",
  "receive_amount": "0.000312",
  "amount_in_usd": "20",
  "amount_out_usd": "19.85",
  "expires_at": "2026-07-27T13:02:00+00:00",
  "deposit": {
    "asset": "USDT",
    "amount": "20",
    "address": "TXyz…",
    "amount_usd": "20"
  },
  "exchange": {
    "public_id": "ex_…",
    "status": "completed",
    "recipient_address": "bc1qexampleaddress",
    "partner_api_earning_usd": "0.20"
  }
}

7. الأخطاء والحدود

تشترك جميع الأخطاء في صيغة JSON واحدة. رمز حالة HTTP يعكس معنى الحقل error — يمكنك الاعتماد على أيّ منهما.

{
  "ok": false,
  "error": "validation_error",
  "message": "Human-readable explanation in English"
}

مرجع الأخطاء

HTTP error السبب ما الذي تفعله
401 unauthorized X-API-Key مفقود أو غير صالح تحقّق من الترويسة والمفتاح
403 api_access_pending طلب الوصول قيد المراجعة انتظر الموافقة
403 api_not_approved لم تتم الموافقة على الوصول إلى API تواصل مع الدعم
404 not_found quote_id غير معروف أو يخص شريكًا آخر تحقّق من المعرّف
409 quote_expired عرض السعر أقدم من دقيقتين اطلب عرض سعر جديدًا
422 validation_error معاملات غير صالحة، أو تجاوز للحدود، أو تحرّك سعر الصرف بأكثر من 2% اقرأ message، وصحّح الطلب، أو احصل على عرض سعر جديد
429 rate_limited تم تجاوز معدل الطلبات انتظر ثم أعد المحاولة
503 upstream_unavailable عطل مؤقت لدى مزوّد السيولة أعد المحاولة لاحقًا

حدود معدل الطلبات

النطاق الحد
جميع الطرق، لكل عنوان IP طلب واحد كل 7 ثوانٍ
POST /quotes، لكل شريك 15 طلبًا في الدقيقة
POST /exchanges، لكل شريك 10 طلبات في الدقيقة
GET /assets وGET /exchanges/{quote_id}، لكل شريك 120 طلبًا في الدقيقة

8. مثال: تبادل من البداية إلى النهاية

سيناريو كامل: يرسل العميل 20 USDT (شبكة TRON) ويستلم BTC على عنوان Bitcoin الخاص به. استبدل YOUR_KEY بمفتاح API الخاص بك.

الخطوة 1. اطلب عرض سعر

curl -sS -X POST 'https://snapex.pro/api/v1/partner/quotes' \
  -H 'X-API-Key: YOUR_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -d '{
    "from_asset_id": "usdt",
    "to_asset_id": "btc",
    "side": "send",
    "amount": "20",
    "recipient_address": "bc1qexample"
  }'

تحتوي الاستجابة على quote_id (pq_…) والمبالغ. اعرض على العميل receive_amount — أي كمية BTC التي سيحصل عليها. لديك دقيقتان للخطوة التالية.

الخطوة 2. أنشئ التبادل

curl -sS -X POST 'https://snapex.pro/api/v1/partner/exchanges' \
  -H 'X-API-Key: YOUR_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -d '{
    "quote_id": "pq_FROM_STEP_1",
    "recipient_address": "bc1qexample"
  }'

تتضمن الاستجابة الآن الكتلة deposit مع عنوان ومبلغ. اعرض على العميل deposit.address وdeposit.amount — يجب أن يحوّل هذا المبلغ بالضبط إلى هذا العنوان.

الخطوة 3. تابع الحالة

curl -sS 'https://snapex.pro/api/v1/partner/exchanges/pq_FROM_STEP_1' \
  -H 'X-API-Key: YOUR_KEY' \
  -H 'Accept: application/json'

كرّر الطلب مع فاصل 7–10 ثوانٍ. بمجرد أن يحوّل العميل الأموال، تتغير الحالة إلى processing، ثم إلى completed — أي تم إرسال الدفعة. الحالات النهائية: completed وerror وcancelled وexpired.

السيناريو نفسه بلغة Python

import time
import requests

API = "https://snapex.pro/api/v1/partner"
HEADERS = {
    "X-API-Key": "YOUR_KEY",
    "Content-Type": "application/json",
    "Accept": "application/json",
}

# Step 1. Quote: the client sends 20 USDT, receives BTC
quote = requests.post(f"{API}/quotes", headers=HEADERS, json={
    "from_asset_id": "usdt",
    "to_asset_id": "btc",
    "side": "send",
    "amount": "20",
    "recipient_address": "bc1qexample",
}).json()
print("Client receives:", quote["receive_amount"], quote["to_symbol"])

# Step 2. Create the exchange (within 2 minutes of the quote)
exchange = requests.post(f"{API}/exchanges", headers=HEADERS, json={
    "quote_id": quote["quote_id"],
    "recipient_address": "bc1qexample",
}).json()
deposit = exchange["deposit"]
print("Client must transfer:", deposit["amount"], deposit["asset"])
print("To address:", deposit["address"])

# Step 3. Poll the status until terminal
while True:
    time.sleep(10)  # at most 1 request every 7 seconds
    state = requests.get(
        f"{API}/exchanges/{quote['quote_id']}", headers=HEADERS
    ).json()
    print("Status:", state["status"])
    if state["status"] in ("completed", "error", "cancelled", "expired"):
        break

أخطاء شائعة لدى المبتدئين

  • إرسال المبلغ كرقم بدلًا من نص. الصحيح: "amount": "20"، وليس "amount": 20.
  • مع side=receive، تحديد المبلغ بأصل الإرسال. في receive يكون amount بأصل الاستلام (to).
  • إنشاء التبادل بعد أكثر من دقيقتين من عرض السعر — ستحصل على 409 quote_expired. اطلب عرض السعر مباشرة قبل الإنشاء.
  • إرسال الطلبات أكثر من مرة كل 7 ثوانٍ — ستحصل على 429. أضف فاصلًا زمنيًا بين الطلبات.