إذا كان بوتك يتحدث بالفعل لغة Binance USD-M Futures، فقط غيّر رابط الأساس (base URL) وستكون جاهزًا على BuyCrypt فورًا. يكتشف مستخدمونا بوتك في لوحة المتصدرين، ويجرّبونه على حساب تجريبي مجاني بقيمة $1,000، وينتقلون إلى مفاتيح حقيقية عندما يقتنعون.
بدون إعادة كتابة الكود. بدون خصوصيات مرتبطة بمنصة معينة. نفس توقيع HMAC-SHA256، ونفس تدفق WebSocket لبيانات المستخدم، ونفس أنواع الأوامر — كل ذلك فوق محرك التداول التجريبي لدينا، ليتمكن المستخدمون من مقارنة البوتات دون تعريض رأس المال الحقيقي للمخاطر.
يحصل كل مستخدم يشترك على حساب تجريبي خاص به برصيد افتراضي قدره $1,000. يتداول بوتك عليه. يشاهدون الأرباح والخسائر (PnL) والتراجع (drawdown) ومعدل الفوز مباشرة. بدون أي مخاطرة على رأس مالهم الحقيقي — وبدون أي تكلفة اكتساب عليك.
يظهر الحساب التجريبي الخاص ببوتك في لوحة المتصدرين العامة مع شارة 🤖 БОТ. يرى المستخدمون ترتيب الأرباح والخسائر بين المتداولين الحقيقيين. اضغط على الصف، ثم اضغط "اتصال" — اشتراك فوري.
إذا كان بوتك يستخدم أي مكتبة Binance Futures SDK (binance-connector-python، python-binance، CCXT، وغيرها)، وجّه قيمة base_url الخاصة به إلى https://api.buycrypt.com/fapi. HMAC وrecvWindow وأنواع الأوامر — مطابقة تمامًا.
عندما يشترك مستخدم، نرسل عبر POST مفتاح API + السر المُنشأ حديثًا إلى رابط الـ webhook الخاص بك — موقّعًا بـ HMAC، مع إعادة محاولة عند الفشل باستخدام exponential backoff، وقابل للاسترجاع من dead-letter. لن تضطر أبدًا لطلب بيانات الاعتماد من المستخدم.
يفتح المستخدم لوحة المتصدرين. يظهر حساب بوتك مع شارة 🤖 БОТ بجانب اسم المستخدم، بالإضافة إلى عدد المشتركين. يضغط على الصف.
في صفحة ملف البوت الشخصي، يرون "الاتصال بحساب تجريبي". بضغطة واحدة يتم إنشاء حساب تجريبي جديد بقيمة $1,000 لهم، ويبدأ بوتك بالتداول عليه.
يراقب المستخدم البوت وهو يتداول على حسابه التجريبي لأيام أو أسابيع. الأرباح والخسائر (PnL)، والمراكز، ومعدل الفوز — كل ذلك مباشرة داخل التطبيق. إذا أعجبه الأداء، يُدخل مفتاح Binance API الحقيقي داخل BuyCrypt للترقية من الحساب التجريبي إلى الحساب الحقيقي.
يضيف المستخدم مفتاح Binance API الحقيقي الخاص به داخل BuyCrypt. نقوم بتسليمه إلى الـ webhook الخاص بك بنفس الطريقة التي سلّمنا بها مفتاح الحساب التجريبي — نفس حدث subscription.created، لكن ببيانات اعتماد الإنتاج الخاصة به. تكامل واحد يغطي كلا التدفقين، التجريبي والحقيقي.
سجّل حساب BuyCrypt عادي — بنفس تدفق أي مستخدم آخر. سيتم منحك حسابًا تجريبيًا مجانيًا برصيد ابتدائي فور التسجيل. بدون استمارة طلب، وبدون قائمة انتظار للمراجعة.
أنشئ مفاتيح API مباشرة داخل تطبيق BuyCrypt للجوال: ملفي الشخصي ← مفاتيح API ← اضغط على حسابك التجريبي ← إنشاء. ستحصل على apiKey + apiSecret جديدين يظهران مرة واحدة فقط — انسخهما إلى بوتك. ثم وجّه بوت Binance USD-M Futures الحالي لديك إلى https://api.buycrypt.com/fapi وسيعمل فورًا — نفس HMAC، ونفس نقاط النهاية، ونفس أنواع الأوامر.
بمجرد أن نكتشف تداولًا مدفوعًا بواسطة API على حسابك التجريبي، يتم تصنيف حسابك تلقائيًا كبوت. يظهر حسابك التجريبي في لوحة المتصدرين مع شارة 🤖 БОТ وملف شخصي عام، حتى يتمكن المستخدمون الآخرون من اكتشافه والاشتراك فيه.
عندما تكون جاهزًا لاستقبال المشتركين، أضف رابط webhook إلى ملف البوت الخاص بك في الإعدادات. في كل مرة يشترك فيها مستخدم — سواء على الحساب التجريبي أو بمفاتيح Binance حقيقية — نرسل عبر POST حدث subscription.created مع مفتاح API + السر الخاصين بحساب ذلك المستخدم. خزّن (userId, apiKey, apiSecret) وابدأ التداول نيابة عنه.
تقبل معظم مكتبات Binance Futures SDK تحديد رابط أساس (base URL) مخصص. إليك التغيير الكامل الذي يحتاجه بوت Python نموذجي:
# before — trading on real Binance from binance.um_futures import UMFutures client = UMFutures(key=API_KEY, secret=API_SECRET) # after — trading on a BuyCrypt user's demo from binance.um_futures import UMFutures client = UMFutures( key=API_KEY, secret=API_SECRET, base_url="https://api.buycrypt.com/fapi", # <- the only line that changes ) # everything below is identical to your existing code client.new_order(symbol="BTCUSDT", side="BUY", type="MARKET", quantity=0.01) client.account() client.cancel_open_orders(symbol="BTCUSDT")
CCXT، وpython-binance، وgo-binance الخاصة بـ Go، وnode-binance-api الخاصة بـ JS — كلها تعمل بنفس الطريقة. تعمل أيضًا البوتات البسيطة القائمة على requests.get(...).headers["X-MBX-APIKEY"] = key؛ وقاعدة توقيع HMAC مطابقة تمامًا بايتًا بايت.
عندما يشترك مستخدم BuyCrypt في بوتك، نقوم بإنشاء مفتاح API + سر خاص بكل مستخدم من جانب الخادم، ثم نرسلهما عبر POST إلى رابط الـ webhook المسجل لديك. لا يتم إرجاع السر إلى المستخدم أبدًا — يصل إليك أنت فقط، عبر HTTPS، وموقّعًا.
TL;DR: sign up → tap «Generate API key» on your demo → generate a webhook secret → run one Python script → admin approves. ~5 minutes.
Open buycrypt.com/terminal (or the mobile app). Sign in via Google or phone. A $1,000 USDT demo account is created automatically — that's the sandbox your bot will trade on.
In the app: Profile → API Keys → tap your demo account → «Bot API keys» → Generate. A dialog shows the apiKey + apiSecret once — copy both, you can't recover the secret afterwards.
# what you'll save API_KEY = "3fc370a4ac94b9aa756e2a97842dc04c" API_SECRET = "3WJ86kV_VQzLWaED3hSRlY9R6wQHh_f3UEZ_q-CrwRU"
Same shape as Binance — your existing USD-M Futures bot library reads it as a regular Binance key with base URL https://api.buycrypt.com/fapi.
A second secret, separate from API_SECRET. We use it to sign the events we POST to your webhook URL — so you can verify the request really came from us. You generate it on your side; we encrypt-store it but never reveal back:
# any of these works — pick one. Save the output. $ openssl rand -hex 32 # macOS / Linux $ python3 -c "import secrets; print(secrets.token_hex(32))" # cross-platform # sample output 8a31c2f4d5e6789abc01234567890def8a31c2f4d5e6789abc01234567890def
Drop your three secrets into one signed POST. Save this as register_bot.py and run it once. Works on any OS with Python 3.10+ and pip install requests:
import hmac, hashlib, time, urllib.parse, requests # ─── fill these in from steps 2 and 3 ───────────────────── API_KEY = "3fc370a4ac94b9aa756e2a97842dc04c" API_SECRET = "3WJ86kV_VQzLWaED3hSRlY9R6wQHh_f3UEZ_q-CrwRU" WEBHOOK_SECRET = "8a31c2f4d5e6789abc01234567890def8a31c2f4d5e6789abc01234567890def" SLUG = "alpha-trader" # lowercase, [a-z0-9-], unique DISPLAY_NAME = "Alpha Trader" # shown to users in the bot list WEBHOOK_URL = "https://your-bot.example.com/buycrypt/hook" # MUST be HTTPS, public # ────────────────────────────────────────────────────────── params = { "slug": SLUG, "displayName": DISPLAY_NAME, "webhookUrl": WEBHOOK_URL, "webhookSecret": WEBHOOK_SECRET, "defaultLeverage": 10, "timestamp": int(time.time() * 1000), } qs = urllib.parse.urlencode(params) sig = hmac.new(API_SECRET.encode(), qs.encode(), hashlib.sha256).hexdigest() r = requests.post( "https://api.buycrypt.com/fapi/v1/bot/profiles", headers={ "X-MBX-APIKEY": API_KEY, "Content-Type": "application/x-www-form-urlencoded", }, data=qs + f"&signature={sig}", ) print(r.status_code, r.json())
Notice no demoKeyPairId — your API_KEY already points to the demo it was generated for. Need to register against a different demo? Generate a separate API key for it (step 2 again).
Expected output:
201 {
"botId": 42,
"slug": "alpha-trader",
"status": "PENDING_REVIEW",
"webhookUrl": "https://your-bot.example.com/buycrypt/hook",
"webhookStatus": "ACTIVE",
"webhookSecretAutoGenerated": false
}
Common errors:
{"code":-2010, "msg":"Slug already in use."} # pick another slug
{"code":-1102, "msg":"webhookSecret must be at least 32..."} # too short — use 32+ chars
{"code":-1022, "msg":"Signature for this request is not valid."} # API_SECRET wrong, or params order changed after signing
{"code":-1003, "msg":"Bot registration rate limit: 1 per hour..."} # wait it out
Bot lands in PENDING_REVIEW. Our admin sees your request immediately and approves it. To check status anytime:
import hmac, hashlib, time, urllib.parse, requests API_KEY = "3fc370a4..." API_SECRET = "3WJ86kV..." qs = urllib.parse.urlencode({"timestamp": int(time.time() * 1000)}) sig = hmac.new(API_SECRET.encode(), qs.encode(), hashlib.sha256).hexdigest() r = requests.get( f"https://api.buycrypt.com/fapi/v1/bot/profiles?{qs}&signature={sig}", headers={"X-MBX-APIKEY": API_KEY}, ) print(r.json()) # [{"botId":42, "status":"ACTIVE", ...}] when approved
Once "status":"ACTIVE": every time a user subscribes we POST to your webhookUrl with the per-subscriber API key your bot will trade with. The events shape and a copy-paste signature-verification snippet are right below this section.
Lost your webhook secret? Pick a new one and rotate (same signing pattern as registration):
params = {
"webhookSecret": NEW_SECRET, # or omit to get backend-generated
"timestamp": int(time.time() * 1000),
}
qs = urllib.parse.urlencode(params)
sig = hmac.new(API_SECRET.encode(), qs.encode(), hashlib.sha256).hexdigest()
requests.post(
"https://api.buycrypt.com/fapi/v1/bot/profiles/42/webhook/rotate-secret",
headers={"X-MBX-APIKEY": API_KEY,
"Content-Type": "application/x-www-form-urlencoded"},
data=qs + f"&signature={sig}",
)
Old secret invalid the second the new one saves. Rate limit: 10 rotations/hour per bot.
subscription.created — اشترك المستخدم للتوPOST https://your-bot.example.com/buycrypt/hook Content-Type: application/json User-Agent: BuyCrypt-Webhook/1.0 X-BuyCrypt-Event: subscription.created X-BuyCrypt-Delivery-Id: 7f3b2e8c-a4d1-4f12-93b8-0c1e9f8d2a4b # dedup key — store + reject duplicates X-BuyCrypt-Timestamp: 1745605200123 # ms epoch when payload was built X-BuyCrypt-Signature: 5e8c2d… # hex(HMAC-SHA256(webhookSecret, ts + "." + body)) { "event": "subscription.created", "deliveryId": "7f3b2e8c-a4d1-4f12-93b8-0c1e9f8d2a4b", "timestamp": 1745605200123, "data": { "subscriptionId": 42, "botProfileId": 7, "subscriberHandle": "user_fb_uid_a", "apiKey": "3fc370a4ac94b9aa756e2a97842dc04c", "apiSecret": "3WJ86kV_VQzLWaED3hSRlY9R6wQHh_f3UEZ_q-CrwRU", "demoKeyPairId": 9001, "initialBalance": "1000.00000000", "permissions": "READ_TRADE", "ipWhitelist": "", "createdAt": "2026-04-25T18:00:00Z" } }
subscription.deleted — قطع المستخدم الاتصال، وتم تعطيل المفتاحX-BuyCrypt-Event: subscription.disconnected { "event": "subscription.disconnected", "deliveryId": "…", "timestamp": …, "data": { "subscriptionId": 42, "botProfileId": 7, "apiKey": "3fc370a4…", "reason": "USER_UNSUBSCRIBED", "disconnectedAt": "2026-04-25T18:30:00Z" } }
secret.regenerated — قام المشرف بتدوير سر الـ webhook الخاص بكX-BuyCrypt-Event: secret.regenerated { "event": "secret.regenerated", "deliveryId": "…", "timestamp": …, "data": { "subscriptionId": 42, "apiKey": "3fc370a4…", "newApiSecret": "new_plaintext_keep_old_valid_24h", "oldSecretValidUntil": "2026-04-26T18:00:00Z" } }
Use the raw request body bytes — DO NOT parse JSON first and re-serialize, you'll lose key order and signatures will diverge. Always compare in constant time.
# Python (FastAPI / Flask) import hmac, hashlib, time WEBHOOK_SECRET = "whsec_aGVsbG8gd29ybGQ_..." # whsec_…43 chars def verify(headers, body_bytes): sig = headers["X-BuyCrypt-Signature"] ts = int(headers["X-BuyCrypt-Timestamp"]) # anti-replay: reject if too old if abs(time.time() * 1000 - ts) > 5 * 60 * 1000: return False payload = f"{ts}.".encode() + body_bytes expected = hmac.new(WEBHOOK_SECRET.encode(), payload, hashlib.sha256).hexdigest() return hmac.compare_digest(expected, sig)
// Node.js / Express — read RAW body, not parsed JSON const crypto = require('crypto'); const SECRET = 'whsec_aGVsbG8gd29ybGQ_...'; app.post('/buycrypt/hook', express.raw({ type: 'application/json' }), // raw, not json()! (req, res) => { const sig = req.headers['x-buycrypt-signature']; const ts = parseInt(req.headers['x-buycrypt-timestamp'], 10); if (Math.abs(Date.now() - ts) > 5 * 60 * 1000) return res.status(401).end(); const expected = crypto.createHmac('sha256', SECRET) .update(`${ts}.`).update(req.body).digest('hex'); if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig))) { return res.status(401).end(); } // req.body is a Buffer here — JSON.parse(req.body.toString('utf8')) res.sendStatus(200); });
6 محاولات مع exponential backoff: دقيقة واحدة، 5 دقائق، 30 دقيقة، ساعتان، 6 ساعات، 12 ساعة. بعد فشل جميع المحاولات الست، يصل الحدث إلى جدول dead-letter لدينا، ويمكن للمشرف إعادة تشغيله.
إذا فشلت نقطة النهاية الخاصة بك 10 مرات متتالية، نقوم بتعطيلها ونتوقف عن إرسال الأحداث. تواصل معنا لإعادة التفعيل. هذا يمنع بوتًا معطلًا من حظر مشتركين جدد إلى أجل غير مسمى.
كل جسم طلب موقّع بـ HMAC-SHA256 باستخدام السر الذي شاركناه عند التسجيل. تحقق منه في زمن ثابت (constant time) قبل الوثوق بالمحتوى. أمثلة في دليل الشركاء لدينا.
رابط الأساس: https://api.buycrypt.com/fapi. المصادقة: ترويسة X-MBX-APIKEY + توقيع HMAC-SHA256 على نقاط النهاية الموقّعة. نافذة الاستقبال (Recv window): 5,000 ms افتراضيًا، وبحد أقصى 60,000 ms.
{}.MARKET، LIMIT، STOP_MARKET، TAKE_PROFIT_MARKET، STOP، TAKE_PROFIT (بنمط limit)، TRAILING_STOP_MARKET. الأعلام: reduceOnly، closePosition، timeInForce (GTC/IOC/FOK)، newClientOrderId لضمان idempotency، workingType، callbackRate.orderId أو origClientOrderId.{dualSidePosition: false}.ORDER_TRADE_UPDATE، ACCOUNT_UPDATE، MARGIN_CALL. بنفس شكل البيانات كما في Binance.subscribe/unsubscribe/list_subscriptions — تمرير مباشر إلى Binance.X-MBX-USED-WEIGHT-1M، X-MBX-ORDER-COUNT-10S، وترويسة Retry-After عند 429.Retry-Afterبدون استمارة طلب، وبدون قائمة انتظار للمراجعة، وبدون رسوم تكامل. سجّل كأي مستخدم عادي، وأنشئ مفاتيح API من تطبيق الجوال، ووجّه بوتك إلى https://api.buycrypt.com/fapi — هذا هو التأهيل بالكامل.