البداية السريعة
اجلب أول تغذية مطابَقة لك عبر REST بمفتاح مجاني، ثم اتصل بالبث في الوقت الفعلي.
يأخذك هذا من الصفر إلى بيانات مباشرة خلال نحو دقيقتين. يعمل النصف الأول بمفتاح مجاني. يتصل النصف الثاني بالبث في الوقت الفعلي — يحصل مفتاح Free على تذوق قناة sample منسَّقة؛ ويحتاج بث الرياضات الكامل إلى Basic أو Premium أو Pro.
أولًا، أنشئ مفتاح API. افتح لوحة التحكم، وسجّل الدخول عبر GitHub أو Google، وأنشئ مفتاحًا. يُعرض مرة واحدة فقط، فانسخه إلى مكان آمن. يبدأ كل مفتاح جديد على خطة Free، وهي كل ما تحتاجه للنصف الأول.
المراجحة المؤكدة عبر REST
كتالوج Market وOpportunities المؤكدة موردان منفصلان. ابدأ بـ /v2/arbitrage، مقتصرًا على رياضة واحدة. أرسل مفتاحك كرمز bearer.
curl -s "https://api.dino.markets/v2/arbitrage?sport=baseball" \
-H "Authorization: Bearer sk_live_..."ستحصل على لقطة تلك الرياضة. إليك arb مؤكدة واحدة:
{
"as_of": "2026-07-13T08:00:05Z",
"delay_seconds": 120,
"count": 1,
"opportunities": [
{
"id": "opp_01J2Y9M4X8",
"market_id": "dino_8f3a1c92-47e8-4c3f-b9d2-f1a8e6c4d5f2",
"title": "Nyy vs Bos",
"category": "sports",
"market_type": "moneyline",
"sport": "baseball",
"competition": "MLB",
"tags": ["baseball", "mlb", "moneyline", "sports"],
"start_time": "2026-07-13T23:05:00Z",
"edge_pct": 4.2503,
"roi_pct": 4.439,
"fees_included": true,
"fee_model": "conservative_per_contract",
"cost_per_payout_usd": 0.957497,
"max_contracts": 700,
"max_wager_usd": 670.25,
"confidence": 1.0,
"detected_at": "2026-07-13T08:00:00Z",
"priced_at": "2026-07-13T08:00:05Z",
"legs": [
{ "outcome": "NYY", "venue": "kalshi", "side": "yes", "ask_usd": 0.44, "stake_fraction": 0.480419, "available_contracts": 1000, "contract_id": "KXMLBGAME-NYY-BOS-NYY", "url": null },
{ "outcome": "BOS", "venue": "polymarket", "side": null, "ask_usd": 0.49, "stake_fraction": 0.519581, "available_contracts": 700, "contract_id": "tok_bos", "url": null }
]
}
]
}
edge_pct وroi_pct عائدان نموذجيان متحفظان بعد الرسوم. fee_model: "conservative_per_contract" تعني أن رسوم عقد واحد تُدرَج إلى max_contracts، لذا قد يختلف التقريب على مستوى الحجم بين المنصتين. max_contracts هو الحجم القابل للتنفيذ من اللقطة؛ وmax_wager_usd هو تقدير رأس المال المتحفظ شامل الرسوم عند ذلك الحجم. as_of يخبرك متى سُعِّرت آخر Opportunity معادة.
للحصول على Market المطابَقة وإفصاح التسوية، استدعِ GET /v2/pairs/{market_id} باستخدام market_id. لا يتغير ذلك التفصيل إلا حين يعيد محرك المطابقة تحليل الهوية أو القواعد، فخزّنه مؤقتًا.
عندما لا يكون هناك شيء مفتوحًا، تكون opportunities مصفوفة فارغة وتكون count هي 0. هذه حالة الراحة الطبيعية، لا خطأ.
البث في الوقت الفعلي
لقطة REST متأخرة نحو دقيقتين، فهي للاستكشاف. للتصرف عند فتح arb في اللحظة نفسها، اقرأ بث WebSocket. يمكن لكل خطة الاتصال: يحق لمفتاح Free قناة sample منسَّقة (مجموعة قليلة من الأسواق يختارها الخادم، في الوقت الفعلي) إضافة إلى status؛ وتفتح Basic وPremium وPro قناتَي markets:{sport} / markets:all الكاملتين، حيث تُطلَق arb فعليًا.
البث مصافحة من خطوتين. تصدر تذكرة قصيرة الأجل عبر REST، ثم تفتح المقبس بها.
الخطوة الأولى، أصدر تذكرة. صالحة لنحو 120 ثانية:
curl -s -X POST "https://api.dino.markets/v1/stream/token" \
-H "Authorization: Bearer sk_live_..."
يحصل مفتاح Basic (أو أعلى) على البث الكامل:
{
"ticket": "eyJhbGciOi...",
"ws_url": "wss://stream.dino.markets/connection/websocket",
"expires_in": 120,
"allowed": {
"channels": ["markets:all", "org:{id}", "status"],
"max_conns": 3
}
}
يحصل مفتاح Free على الشكل نفسه، مقتصرًا على التذوق العيني:
{
"ticket": "eyJhbGciOi...",
"ws_url": "wss://stream.dino.markets/connection/websocket",
"expires_in": 120,
"allowed": {
"channels": ["sample", "org:{id}", "status"],
"max_conns": 1
}
}
الخطوة الثانية، اتصل بمساعد SDK الرسمي. ينفذ المساعد طلب التذكرة أعلاه في كل محاولة اتصال، ويمرر التذكرة الجديدة إلى Centrifugo، ويستقبل القنوات التي يختارها الخادم. لا تُعِد استخدام التذكرة المثال ولا تشترك يدويًا.
import { Dino, watch } from "dino-markets";
const client = new Dino({ apiKey: process.env.DINO_API_KEY });
const stream = await watch(client, {
onFrame: (frame, channel) => console.log(channel, frame),
onRecoveryFailed: (channel) => bootstrapFromRest(channel),
});تُدفَع الرسائل في اللحظة التي يتغير فيها أي شيء: إطارات حالة market وفرق price على قنوات markets:*؛ وعندما تصبح signal الخاصة بزوج هي arb، تحمل إطاراته أيضًا دفاتر العمق لكل نتيجة وmax_stake. تغطي صفحة بث WebSocket كل شكل.
التالي
مرجع كائن Market يغطي شكل الكائن الموحَّد، ومصفوفة outcomes، وأنواع signal، ومغلَّف البث. صفحة بث WebSocket تغطي الاتصال وكيفية الاستعادة بعد انقطاع. لمعرّفات المنصتين وشروط التسوية، استخدم GET /v2/pairs/{market_id} الموثَّقة في مرجع REST.