يعيد /v1/latest/USD JSON يتضمن السعر والمصدر ووقت الرصد. استخدم Decimal عند حساب المبالغ لتجنب أخطاء الدقة.
- تعمل urllib دون تبعيات إضافية.
- تسهل requests المصادقة والمهلة والأخطاء.
- يمكن استخدام forex-python كواجهة مؤقتة أثناء الترحيل.
- احفظ source وeffective_at وdata_updated_at مع القيمة.
- للتاريخ استخدم مسار اليوم أو
/v1/range.
استدعاؤك الأول، دون اعتماديات
لا تحتاج شيئًا خارج المكتبة القياسية. تتكفل urllib.request باستدعاء واحد:
يعمل هذا دون مفتاح. الاستدعاءات المجهولة محدودة لكل عنوان IP، فلأي شيء يتجاوز التجربة السريعة تحتاج مفتاحًا مجانيًا.
مع requests ومفتاح API
معظم المشاريع تستخدم requests أصلًا. مرّر مفتاحك كرمز bearer:
المفتاح المجاني يرفع حدك إلى 5,000 استدعاء شهريًا بمعدل 10 طلبات في الدقيقة. تعمل ترويسة X-API-Key أيضًا، للمنصات التي لا تستطيع ضبط Authorization.
حوّل مبلغًا
للتحويل بدل سرد الأسعار، استدعِ /v1/convert. يعيد السعر والمبلغ المحوّل معًا:
اعرف مدى حداثة السعر
للعملة المعروضة، اقرأ sources[currency] لمعرفة نوع المصدر وeffective_at[currency] لمعرفة وقت الرصد. يلخص source البيانات الأقل حداثة في الاستجابة كلها. يصف market_session جلسة السوق، بينما يشير timestamp إلى وقت إنشاء الاستجابة لا إلى وقت رصد السعر.
| قيمة الحقل | ما معناها | متى تتحرك |
|---|---|---|
| source: live | سعر فوري إرشادي | خلال اليوم (~60 ث)، أسبوع التداول |
| source: ecb_daily | تثبيت مرجعي رسمي | مرة كل يوم عمل |
| source: market_daily | إغلاق محفوظ بلا تثبيت ECB | تغذية السوق اليومية |
| market_session: weekend | سبت أو أحد (سوق ما بين البنوك مغلقة) | التثبيت المرجعي يحمل قيمة الجمعة؛ التغذية الحية لا تتحدث |
تُنشر الأسعار للمرجعية والتحليل والعرض. ليست تسعيرة تداول ويجب ألا تُستخدم لتسوية صفقة. تحمل كل استجابة ذلك في حقل notice الخاص بها.
اقرأ يومًا ماضيًا واحدًا
منذ 1999 بمفتاح Plus/Pro؛ المجانية 30 يوماً. تضيف الاستجابة is_forward_filled، وتكون true عندما لم يُنشر سعر في ذلك اليوم، كعطلة نهاية أسبوع أو عيد:
لسلسلة كاملة عبر نطاق تواريخ في استدعاء واحد، استخدم /v1/range مع start_date وend_date. يغطي ذلك دليل مستقل.
الترحيل من forex-python
يستخدم forex-python مزوده الخاص ولا يتصل تلقائياً بـ exchangerate.dev. يمكنك الحفاظ على واجهة مألوفة أثناء الترحيل، لكن احتفظ بمصدر exchangerate.dev ووقت الرصد.
import jsonfrom decimal import Decimalimport urllib.requesturl = "https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP"with urllib.request.urlopen(url, timeout=10) as response: data = json.load(response, parse_float=Decimal)print(data["rates"]["EUR"])print(data["sources"]["EUR"], data["effective_at"]["EUR"])print(data["market_session"])# Install first: python -m pip install requestsimport osfrom decimal import Decimalimport requestsresponse = requests.get( "https://api.exchangerate.dev/v1/latest/USD", headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"}, timeout=10, allow_redirects=False,)if response.status_code == 429: raise RuntimeError(f"Rate limited; Retry-After: {response.headers.get('Retry-After')}")if 300 <= response.status_code < 400: raise RuntimeError("Unexpected redirect")response.raise_for_status()data = response.json(parse_float=Decimal)print(data["rates"]["GBP"], data["effective_at"]["GBP"])import osfrom decimal import Decimalimport requestsresponse = requests.get( "https://api.exchangerate.dev/v1/convert/USD/EUR/100", headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"}, timeout=10, allow_redirects=False,)if not 200 <= response.status_code < 300: raise RuntimeError(f"HTTP {response.status_code}; Retry-After: {response.headers.get('Retry-After')}")data = response.json(parse_float=Decimal)print(data["rate"], data["converted"])import osfrom decimal import Decimalimport requestsresponse = requests.get( "https://api.exchangerate.dev/v1/2026-03-14/USD?symbols=JPY", headers={"Authorization": f"Bearer {os.environ['EXCHANGERATE_API_KEY']}"}, timeout=10, allow_redirects=False,)if not 200 <= response.status_code < 300: raise RuntimeError(f"HTTP {response.status_code}; Retry-After: {response.headers.get('Retry-After')}")data = response.json(parse_float=Decimal)print(data["rates"]["JPY"], data["is_forward_filled"])