مرجع تدفق الأسعار
أسعار السلع الفورية وأسعار صرف العملات عبر اتصال WebSocket واحد، مع سعر أولي لكل اشتراك وتحديثات عند تغير الأسعار
الوصول والحدود
يتوفر تدفق الأسعار في خطتي Basic وPro. يتلقى مفتاح خطة Free الرمز plan_upgrade_required، ثم يُغلق الاتصال.
تشترك تدفقات الأسعار والأحداث والتوقعات في حد للاتصالات المتزامنة: اتصال واحد في Free، واتصالان في Basic، و10 اتصالات في Pro. يستهلك كل اتصال استدعاءً واحدًا من الحصة الشهرية.
اتصال
اتصل بـwss://api.narwhalapi.com/v1/prices/stream مع وضع مفتاح API في الترويسة Authorization: Bearer.
لا تستطيع المتصفحات تعيين تلك الترويسة في اتصال WebSocket. أرسل POST /v1/prices/stream-ticket من خادمك، ثم اتصل باستخدام ?ticket= والتذكرة المُعادة. تُستخدم التذكرة مرة واحدة، وتنتهي صلاحيتها بعد 30 ثانية، وتتطلب أصلًا مسموحًا به. يخضع تدفق التوقعات لقواعد التذاكر نفسها.
الاشتراك
يرسل الخادم {"type":"ready"}. أرسل رسالة اشتراك واحدة خلال 5 ثوانٍ:
{
"action": "subscribe",
"commodities": [
{
"commodity": "XAU",
"currency": "USD"
}
],
"fx": [
{
"base": "USD",
"currencies": [
"EUR",
"JPY"
]
}
]
}commodities: ما يصل إلى 20 زوجًا من السلع والعملات يدعمهاGET /v1/commodities/spot/{commodity}/{currency}.fx: ما يصل إلى 5 عملات أساس. الحقلcurrenciesاختياري: احذفه لتلقي كل عملة متاحة لعملة الأساس، أو أدرج ما يصل إلى 64 عملة.
يرد الخادم بـ{"type":"subscribed"} ويرسل كل سعر مشترك فيه مرة واحدة. بعد ذلك، لا يرسل السعر إلا عندما يتغير. تُفحص الأسعار مرة كل ثانية تقريبًا.
لتغيير الاشتراك، أعد الاتصال. تؤدي رسالة اشتراك ثانية إلى إغلاق الاتصال بالرمز resubscribe_required.
الرسائل
تحتوي رسائل الأسعار على محتوى الاستجابة نفسه الذي تعيده نقاط نهاية REST، بما في ذلك المنازل العشرية والقيم البديلة وعلامات البيانات القديمة.
| الرسالة | المحتويات أو وتيرة الإرسال |
|---|---|
ready | تُرسل عند فتح الاتصال. اشترك خلال 5 ثوانٍ. |
subscribed | قُبل الاشتراك. |
commodity | يحتوي spot على محتوى استجابة GET /v1/commodities/spot/{commodity}/{currency}. |
fx | يحتوي rate على عنصر واحد من rates في استجابة GET /v1/fx/rates/{base}، مع base وmarket_session. |
heartbeat | كل 30 ثانية، مع as_of. |
pong | الرد على {"action":"ping"}. |
error | تحتوي على code للخطأ، ثم يُغلق الاتصال. |
{
"type": "commodity",
"spot": {
"symbol": "XAU-USD",
"price": "4195.86",
"currency": "USD",
"unit": "troy_ounce",
"timestamp": "2026-10-11T06:25:00Z",
"stale": false
}
}{
"type": "fx",
"base": "USD",
"market_session": "open",
"rate": {
"currency": "EUR",
"rate": "0.8924",
"timestamp": "2026-10-09T00:00:00Z",
"stale": false
}
}الحفاظ على الاتصال نشطًا
أرسل {"action":"ping"} للحصول على {"type":"pong"}. يرسل الخادم أيضًا heartbeat كل 30 ثانية. اقرأ الرسائل فور وصولها: يُغلق اتصال العميل الذي يتوقف عن القراءة لمدة 5 ثوانٍ بالرمز slow_consumer.
يمكنك إرسال ما يصل إلى 30 إطارًا لكل اتصال. عند إعادة الاتصال، تُرسل جميع الأسعار المشترك فيها مجددًا؛ ولا تُعاد التغييرات التي فاتتك.
الأخطاء
تصل الأخطاء بصيغة {"type":"error","code":"..."}، ثم يُغلق الاتصال.
| الرمز | المعنى |
|---|---|
unauthorized | مفتاح API أو التذكرة مفقود أو غير صالح. |
plan_upgrade_required | يتطلب التدفق خطة Basic أو Pro. |
stream_limit | تم بلوغ حد اتصالات التدفق المتزامنة للخطة. |
quota_unavailable | نفدت الحصة الشهرية أو تعذر التحقق منها. |
subscribe_required | لم تُستلم رسالة اشتراك خلال 5 ثوانٍ من رسالة الجاهزية. |
resubscribe_required | أُرسلت رسالة اشتراك ثانية. أعد الاتصال لتغيير الاشتراك. |
invalid_command | الرسالة ليست إجراء اشتراك أو ping. |
invalid_frame | الرسالة ليست JSON صالحًا أو تتجاوز حدود الاشتراك. |
commodity_not_supported | إحدى السلع في رسالة الاشتراك غير متاحة. |
currency_not_supported | إحدى العملات في رسالة الاشتراك غير متاحة. |
revoked | أُلغي مفتاح API أو فُقد تصريح اتصاله. |
slow_consumer | توقف العميل عن قراءة الرسائل لمدة 5 ثوانٍ. |
command_limit | أرسل العميل أكثر من 30 إطارًا عبر اتصال واحد. |
unavailable | التدفق غير متاح مؤقتًا. أعد الاتصال لاحقًا. |
التوثيق