التوثيق
API التبادل للشركاء
واجهة REST JSON API لدمج تبادل العملات المشفرة في موقعك أو بوتك أو خدمتك: كتالوج الأصول ← عرض السعر ← إنشاء التبادل ← متابعة الحالة.
Base URL
https://snapex.pro/api/v1/partner
1. نظرة عامة
تتيح لك API التبادل للشركاء تنفيذ عمليات تبادل العملات المشفرة من تطبيقك عبر طلبات HTTP بسيطة. ترسل JSON — فتُعيد API سعر الصرف وعنوان الإيداع وحالة التبادل. يشرح هذا القسم المسار العام؛ وكل خطوة مشروحة بالتفصيل أدناه.
كيف يتم التبادل
يتبع كل تبادل المسار نفسه المكوّن من أربع خطوات:
- الكتالوج (GET /assets). تعرّف على الأصول المتاحة وحدودها. يوفّر الكتالوج الرموز المختصرة للأصول — usdt وbtc وeth وxmr وغيرها.
- عرض السعر (POST /quotes). تسأل: "كم BTC سيحصل العميل مقابل 20 USDT؟" فتجيب API بسعر الصرف والمبالغ الدقيقة. عرض السعر غير ملزم ويبقى صالحًا لمدة دقيقتين.
- إنشاء التبادل (POST /exchanges). تؤكّد عرض السعر — فتفتح API طلبًا وتُعيد عنوان إيداع يجب على العميل إرسال الأموال إليه.
- الحالة (GET /exchanges/{quote_id}). تستعلم من API لمعرفة ما إذا وصل الإيداع وتم إرسال الدفعة.
ما تحتاجه للبدء
- حساب في لوحة تحكم الشريك.
- طلب وصول إلى API تمت الموافقة عليه (يُرسل من لوحة التحكم ويراجعه المشرف).
- مفتاح 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 |
ما الذي يحدث عند هذا الاستدعاء
- تعثر API على عرض السعر الخاص بك وتتحقق من أنه لم تنتهِ صلاحيته.
- يُعاد التحقق من سعر الصرف مقابل السوق. إذا تحرّك عكس عرض السعر بأكثر من 2%، فلن يُنشأ تبادل ويُعاد 422 (ما عليك إلا طلب عرض سعر جديد).
- يُفتح طلب ويُخصَّص عنوان إيداع.
- تتضمن الاستجابة الكتلة 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. أضف فاصلًا زمنيًا بين الطلبات.