سجل التغييرات
كل تغيير في Data API وفي عقده، الأحدث أولاً. وتتبع أرقام الإصدارات سياسة الإصدارات وإيقاف الدعم.
يتشارك POST /webhooks وPOST /webhooks/{id}/test الآن حدًّا واحدًا قدره 5 طلبات في الدقيقة لكل حساب، إضافةً إلى حد الاندفاع في الخطة. وتتلقى الطلبات التي تتجاوزه 429 rate_limited مع Retry-After. ويُرسَل الحدث التجريبي الآن مرة واحدة دون إعادة محاولة، أما عمليات التسليم الأخرى فما زالت تُجرى لها حتى 3 محاولات، مع تأخير تصاعدي بين المحاولات. وهذا حد لمنع إساءة الاستخدام، ويُبقي الحصة الشهرية وحد الاندفاع في كل خطة دون تغيير. وقد عُدِّلت سياسة الإصدارات وإيقاف الدعم في اليوم نفسه بحيث يمكن تطبيق مثل هذه الحدود فورًا؛ وحتى ذلك الحين، كان خفض أي حد لمعدل الطلبات في إحدى الخطط يخضع للمهلة الزمنية لإيقاف الدعم البالغة ستة أشهر. وفي هاتين النقطتين النهائيتين، تُظهر ترويسات X-RateLimit-* الحدَّ الذي تبقّى فيه عدد أقل من الطلبات من بين الحدّين.
لم يعد POST /webhooks يبحث عن اسم المضيف الوارد في عنوان URL عبر DNS. وما زال يُرجع 422 إذا لم يستخدم العنوان https، أو تضمّن بيانات اعتماد، أو كان مضيفه عنوان IP غير عام. أما اسم المضيف الذي لا يمكن العثور عليه في DNS أو الذي يشير إلى عنوان غير عام، فكان يتلقى 422 من قبل؛ وأصبح يُقبل الآن مع 201 ويُحتسب ضمن حد 5 نقاط نهاية لكل حساب. وبعدها تفشل كل عملية تسليم إلى نقطة النهاية هذه دون إعادة محاولة، ويظهر السبب في error ضمن GET /webhooks/{id}/deliveries، وتُعطَّل نقطة النهاية بعد 10 عمليات تسليم فاشلة متتالية. بعد إنشاء نقطة نهاية، أرسل إليها حدثًا تجريبيًا عبر POST /webhooks/{id}/test وتحقّق من سجل التسليم للتأكد من إمكانية الوصول إليها.
أصبح endpoints[].endpoint في GET /usage يذكر قالب المسار بدلًا من المسار المطلوب، أي api/v1/coins/{slug} بدلًا من api/v1/coins/bitcoin، فيصبح لكل نقطة نهاية صف واحد بدلًا من صف لكل slug أو id. وتحتفظ الطلبات المسجّلة في وقت سابق من فترة الفوترة الحالية بمسارها، لذا قد يظهر الشكلان معًا حتى نهاية الفترة.
كان GET /exchanges/{slug} وGET /exchanges/{slug}/trust-score يفشلان برمز 500 لكل منصة تداول منذ إطلاق Data API. ويستجيب كلاهما الآن؛ ولم تتغير المُعاملات ولا حقول الاستجابة، وتُعيد منصة التداول التي ليس لها ترتيب الحقلين score وbreakdown بقيمة null.
أصبح عقد OpenAPI المنشور يُعلِّم كل حقل قد تكون قيمته null بأنه يقبل القيم الفارغة، ويحدّد نوع القيم الكسرية رقمًا (مثل invested في GET /calculators/dca، وقيم المؤشرات)؛ أما الحقول المشتركة logo وlast_updated وحقلا ترقيم الصفحات from/to فتقبل القيم الفارغة في جميع نقاط النهاية، وكذلك الحقلان name وprice للعملة في جميع نقاط النهاية الخاصة بقوائم العملات والأسعار. كما يحدّد نوع series في DCA مصفوفةً، ويوثّق استجابات GET /coins/{slug}/markets وGET /coins/losers وGET /global/history/{metric} وGET /sentiment/altseason، ويوثّق نطاق المُعامل days في GET /sentiment/altseason بأنه 1–365 (لطالما رُفضت القيمة 0؛ لا تُمرِّر هذا المُعامل للحصول على القراءة الحالية)، ويُدرج في مخطط الخطأ الرمزين endpoint_unavailable (503) وhttp_error. لم يتغيّر أي طلب أو استجابة - تغيّرت طريقة وصفها فقط.
كانت محاولات المصادقة الفاشلة محدودة بـ 30 محاولة في الدقيقة لكل عنوان IP، وبعدها يتلقى كل مفتاح خلف ذلك العنوان الرمز 429. أما الآن فيمكن لمفتاح واحد أن يفشل 30 مرة في الدقيقة من عنوان IP واحد، ولعنوان IP واحد أن يفشل 300 مرة، ولا يحجب حدُّ عنوان IP المفاتيحَ التي نجحت مصادقتها خلال آخر 15 دقيقة تقريبًا، ويُعيد الطلب الذي لا يحمل مفتاحًا الرمز 401 دون أن يُحتسب. وتتلقى الطلبات المحجوبة 429 rate_limited مع Retry-After.
أصبحت طلبات GET وHEAD التي يحتوي مسارها على شرطة مائلة في نهايته أو شرطة مائلة مكرّرة أو /index.php في بدايته تتلقى إعادة توجيه 301 إلى عنوان URL النظيف بدلًا من تقديمها - مثلًا من /api/v1/coins/ إلى /api/v1/coins. ولا تتأثر الطرق الأخرى.
GET /calculators/compound-interest كان يقرّب المدة إلى عدد صحيح من فترات الرسملة، فكانت المدة التي تنتهي في منتصف فترة تُحاكى أطول أو أقصر من اللازم: 6 أشهر برسملة annually كانت تُحتسب سنة كاملة (12 إيداعًا وفائدة سنة كاملة)، و5 أشهر لم تُحتسب فيها أي فترة (لا إيداعات ولا فائدة). تُحتسب الفترات الكاملة الآن كما كانت، وتكسب الفترة الجزئية الأخيرة فائدة تناسبية (فائدة بسيطة عن الجزء)، ويُحتسب كل إيداع يقع ضمن المدة. لا تتغير النتائج عندما تكون المدة عددًا صحيحًا من فترات الرسملة؛ ولم تتغير المُعاملات ولا حقول الاستجابة.
كانت الـ API ووثائقها تعامل rate على أنه المعدل لكل فترة تركيب، بينما كانت حاسبة الموقع ودليل استخدامها تعتمد معدلًا سنويًا. كان GET /calculators/compound-interest يطبّق rate كاملًا على كل فترة تركيب، فكان معدل 5% بتركيب شهري ينمو كأنه 5% في الشهر. أصبح rate الآن المعدل الاسمي السنوي: تكسب كل فترة rate مقسومًا على عدد الفترات في السنة (5% بتركيب شهري تعني 5/12% في الشهر)، كما يوضّح meta.note الآن. لم تتغير المعاملات ولا حقول الاستجابة؛ تتغير النتائج مع كل وتيرة تركيب باستثناء annually. وبشكل منفصل، عندما تتساوى قيمتا contribution_frequency وcompound_frequency وتكونان daily أو weekly، لم تعد الإيداعات تتأخر أو تسقط بسبب أخطاء التقريب في الفاصلة العائمة، لذا قد يزيد total_contributions بمقدار إيداع واحد مع duration_unit=months. يغيّر هذا معنى مُعامل موجود: لإعادة إنتاج النتائج السابقة، اضرب قيمة rate في عدد فترات الرسملة في السنة.
كل قراءة Fear & Greed تتضمن الآن index بجانب score: مؤشر Fear & Greed من 0 إلى 100 تمامًا كما يظهر على Bitculator (0–19 خوف شديد، 20–39 خوف، 40–59 محايد، 60–79 طمع، 80–100 طمع شديد) — استخدمه للعرض. score لم يتغير: هو القيمة المركّبة الخام من −100…+100 التي يُشتق منها index. ينطبق ذلك على GET /sentiment/fear-greed (القراءة الرئيسية وكل إدخال في intervals)، وfear_greed في GET /global، وmeta.fear_greed في GET /global/heatmap. إضافة فقط؛ لم يتغير أي حقل موجود.
كان GET /coins/{slug} يُرجع fully_diluted_valuation بقيمة 0 للعملات التي لا تملك حداً أقصى للمعروض (مثل Solana وEthereum، اللتين لا سقف لمعروضهما). أصبح الآن يعتمد على إجمالي المعروض كبديل، ويكون null عندما لا يكون أيٌّ منهما معروفاً، كما كان عقد OpenAPI يوثّق مسبقاً.
كانت قراءة Fear & Greed التي لم تحصل على درجة بعدُ تُعرَض بالقيمة score: 0. وأصبحت الآن null في GET /sentiment/fear-greed، وكذلك fear_greed في GET /global وmeta.fear_greed في GET /global/heatmap.
قد تكون قيمتا marketcap وdominance null لعملة بلا معروض متداول، كما أنّ score وbreakdown في درجة الثقة تكون null لمنصة تداول غير مصنّفة. ويُعيد POST /alarms رمز 422 عندما لا تكون للعملة قيمة حالية للمقياس المختار. وأصبح /coins/recently-added و/wallets/timeline يلتزمان بمعامل sort. ويُرتَّب /coins/gainers و/coins/losers حسب التغيّر نفسه (بعد أن كان الترتيب عملياً حسب القيمة السوقية)، وتستثني قائمة الخاسرين العملات عند 0.00. ويضع الفرز التصاعدي القيم الفارغة في آخر النتائج. ويحلّ /prices الرمز الملتبس إلى العملة النشطة الأعلى تصنيفاً. ويُعلِّم عقد OpenAPI حقول السوق التي تقبل القيم الفارغة، ويحدّد نوع حجم التداول 24 ساعة رقماً.
تحمل كل رؤية في GET /insights وGET /insights/{id} وGET /coins/{slug}/insights الآن generated_by: "ai" والنموذج الذي كتبها في model. إضافة فقط؛ لم يتغير أي حقل موجود.
أُعيدت تسمية منصة التداول Huobi إلى HTX وتغيّر الـ slug الخاص بها من huobi إلى htx؛ ولا تتبع الـ API عمليات إعادة توجيه الـ slug، لذا أصبح /exchanges/huobi يُعيد 404. وضُبطت CoinEx على أنها غير نشطة ولم تعد تُعاد.
أصبح change_24h وchange_7d بقيمة null عندما لا يُعاد حساب تغيّرات العملة لمدة 15 دقيقة، بدلًا من عرض حركة قديمة. ومنذ 18 سبتمبر ينطبق الأمر نفسه على change_rank_24h وchange_rank_7d.
أصبح العقد المنشور يحمل أمثلة على مستوى نوع الوسائط، ومخطط خطأ مشتركاً واحداً تُحيل إليه كل استجابة 4xx/5xx، واستجابات 401 و429 و500 التي قد يُعيدها أي طلب يحمل مفتاحاً، وترويسات X-RateLimit-* وX-Quota-* في كل استجابة ناجحة، وتسليم alarm.triggered بوصفه ردّ نداء على POST /webhooks، وبيانات وصفية للتواصل والترخيص والشروط. لم يتغيّر أي طلب أو استجابة - تغيّرت طريقة وصفها فقط.
جديد: /apis.json، و/.well-known/api-catalog (RFC 9727)، و/.well-known/security.txt (RFC 9116)، وحزمة JSON Schema لأشكال الاستجابات المشتركة، وصفحة حالة عامة لها نسخة JSON مقابلة، وسجل التغييرات هذا، وسياسة الإصدارات وإيقاف الدعم.
توقفت استدعاءات أدوات MCP عن الاحتساب ضمن الحصة الشهرية وحد الاندفاع لخطة Data API؛ إذ أصبح لخادم MCP مفاتيحه وخططه الخاصة منذ ذلك اليوم. وصار بالإمكان أن تكون قيمة tokens[].kind في GET /usage هي mcp، وأصبحت رسالة 429 الخاصة بتجاوز الحصة تقول "Your Data API plan has reached its monthly request limit." (وكانت تشير سابقًا إلى خطة التضمين).
أصبح إنشاء مفتاح Data API أو تدويره في وحدة تحكم المطوّرين يتطلب عنوان بريد إلكتروني موثّقًا؛ وتُستثنى الحسابات التي لا تملك بريدًا إلكترونيًا، مثل حسابات تسجيل الدخول بالمحفظة. ويقتصر إنشاء المفاتيح على 10 في الدقيقة. وتواصل المفاتيح الحالية عملها.
كان volume_usd في GET /tickers وGET /pairs وGET /pairs/{id} وGET /coins/{slug}/markets وGET /exchanges/{slug}/tickers يُخزَّن عددًا صحيحًا، فتضيع السنتات وتظهر الأسواق التي يقل حجمها عن $0.50 بقيمة 0. وأصبحت الأحجام تحتفظ بمنزلتين عشريتين، ولم تعد المجاميع المبنية عليها ترث هذا التقريب.
كان change في GET /coins/{slug}/sparkline وGET /exchanges/{slug}/sparkline كسرًا للفترات من 30d إلى 365d (فالقيمة 0.05 تعني +5%)، لكنه نسبة مئوية لـ 24h و7d. وأصبح الآن نسبة مئوية لكل فترة (1.25 تعني +1.25%)، لذا صارت قيم الفترات الأطول أكبر بـ 100 مرة من ذي قبل، ولم تعد الحركات التي تقل عن 0.5% تُقرَّب إلى 0.
في نقطتَي نهاية الـ sparkline كلتيهما، كانت low وhigh تأتيان من ملخّص مبني على نافذة مختلفة، وقد تتعارضان مع points - مثل low أعلى من أسعار في السلسلة. وأصبحتا الآن الحدّين الأدنى والأعلى الفعليين للفترة التي تُؤخذ منها عيّنات points.
أصبحت GET /wallets و/wallets/timeline و/wallets/compare و/wallets/{slug} و/wallets/{slug}/assets تُعيد أيضًا المحافظ ذات حالة المشروع الوهمي (vaporware)، لذا قد يحمل status هذه القيمة.
لم يعد title وexcerpt الخاصان بالمصادر داخل الرؤى يحتويان على كيانات HTML خام مثل í.
بالنسبة إلى مقالة لم تُعدَّل قط، كان updated_at في GET /articles وGET /articles/{slug} يعرض آخر مرة تغيّر فيها السجل لأي سبب، مثل عدد المشاهدات أو تصويت. وأصبح الآن يعرض آخر تعديل تحريري، ويعود إلى تاريخ النشر عند غيابه، ولم يعد POST /articles/{slug}/feedback يغيّره.
أصبحت الرؤى تتضمن sentiment: bullish أو bearish أو sheepish، أو null عندما لا تكون مصنّفة.
عملاء بلغات TypeScript وPython وPHP وGo وRust وJava وC# وC++، يغطي كل منها جميع نقاط النهاية اعتماداً على نواة نقل واحدة: مصادقة Bearer، وفكّ غلاف الاستجابة، والتقاط X-Quota-*، وإعادة المحاولة عند 429 و5xx، وأخطاء ذات أنواع محددة، وتصفّح النتائج.
أصبح بإمكان نقاط النهاية أن تتطلب خطة. فعند تقديم هذه الميزة، كانت GET /sentiment/indicators تتطلب Pro، وكانت GET /sentiment/bull-bear وGET /sentiment/altseason وGET /global وGET /global/heatmap وGET /global/history/{metric} تتطلب Starter. ويُعيد أي استدعاء خارج خطتك 403 plan_required مع details.required_plan الذي يحدّد الخطة التي تفتحه، دون أن يستهلك من الحصة.
أُوقفت نقاط النهاية الست الخاصة بـ /liquidations في جميع الخطط: فهي تُعيد 503 endpoint_unavailable ("This endpoint is temporarily unavailable.") ولا تستهلك من الحصة.
انخفضت الحصة الشهرية لخطة Pro من 500,000 إلى 250,000 طلب.
تحوّلت نقطة النهاية العامة GET /coins/{slug}/indicators/{family} إلى 13 نقطة نهاية موثّقة كلٌّ منها على حدة على المسارات نفسها: rsi وstoch-rsi وsma وcci وmfi وwilliams-r وprice-volatility وvolume-volatility وmacd وobv وadx وvwap وcmf. ولم تتغير الاستدعاءات الحالية؛ ويحصل اسم المؤشر غير المعروف الآن على 404 عادي دون قائمة الأسماء الصالحة.
عند الإطلاق، كانت استدعاءات Data API وطلبات أدوات التضمين تسحب من رصيد شهري واحد مرتبط بخطة التضمين. وأصبح لـ Data API الآن خطط Free وStarter وPro خاصة بها، واشتراكها وحصتها الشهرية، وفترة فوترة خاصة بها: الشهر الميلادي بتوقيت UTC في Free، ومرتبطة بيوم التجديد في الخطط المدفوعة. وتُبلغ GET /ping وGET /usage عن خطة Data API، ولا يَعُدّ /usage إلا استدعاءات Data API. ولم تتغير الحدود عند الفصل.
انتقل المرجع من /{locale}/documentation إلى /{locale}/documentation/api/v1، وانتقلت مجموعة Postman وملف OpenAPI بصيغة YAML من /documentation.postman و/documentation.openapi إلى /documentation/api/v1.postman و/documentation/api/v1.openapi. وأُزيلت المسارات القديمة دون إعادة توجيه؛ ولم يتغير /api/v1/openapi.json.
الإطلاق: 73 عملية موزّعة على 15 مجموعة - العملات، والأسعار، والأسواق، ومنصات التداول، والمحافظ، والبيانات العالمية، والمعنويات، والمؤشرات، والتصفيات، والتحويل، والحاسبات، والمحتوى التحريري، والتنبيهات، وخطافات الويب، والبيانات الوصفية. مفاتيح Bearer بصلاحية data-api، وغلاف { data, meta }، ودقة السلاسل العشرية، وترويسات X-Quota-*، وخطافات ويب موقّعة. وكانت استدعاءات Data API وطلبات أدوات التضمين تتشارك حصة شهرية واحدة ضمن خطة التضمين، وكانت نوافذ المؤشرات الأطول تتطلب Starter.
يُعلَن عن إيقاف الدعم هنا وعبر البريد الإلكتروني لكل صاحب مفتاح قبل الإزالة بستة أشهر على الأقل - راجع سياسة إيقاف الدعم. ويحمل الفهرس القابل للقراءة آلياً على /apis.json تاريخ أحدث مُدخل بوصفه ختم modified الخاص به.