البداية
ثلاث واجهات ومفتاح واحد: تنبؤات جوية من ECMWF ومن النماذج الوطنية عالية الاستبانة، ودرجات-يوم التدفئة والتبريد، و87 سنة من المناخ اليومي. هذه الصفحة هي كل ما تحتاجه قبل النداء الأول. أما نقاط النهاية نفسها فتجدها في صفحات المرجع الثلاث.
ما هذا#
تقدّم Climate Memory ثلاثة منتجات من مضيفَين اثنين، بمفتاح API واحد.
| المنتج | المضيف | يجيب عن | المرجع |
|---|---|---|---|
| الطقس | https://api.climatememory.com | ما الذي سيفعله الطقس — التنبؤ، الأحوال الراهنة، المجموعات الاحتمالية، جودة الهواء، حالة البحر، الأنهار | واجهة الطقس |
| درجات-اليوم | https://api.climatememory.com | كم لزم تدفئة مبنى أو تبريده — منذ 1950، في أي مكان | واجهة درجات-اليوم |
| المناخ | https://api.climatememory.com | ما المعتاد هنا — 87 سنة من المناخ اليومي، معدلات المنظمة العالمية للأرصاد الجوية، الاتجاهات | واجهة المناخ |
مضيفان لا مضيف واحد لأن درجات-اليوم تقرأ أرشيفًا آخر بملمح تكلفة مختلف، وفصلهما يتيح أن يبطؤ أحدهما دون أن يُبطئ الآخر. ولا يعنيك من ذلك شيء سوى نسخ عنوان URL الأساسي الصحيح.
كل نقاط النهاية من نوع GET. لا يوجد جسم طلب في
أي موضع من هذه الواجهة، ولا مؤشر ترقيم صفحات، ولا جلسة. النداء عنوان URL
وترويسة، أي أنك تستطيع تجربة أيّ منها في شريط عنوان المتصفح، أو بمفتاحك في أداة
بلا سلسلة استعلام مثل curl، وتستطيع تخزين أيّ منها مؤقتًا أمامنا
دون معالجة خاصة.
نداؤك الأول#
ثلاث خطوات، ومجملها نحو دقيقة.
1. احصل على مفتاح
أنشئ حسابًا على developers.climatememory.com/signin. الخطة
المجانية لا تطلب بطاقة، وتمنحك 10 000 رصيد شهريًا، ويظهر مفتاحك على الشاشة
فورًا. احتفظ به في متغير بيئة — فكل الأمثلة أدناه تقرأ
$API_KEY.
export API_KEY="wd_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
2. أجرِ النداء
curl -sH "X-API-Key: $API_KEY" \
"https://api.climatememory.com/v1/forecast?lat=48.85&lon=2.35&days=3"
import os, httpx
r = httpx.get(
"https://api.climatememory.com/v1/forecast",
params={"lat": 48.85, "lon": 2.35, "days": 3},
headers={"X-API-Key": os.environ["API_KEY"]},
timeout=30,
)
r.raise_for_status()
data = r.json()
print(data["daily"]["temperature_2m_max"])
const res = await fetch(
"https://api.climatememory.com/v1/forecast?lat=48.85&lon=2.35&days=3",
{ headers: { "X-API-Key": process.env.API_KEY } },
);
if (!res.ok) {
const { error } = await res.json();
throw new Error(`${error.code}: ${error.message}`);
}
const data = await res.json();
console.log(data.daily.temperature_2m_max);
req, _ := http.NewRequest("GET",
"https://api.climatememory.com/v1/forecast?lat=48.85&lon=2.35&days=3", nil)
req.Header.Set("X-API-Key", os.Getenv("API_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil { return err }
defer res.Body.Close()
var out struct {
Daily struct {
TemperatureMax []float64 `json:"temperature_2m_max"`
} `json:"daily"`
}
json.NewDecoder(res.Body).Decode(&out)
3. اقرأ الجواب
تعود كل السلاسل موجَّهة بالأعمدة — مصفوفات متوازية تتشارك
فهرس time واحدًا، لا قائمة كائنات. انظر
أعراف الاستجابة لمعرفة السبب وطريقة القراءة.
ثم: النداء نفسه باسم المدينة أفضل عادةً —
https://api.climatememory.com/v1/forecast/city/fr/paris يحمل ارتفاع المدينة الحقيقي
ومنطقتها الزمنية، وهما ما لا تحمله إحداثية مجردة. انظر
التنبؤ حسب المدينة.
الاستيثاق#
أرسل مفتاحك في ترويسة X-API-Key مع كل طلب. لا يوجد مسار OAuth،
ولا رمز bearer يحتاج تجديدًا، ولا توقيع يُحسب.
X-API-Key: wd_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
تُخزَّن المفاتيح مُجزَّأة. وإذا فقدت مفتاحًا فإنه يُدوَّر لا يُستعاد — لا يمكننا أن نعرضه عليك ثانية لأننا لا نملكه أصلًا. والتدوير متاح في وحدة التحكم ويصدر مفتاحًا جديدًا فورًا.
الـ scopes
يحمل المفتاح scopes، والخطة هي التي تقرر أيّها. ونداء نقطة نهاية خارج
scopes مفتاحك يعيد 403 scope_denied — وهذه مشكلة خطة لا مشكلة
مفتاح، والرسالة تقول ذلك.
| Scope | يفتح |
|---|---|
meteo | واجهة الطقس كاملة، بما فيها الإضافات |
dju | درجات-اليوم والتاريخ الساعي |
climate | أرشيف المناخ اليومي وتجميعاته |
normals | معدلات المنظمة العالمية للأرصاد الجوية ومقارنتها |
أما نقاط نهاية الترميز الجغرافي فلا تتطلب أيًّا منها. فأي مفتاح صالح يحلّ اسم مكان، في أي خطة، لأن كل منتج هنا يحتاج إحداثية قبل أن يجيب عن أي شيء. انظر الترميز الجغرافي.
لا تضع مفتاحك في متصفح أبدًا. نادِ الواجهة من خادمك ومرّر النتيجة إلى العميل. المفتاح في جافاسكربت الواجهة الأمامية مفتاح يقرؤه أي شخص من تبويب الشبكة وينفقه من حصتك — ولأنه مفتاحك، فالاستعمال لا يمكن تمييزه عن استعمالك.
وإن احتجت الطقس في تطبيق جوال فنقاط النهاية الجوالة موجودة لهذا الغرض تحديدًا: تصدر رمزًا لكل تثبيت بدل تضمين مفتاحك.
الترميز الجغرافي#
يحوّل اسم مكان إلى إحداثيات وارتفاع ومنطقة زمنية.
المعاملات
| المعامل | النوع | الافتراضي | الوصف |
|---|---|---|---|
q | string | — | اسم المكان، بأي لغة. علامات التشكيل اختيارية. مطلوب. |
lang | ISO-639-1 | en | للعرض والترتيب فقط — لا لتحديد المؤهل للظهور أبدًا. والرمز المجهول يرتد إلى الأسماء المحلية بدل أن يفشل. |
near | lat,lon | — | موقع المُنادي. وهو أقوى فاصل للتعادل على الإطلاق. |
country | ISO-3166-1 alpha-2 | — | التقييد ببلد واحد. |
limit | int | 10 | 1–50. |
الكتالوج هو صنف المعالم P من GeoNames بأكمله — كل مكان مأهول على الأرض، حتى القرى الصغيرة التي لا يتجاوز سكانها بضع عشرات، لا مستخرَجًا مُرشَّحًا بعدد السكان. قرية فيها 528 نسمة موجودة فيه.
لا يكلّف أرصدة في أي خطة ولا يتطلب scope. فالمفتاح المبيع لدرجات-اليوم يحلّ الأسماء أيضًا، لأن درجات-اليوم لا تُطلب بلا إحداثية. وله بدل ذلك سقف خاص به — خمسة طلبات ترميز جغرافي مقابل كل رصيد في خطتك — وهو سخي عمدًا بما يكفي لأن يكون صندوق بحث فوري بتأخير الكتابة هو الاستعمال المقصود. انظر حدود المعدل والحصة.
المطابقة لا تُقيَّد باللغة أبدًا
يُختبر الاستعلام مقابل الاسم المحلي ونقحرته اللاتينية وكل الأسماء البديلة
المترجمة، مهما كانت قيمة lang. وهذا أهم مما يبدو: 98 % من
الأماكن ليس لها اسم مترجم أصلًا — والفرنسية تغطي 1.84 % من الكتالوج — فالبحث
المرشَّح باللغة يجد العواصم ولا شيء غيرها. lang يختار أي اسم يعود
ويؤثر في الترتيب؛ لكنه لا يقرر أبدًا ما هو مؤهل للظهور.
GET /v1/geocode?q=ramillies&lang=fr
GET /v1/geocode?q=ramillies&lang=fr&near=50.63,3.06 # من ليل
GET /v1/geocode?q=bruxelles&lang=fr # اسم أجنبي، عبر فهرس الأسماء البديلة
GET /v1/geocode?q=zuesch&lang=de # الأوملاوت مكتوبًا مبسوطًا
كيف تُرتَّب النتائج
تحمل كل نتيجة score، وتحمل distance_km إذا
أُعطي near. ويجمع الترتيب أربع إشارات: جودة تطابق الاسم، وأهمية
المكان، وقربه من near، وما إذا كان الاسم المطابق باللغة
المطلوبة.
لماذا يوجد near. هناك راميّي (Ramillies)
اثنتان — واحدة فيها 5 749 نسمة في برابانت الوالونية، وأخرى فيها 528 في منطقة
أعالي فرنسا، وبينهما 126 كم. ولا واحدة منهما هي الجواب الصحيح في المطلق. فبلا
near تعود الأكبر؛ ومن مدينة ليل تعود الفرنسية.
الأهمية ليست عدد السكان وحده. 90.7 % من الكتالوج بلا عدد سكان مسجَّل — فـ GeoNames لا ينشر أي عدد لبعض البلدان — ولذلك يتولى نوع المكان (عاصمة وطنية، مقر وحدة إدارية، مكان عادي، حي) حمل الترتيب حيثما غاب عدد السكان.
الأوملاوت يُبسط ولا يُحذف. لوحة مفاتيح ألمانية أو دنماركية
بلا علامات تشكيل تكتب Zuesch بدل Züsch
وKoeln بدل Köln. وGeoNames لا يحمل هذا الرسم — فصيغته
اللاتينية Zusch، بحذف الأوملاوت لا ببسطه — ولذلك يُولَّد هنا.
والرسمان كلاهما يصلان إلى المكان، والنتيجة تعرض الاسم الحقيقي في الحالتين.
البحث عن المدن#
بحث الأسماء القديم. يطابق الاسم اللاتيني فقط ويرتب حسب عدد السكان.
أقرب مدينة مفهرسة إلى إحداثية.
/v1/cities/search أقدم من /v1/geocode ويحافظ على
عقده لمن بنوا عليه من قبل: فهو يطابق الاسم اللاتيني فقط ويرتب حسب عدد
السكان.
فضّل /v1/geocode في كل ما يراه
المستخدم. فالمسار الأقدم لا يستطيع مطابقة اسم أجنبي —
Bruxelles لن تجد Brussel — وترتيبه غير محدَّد لتسعة من كل
عشرة أماكن لا عدد سكان مسجَّلًا لها.
/v1/cities/nearest هو الاتجاه المعاكس، وهو ما يحوّل تحديد موقع
GPS إلى slug مدينة يمكنك تمريره بعدها إلى نقاط نهاية المدن. ويأخذ
lat وlon وmax_km اختياريًا.
وكلاهما يُحسب على سقف الترميز الجغرافي نفسه الخاص بـ
/v1/geocode، ولا يكلّف أي منهما أرصدة.
أعراف الاستجابة#
ست قواعد تسري على كل نقاط النهاية. تعلّمها مرة واحدة، وما بقي من هذه الوثائق مجرد أسماء حقول.
1. السلاسل أعمدة لا صفوف
كل سلسلة زمنية مجموعة مصفوفات متوازية تتشارك فهرس time واحدًا،
بدل مصفوفة كائنات:
"hourly": {
"time": ["2026-08-01T00:00:00+00:00", "2026-08-01T01:00:00+00:00"],
"temperature_2m": [18.4, 18.1],
"precipitation": [0.0, 0.2]
}
الفهرس i في كل مصفوفة يصف اللحظة نفسها. وهذا أصغر على الشبكة من
صيغة الصفوف بثلاث إلى خمس مرات، ويُفكَّك مباشرة إلى إطار بيانات أو مكتبة رسم بلا
تحويل، وهو ما تتوقعه أصلًا العملاء المكتوبة على نسق Open-Meteo. ولتصفحها
كصفوف:
rows = zip(h["time"], h["temperature_2m"], h["precipitation"])
2. الأوقات بصيغة ISO 8601 بإزاحة صريحة
دائمًا. 2026-08-01T00:00:00+00:00، لا سلسلة محلية مجردة ولا عدد
Unix صحيح. وحين تمرر timezone تكون الإزاحة في الاستجابة إزاحة تلك
المنطقة — فتصير السلسلة وحدها قاطعة، ولا تحتاج أبدًا إلى معرفة ما افترضناه
نحن.
3. الوحدات وحدات النظام الدولي، ثابتة ولا تُتفاوض
°م، ملم، م/ث، هكتوباسكال، و/م²، أمتار. ولا يوجد معامل
units=imperial عن قصد: مفتاح تبديل الوحدات حقل يتوقف معناه على حقل
آخر، وهكذا ينتهي المُنادي إلى رسم فهرنهايت على محور مئوي بعد تغيير إعدادات لم
يراجعه أحد. حوِّل عند حافتك أنت، حيث يوجد القارئ.
ونقاط النهاية ذات الوحدات غير المألوفة ترسل في الاستجابة كتلة
units تسميها صراحة، بدل أن تراهن على ذاكرتك.
4. null تعني «غير معروف» لا «صفر» أبدًا
الساعة الغائبة تكون null في المصفوفة، محتفظة بموضعها كي تبقى
الفهارس متحاذية. ولا تُملأ صامتة بصفر أبدًا — فبالنسبة للهطول هما ادعاءان
متضادان، وأحدهما كذبة عن جفاف.
5. كل استجابة تقول من أين جاءت
ترافق البياناتِ كتلةُ source (الطقس) أو كتلة
quality (الأرشيفات): أي نموذج أو تشغيل أجاب، وكم عمره، وكم كانت
الفترة مكتملة. فلا تحتاج أبدًا إلى استنتاج الطزاجة من الساعة.
6. القديم خير من لا شيء
إذا كان أحدث تشغيل لنموذجنا أقدم من المتوقع، فإننا نجيب رغم ذلك — مع
"stale": true وdata_age_hours في كتلة
source — بدل إعادة 503. فتنبؤ عمره ثماني ساعات أنفع من خطأ. تحقق من
العلامة إن كانت الطزاجة حاسمة عندك؛ وتجاهلها إن لم تكن.
لا ترقيم صفحات في أي مكان. فالطلب إما أن يعيد جوابه كاملًا أو يفشل بخطأ مجال يخبرك بالحد الأقصى. وبدل ذلك تُقيَّد المجالات لكل نقطة نهاية — ما يعني أن منطق إعادة المحاولة لن يضطر أبدًا إلى التعامل مع مجموعة نتائج مقروءة نصفها.
حدود المعدل والأرصدة والحصة#
تسري ثلاثة حدود مستقلة، وتفشل كلٌّ منها على نحو مختلف عن قصد. وكل استجابة ناجحة تخبرك أين تقف:
| الترويسة | المعنى |
|---|---|
X-RateLimit-Remaining | الطلبات المتبقية في الدقيقة المنزلقة الحالية |
X-Quota-Remaining | الأرصدة المتبقية هذا الشهر |
X-Quota-Resets-At | ختم ISO الزمني لإعادة التعيين الشهرية القادمة |
X-Geocode-Remaining | طلبات الترميز الجغرافي المتبقية هذا الشهر. على نقاط نهاية الكتالوج فقط، وهي وحدها ما يقيّده. |
أرصدة لا طلبات
تنبؤ مدينة من الذاكرة المؤقتة قراءة تستغرق 3 ملّي ثانية. أما عشر سنوات من درجات-اليوم الساعية لخمسمئة موقع فلا. والتسعير بالطلب كان سيسمح لمُنادٍ أن يبقى داخل حصته وأن يكلّف أكثر مما يدفع، وبوجه مشروع تمامًا — ولذلك تتوقف تكلفة النداء على مقدار الأرشيف الذي يحرّكه.
| نقطة النهاية | الأرصدة |
|---|---|
/v1/forecast و/v1/current وصيغهما حسب المدينة | 1 |
/v1/probability و/v1/air-quality و/v1/marine و/v1/hydrology | 1 |
/v1/cells/resolve و/v1/climate/cells/resolve | 1 |
/v1/climate/normals | 3 |
/v1/climate/normals/compare | 6 — لأنه يجيب عن فترتين |
/v1/climate/daily و/v1/climate/monthly | 2، +1 عن كل مدة كاملة من 365.25 يومًا ضمن المجال |
/v1/climate/summary | 3، +1 عن كل مدة كاملة من 365.25 يومًا ضمن المجال — نحو 89 للأرشيف كاملًا |
/v1/degree-days وصيغه حسب المدينة وحسب الخلية | 2، +1 عن كل مدة كاملة من 365.25 يومًا ضمن المجال |
/v1/degree-days/monthly | 2 |
/v1/historical | (السنوات + 1) × (المتغيرات ÷ 2)، مقرَّبًا للأسفل، وبحد أدنى 1 |
أي مما سبق مع format=csv | 4× تكلفة JSON |
/v1/geocode و/v1/cities/search و/v1/cities/nearest | 0 — محدود على حدة |
/v1/models و/v1/methods و/v1/coverage و/v1/climate/coverage و/v1/climate/fields و/v1/historical/variables و/v1/attribution و/v1/licensing | 1، ودون حاجة إلى مفتاح |
الترميز الجغرافي لا يكلّف أرصدة. فكل منتج هنا يحتاج إحداثية قبل أن يجيب، ولذلك فحلّ الاسم مشمول لا مبيع. وصندوق البحث الفوري هو الاستعمال المقصود: أضف إليه تأخير الكتابة ودعه يعمل.
غير أنه مقيَّد، وبسقفه هو لا بأرصدتك: خمسة طلبات ترميز جغرافي مقابل
كل رصيد في خطتك. وفي خطة الـ 50 000 رصيد يعني ذلك 250 000 بحث شهريًا،
وصندوق بحث بتأخير الكتابة ينفق منها نحو ستة لكل مكان يُعثر عليه. واستنفاده يعيد
429 geocode_quota_exceeded ويترك أرصدتك سليمة — ولهذا أيضًا كان
الرمزان منفصلين.
ماذا تفعل عند بلوغ كل حد
| الحد | الاستجابة | المعالجة |
|---|---|---|
| المعدل (في الدقيقة) | 429 rate_limited + Retry-After | انتظر عدد ثواني Retry-After ثم أعد المحاولة. وهذا عابر بحكم تصميمه. |
| الأرصدة (لكل فترة) | 429 quota_exceeded + X-Quota-Resets-At | إعادة المحاولة لن تنفع قبل إعادة التعيين. ارفع الخطة أو خفّض الميزة. |
| سقف الترميز الجغرافي | 429 geocode_quota_exceeded | أرصدتك سليمة وكل نقاط النهاية الأخرى تعمل. زد تأخير الكتابة. |
تمتد فترة حصتك من تاريخ اشتراكك إلى اليوم نفسه من الشهر التالي — وهي الفترة التي تفوترها Stripe — ويبدأ العدّاد كاملًا من جديد في كل مرة. وترويسة X-Quota-Resets-At تحمل ذلك التاريخ في كل استجابة، فاقرأها بدل افتراض أول الشهر. أما الحسابات بلا اشتراك فتتبع الشهر الميلادي.
خزّن مؤقتًا بلا تردد — لا يزعجنا ذلك، وهو حصة مجانية. فتشغيل التنبؤ يتغير مرتين إلى أربع مرات يوميًا؛ ومجموع درجات-اليوم لشهر مضى لا يتغير أبدًا. ولا شيء هنا خاص بمستخدم بعينه، فذاكرة HTTP مؤقتة عادية أمامنا آمنة. ونقاط نهاية الأرشيف تحديدًا تستحق التخزين إلى الأبد فيما دون الأيام الخمسة الأخيرة.
الأخطاء#
كل خطأ له الشكل نفسه، على المضيفَين كليهما:
{
"error": {
"code": "range_too_long",
"message": "Requested span is 14.0 years; the maximum per request is 10.",
"max_years": 10
}
}
ابنِ منطق إعادة المحاولة على error.code لا على حالة
HTTP. فثلاثة أوضاع مختلفة تعيد 429 وتحتاج ثلاث استجابات
مختلفة: واحد يريد انتظارًا قصيرًا، وآخر يريد تغيير خطة، وثالث لا ينبغي أن يوقف
تطبيقك أصلًا. والحالة وحدها لا تفرّق بينها. أما المفاتيح الإضافية —
max_years أعلاه — فتحمل الحد الذي تجاوزته، ليتكيف عميلك بدل أن
يخمّن.
| الحالة | الرمز | ماذا تفعل |
|---|---|---|
| 400 | invalid_latitude، invalid_longitude | صحّح الإحداثيات. خط العرض من −90 إلى 90، وخط الطول من −180 إلى 180. |
| 400 | range_too_long | قسّمه إلى عدة طلبات. وmax_years يذكر الحد. |
| 400 | bad_request | الصيغة العامة، حين لا يكون للفحص رمز أخص به. عُدّه دائمًا — فالطلب لن يصير صالحًا بإعادة إرساله. |
| 400 | invalid_coordinates | الزوج خارج المجال أو ليس نقطة على الأرض. |
| 400 | invalid_method، invalid_base | انظر طرائق الحساب. |
| 400 | invalid_breakdown | ليس واحدًا من daily أو weekly أو monthly أو yearly. |
| 400 | invalid_date | تاريخ ليس على صيغة ISO YYYY-MM-DD. |
| 400 | invalid_range | end يسبق start. |
| 400 | invalid_near | near ليس على صيغة lat,lon. |
| 400 | unknown_field، unknown_variable | اسأل /v1/fields أو /v1/climate/fields أو /v1/historical/variables عمّا يحويه ذلك المنتج — ولا يحتاج أي من الثلاثة مفتاحًا. وعلى /v1/forecast تذكر الرسالة أقرب تطابق لما طلبت. |
| 400 | unknown_period | ليست فترة مرجعية للمنظمة العالمية للأرصاد الجوية. انظر المعدلات. |
| 400 | period_not_covered | الأرشيف لا يغطي تلك الفترة المرجعية عند هذه النقطة. |
| 401 | missing_api_key | ترويسة X-API-Key غائبة. |
| 401 | invalid_api_key | المفتاح مجهول أو جرى تدويره. |
| 401 | unauthorized | الصيغة العامة، حين لا ينطبق شيء أخص. |
| 402 | export_not_in_plan | تصدير CSV ميزة في الخطط المدفوعة. |
| 403 | scope_denied | خطتك لا تشمل هذه الواجهة. انظر الـ scopes. |
| 403 | key_inactive | المفتاح موجود لكنه أُبطل أو عُطّل. وتدوير مفتاح يفعل ذلك بالقديم — راجع وحدة التحكم قبل افتراض عطل. |
| 404 | city_not_found | تتضمن الاستجابة مصفوفة suggestions — اعرضها. |
| 404 | cell_not_found | خلية مثبَّتة لم تعد موجودة. انظر تثبيت خلية. |
| 404 | not_at_sea | طلب بحري فوق اليابسة. ونموذج الأمواج لا قيمة له هناك. |
| 404 | not_found | الصيغة العامة. وكما سبق: دائم. |
| 404 | no_city_nearby | لا شيء مفهرس ضمن max_km من تلك النقطة. |
| 404 | outside_archive | التواريخ خارج ما يحويه الأرشيف. و/v1/climate/coverage يذكر ما يحويه ولا يحتاج مفتاحًا. |
| 429 | rate_limited | تراجَع مدة Retry-After بالثواني. |
| 429 | quota_exceeded | انتظر إعادة التعيين أو ارفع الخطة. وإعادة المحاولة قبل ذلك لا يمكن أن تنجح. |
| 429 | geocode_quota_exceeded | سقف الترميز الجغرافي وحده. أرصدتك سليمة؛ أضف تأخير الكتابة إلى صندوق البحث. |
| 503 | data_unavailable | عابر. أعد المحاولة بتراجع أسّي. |
| 503 | load_shed | رُفض عمدًا لحماية الخدمة تحت الحمل. ودرجة حرجية خطتك تقرر من يُسقَط أولًا. أعد المحاولة بتراجع؛ فهو ينقضي خلال ثوانٍ. |
| 503 | catalogue_unavailable | كتالوج المدن بعيد المنال للحظات. والإحداثيات ما زالت تعمل — ارتد إليها بدل إفشال الطلب. |
هذه هي القائمة كلها، وتُقارَن بالشيفرة المصدرية في كل بناء: فرمز منشور هنا لا يرفعه أي معالج يُسقط مجموعة الاختبارات، وكذلك معالج يرفع رمزًا لا يحمله هذا الجدول. وإن صادفت رمزًا ليس أعلاه فذلك عيب في هذه الصفحة لا قيمة ينبغي أن تعالجها معالجة خاصة.
سياسة إعادة محاولة ناجحة
RETRY = {"rate_limited", "data_unavailable"}
def should_retry(status, code, attempt):
if code == "quota_exceeded":
return False # لا شيء يتغير قبل إعادة التعيين
if code == "geocode_quota_exceeded":
return False # ولا تتوقف: الأرصدة ما زالت تعمل
if code in RETRY:
return attempt < 5
return status >= 500
الدقة — ما الذي تتوقعه#
نفضّل ضبط التوقعات ضبطًا صحيحًا على أن تكتشف الحدود في بيئة الإنتاج.
حيث يكون التنبؤ قويًا
الحرارة والضغط والرياح السينوبتية والرطوبة وسطوع الشمس. ويبلغ الخطأ المعتاد لحرارة الـ 2 م عند 24 ساعة نحو 1–1.5 °م. وECMWF أفضل نموذج حتمي عالمي في العالم، وهو ما تحصل عليه.
حيث يضعف
العواصف الحملية — فخلية عرضها 28 كم لا تحلّ عاصفة رعدية، وحتى 3 كم لا تعدو التلميح إليها. وكذلك الموضع والتوقيت الدقيقان للزخات. والمناخ الصغري الساحلي والجبلي دون استبانة النموذج. ونسيم البحر وبرك الهواء البارد في الوديان، وهي ما لا يُنمذجه تصحيح التضاريس.
أمانة جغرافية
في فرنسا وألمانيا والولايات المتحدة وكندا نقدّم نماذج وطنية باستبانة 1.3–3 كم، وقرية صغيرة تحصل فعلًا على خلية شبكة خاصة بها. وفي بقية أوروبا تحصل على 6.5 كم. وعبر إفريقيا والشرق الأوسط ومعظم آسيا يكون أفضل نموذج عام متاح بين 13 و28 كم، فتحصل على طقس المنطقة لا طقس الشارع. وتصحيح التضاريس يضيّق تلك الفجوة لكنه لا يغلقها.
درجات-اليوم
إعادة التحليل الشبكية تغطي كل مكان، بما في ذلك مواقع لا محطة أرصاد فيها ضمن 60 كم — وتلك ميزتها على المزودين المعتمدين على المحطات. وضعفها مراكز المدن التي تقرؤها إعادة التحليل أقل من حقيقتها؛ ونقاط نهاية المدن تطبّق تصحيحًا معايَرًا، أما نقاط نهاية الإحداثيات فلا.
حقلان تقديريان، ونفضّل قول ذلك
uv_index مشتق من ارتفاع الشمس والإشعاع عريض النطاق، لا من عمود
الأوزون — بدقة نحو ±1 وحدة. وprecipitation_probability_proxy تقدير
لا احتمال؛ والاحتمال الحقيقي في
/v1/probability. وكلاهما مشروح بالكامل في
مرجع الحقول.
الخطط#
| الخطة | السعر | أرصدة / شهر | المعدل | المفاتيح | الـ scopes |
|---|---|---|---|---|---|
| مجانية | 0 € | 10 000 | 20 / دقيقة | 1 | الطقس، إضافة إلى درجات-اليوم والمناخ لمدة 30 يومًا |
| Starter | 19 € / شهر | 50 000 | 60 / دقيقة | 3 | الطقس + درجات-اليوم + المناخ |
| Pro | 79 € / شهر | 400 000 | 300 / دقيقة | 10 | الطقس + درجات-اليوم + المناخ + المعدلات |
| Business | ابتداءً من 299 € / شهر | يُتَّفق عليه في العقد | يُتَّفق عليه في العقد | 50 | الطقس + درجات-اليوم + المناخ + المعدلات |
الترميز الجغرافي خارج هذا الجدول: فهو لا يكلّف أرصدة في أي خطة، وله سقفه الخاص وهو خمسة طلبات لكل رصيد. انظر حدود المعدل والحصة.
الفوترة السنوية تعني شهرين مجانًا. والكتالوج الحي على developers.climatememory.com/pricing — وتلك الصفحة تقرأ نظام الفوترة مباشرة، فإن اختلفا يومًا فهي المرجَّحة.
ولا توجد نقطة نهاية للتصدير الجملي في أي خطة. أما تصدير CSV فموجود على أرشيفي درجات-اليوم والمناخ، ومقيَّد بالمجال نفسه الذي يقيَّد به نداء JSON المكافئ، ولا يعيد إلا صفوفًا مجمَّعة — لا السلسلة الساعية أبدًا.
النسبة والترخيص#
الصياغة المطلوبة بدقة، بصيغة تقرؤها الآلة. دون حاجة إلى مفتاح.
جدول التراخيص وراء كل مجموعة بيانات. دون حاجة إلى مفتاح.
النسبة شرط استعمال لا مجاملة. فالبيانات الأساسية مرخَّصة لنا بشروط تفرضها، وتلك الشروط تنتقل إليك. اعرض تنويهًا حيثما ظهرت البيانات، بما في ذلك في المنتجات المشتقة. ويكفي سطر في التذييل:
Weather data: ECMWF, DWD, NOAA, Météo-France · Climate data: Copernicus/ERA5-Land · Places: GeoNames
ونقطتا النهاية أعلاه لا تحتاجان مفتاحًا، فيمكنك توليد التنويه من الواجهة بدل
تثبيت نص في الشيفرة يتقادم حين يتغير مصدر. كما تسافر نسبة التشغيل المحدد الذي
أجاب مع كل استجابة بيانات، في source.attribution وفي ترويسة
X-Data-Attribution.
لك أن تذكر أنك تستعمل هذه البيانات. وليس لك أن توحي بأن أيًّا من هذه المنظمات أنتجت منتجك أو أقرّته أو تدعمه.
إخلاء مسؤولية
تُقدَّم التنبؤات دون ضمان. ولا تتحمل المفوضية الأوروبية ولا ECMWF ولا DWD ولا NOAA ولا Météo-France أي مسؤولية عن أي استعمال لهذه المعلومات. ولا تستعملها أساسًا وحيدًا لقرارات تكون فيها الحياة أو السلامة أو الممتلكات في خطر.
وثمة قيد واحد ليس لنا أن نتنازل عنه: رخصة Copernicus تحصر تحذيرات الفيضان بالسلطات الوطنية والإقليمية. انظر الأنهار.