إذا كنت تبحث عن بدائل لواجهة Frankfurter البرمجية، فالأرجح أنك أطلقت شيئًا بالفعل باستخدامها. Frankfurter هي واجهة أسعار الصرف المجانية الافتراضية لجيل كامل من المشاريع الجانبية: بلا مفتاح API، بلا تسجيل، بلا حصة استخدام، بواجهة REST نظيفة وشيفرة مفتوحة المصدر يمكنك قراءتها في أمسية واحدة. ثم يتغير شيء ما — سؤال يتعلق بالامتثال، خلل يظهر في عطلة نهاية الأسبوع، عميل يحتاج أسعارًا خلال اليوم — فتبدأ بالتساؤل عمّا هو متاح غير ذلك.
هذا الدليل نظرة صادقة إلى ذلك القرار. يغطي ما تفعله Frankfurter فعليًا في 2026 (معظم مقالات المقارنة تعتمد على معلومات قديمة)، والحدود الخمسة المحددة التي تدفع الفرق إلى مغادرتها، والمسارات الثلاثة الواقعية: استضافتها بنفسك، أو الانتقال إلى واجهة تجارية بمفتاح، أو تشغيل نموذج هجين. وفي النهاية مثال على الترحيل.
ما هي Frankfurter فعليًا في 2026
ما زالت كل قوائم «أفضل واجهات العملات المجانية» تقريبًا تصف Frankfurter بأنها «أسعار البنك المركزي الأوروبي، نحو 30 عملة، بلا بيانات في عطلة نهاية الأسبوع». كان ذلك صحيحًا لسنوات. لم يعد دقيقًا.
واجهة الإصدار الثاني على frankfurter.dev تتابع الأسعار اليومية من 84 بنكًا مركزيًا، وتغطي 201 عملة، بتاريخ يمتد إلى عام 1948. وهي مجانية فعليًا للاستخدام التجاري، لا تتطلب مصادقة، لا تنشر أي حصة شهرية أو يومية، وتوفّر مخرجات CSV وNDJSON إلى جانب JSON. هناك مواصفة OpenAPI، وملف llms.txt، وخادم MCP لسير عمل الوكلاء. ويمكنك استضافتها بنفسك عبر Docker.
هذا منتج أقوى مما تمنحه إياه القوائم، ويستحق أن يُقال بوضوح: بالنسبة لعدد كبير من المشاريع، Frankfurter هي الإجابة الصحيحة ولا ينبغي أن تنتقل عنها. إذا كنت تبني متتبعًا للمالية الشخصية، أو صفحة مرجعية للعملات، أو أداة فوترة تثبّت السعر مرة يوميًا، أو دفتر تحليل بيانات يسحب عقدًا من المتوسطات الشهرية، فإن Frankfurter تؤدي ذلك جيدًا ودون تكلفة.
بقية هذا المقال عن الحالات التي لا تؤديها فيها.
خمسة حدود تدفع الفرق للبحث عن بدائل لواجهة Frankfurter
1. الأسعار المرجعية اليومية ليست أسعارًا حية
هذا هو الحد البنيوي، وليس عيبًا — بل هي طبيعة مصدر البيانات. تُنشر الأسعار المرجعية للبنوك المركزية مرة واحدة في كل يوم عمل. فالبنك المركزي الأوروبي مثلًا ينشر أسعاره المرجعية لليورو كل يوم عمل نحو الساعة 16:00 بتوقيت وسط أوروبا. وFrankfurter تعرض تلك الأرقام بأمانة.
هذا يعني أن سعرًا تجلبه في الساعة 09:00 وآخر تجلبه في 15:00 هما الرقم نفسه، حتى لو تحرك السوق بنسبة 1.2% بينهما. في محوّل عملات للعرض فقط، لن يلاحظ أحد. أما في صفحة دفع، أو حساب مبلغ تسوية، أو أي موضع يقارن فيه العميل رقمك مع Google، فيتحول ذلك التأخر إلى تذكرة دعم.
إذا كان منتجك يحتاج أسعارًا تتحرك خلال اليوم، فأنت بحاجة إلى مصدر بيانات سوقية لا مصدر أسعار مرجعية. واجهة Finexly تتحدث كل دقيقة خلال ساعات السوق عبر أكثر من 170 عملة، وهذا نموذج بيانات مختلف لا نسخة أفضل من النموذج نفسه. مقالنا عن من أين تحصل واجهات أسعار الصرف على بياناتها يفصّل هذا الفرق.
2. لا توجد صفوف لعطلات نهاية الأسبوع أو الأعياد
البنوك المركزية لا تنشر أيام السبت والأحد ولا في العطل الوطنية. لذا فإن استعلامًا عن 2026-08-23 لن يعيد شيئًا مفيدًا، وسلسلة زمنية لشهر واحد ستضم نحو 21 صفًا لا 31.
كل فريق يصطدم بهذا بالطريقة نفسها: مهمة ليلية تعمل يوم الأحد، فتحصل على نتيجة فارغة أو مزاحة، ثم إما تنهار أو — وهو الأسوأ بكثير — تكتب null بصمت في دفتر الأستاذ. إذا كنت تبني على أسعار يومية من أي مصدر بنك مركزي، فأنت بحاجة إلى سياسة صريحة لتمديد آخر قيمة، وعليك توثيقها كتابةً، لأن «استخدام آخر سعر منشور» و«تخطي الصف» ينتجان قوائم مالية مختلفة.
3. الأسعار الممزوجة قد تتغير بعد النشر
افتراضيًا، تمزج Frankfurter الأسعار عبر جميع المزودين المساهمين. وأسئلتها الشائعة صريحة بشكل منعش بشأن النتيجة: قد تتحرك المنازل العشرية الأخيرة مع ورود بيانات جديدة، ولأغراض الامتثال ينبغي أن تفلتر إلى مزود بعينه.
هذا تصميم معقول تمامًا للاستخدام العام. لكنه يصبح مشكلة إذا خزّنت سعرًا وعرضته على مستخدم ثم طابقته لاحقًا مع جلب جديد — ستجد فروقًا دقيقة يصعب جدًا شرحها لمدقق حسابات. الحل من جهة Frankfurter هو تمرير providers=ECB (أو الجهة التي تنظّم عملك) بدلًا من قبول المزيج. والحل داخل نظامك أنت هو حفظ السعر الذي استخدمته فعليًا لحظة المعاملة وعدم اشتقاقه من جديد أبدًا. تنطبق هذه القاعدة على كل مزود، ونتناولها في دليل أسعار الصرف والإقرار الضريبي.
4. غياب مفتاح API يعني غياب الحصة — وغياب الرؤية
«لا حاجة إلى مفتاح API» هي أفضل ميزة في Frankfurter وأكثر مخاطرها استخفافًا. ولأنه لا يوجد مفتاح:
- ليست لديك حصة لكل تطبيق. أنت تشارك محدد معدل عام مع الإنترنت كله، بمن فيهم من يطرقه الآن من حلقة برمجية سيئة الكتابة.
- ليست لديك قياسات استخدام. لا توجد لوحة تخبرك بأن حجم استدعاءاتك تضاعف ثلاث مرات الثلاثاء الماضي.
- ليست لديك علاقة دعم. هناك صفحة حالة ومتتبع مشكلات على GitHub، وهو أكثر مما تقدمه خدمات مجانية كثيرة، لكن بلا اتفاقية مستوى خدمة وبلا شخص تستدعيه.
توجيه المشروع نفسه صريح: للاستخدام كثيف الحجم، خزّن الاستجابات مؤقتًا، أو استضف بنفسك، أو استعلم مجموعات البيانات مباشرة. نصيحة صادقة، وهي أيضًا اللحظة التي تبدأ فيها فرق كثيرة بتقييم بدائل واجهة Frankfurter — لا لأن البيانات خاطئة، بل لأنها تحملت اعتمادًا إنتاجيًا بلا أي عقد خلفه.
5. لا توجد نقطة نهاية للتحويل
توثّق Frankfurter هذا عمدًا: اجلب السعر واضرب. ثلاثة أسطر من الشيفرة.
لكنها أيضًا ثلاثة أسطر تُكتب بصيغ مختلفة قليلًا في ستة مواضع من قاعدة شيفرتك، وفي أحدها ستجد قسمة حيث يجب الضرب. نقطة نهاية convert مخصصة ليست ضرورة تقنية؛ إنها وسيلة لامتلاك تطبيق واحد بالضبط لقواعد التقريب والاتجاه. إن سبق أن أطلقت خللًا اختلف فيه EUR→USD عن USD→EUR بنسبة 0.3%، فأنت تعرف لماذا يهم هذا. دليلنا حول تقريب العملات والمنازل العشرية يغطي بقية حقل الألغام هذا.
مقارنة بدائل واجهة Frankfurter
تفاصيل الباقات المجانية أدناه هي ما نشره كل مزود وقت الكتابة. تحقّق منها قبل الالتزام — الباقات المجانية تتغير أكثر من التوثيق.
| الواجهة | الباقة المجانية | تواتر التحديث | المصادقة | عملة الأساس | الأنسب لـ |
|---|---|---|---|---|---|
| Frankfurter | غير محدودة (تقييد لمنع الإساءة، بلا SLA) | يوميًا، أيام العمل | لا شيء | أي عملة | المشاريع الشخصية، المحاسبة، البحث التاريخي |
| Frankfurter مستضافة ذاتيًا | مجانية + تكلفة بنيتك التحتية | يوميًا، أيام العمل | خاصتك | أي عملة | فرق تحتاج التحكم وتستخدم Docker أصلًا |
| Finexly | 1,000 طلب/شهر | كل دقيقة خلال ساعات السوق | مفتاح Bearer | أي عملة (أساس مخصص في الباقات الأعلى) | منتجات تحتاج أسعارًا خلال اليوم ومسار دعم |
| ExchangeRate-API | نحو 1,500 طلب/شهر | يوميًا | مفتاح | أي عملة | لوحات تُحدَّث مرة يوميًا |
| Open Exchange Rates | 1,000 طلب/شهر | كل ساعة | مفتاح | الدولار فقط في المجاني | تطبيقات الخادم التي تكتفي بأساس الدولار |
| Fixer.io | 100 طلب/شهر | كل ساعة | مفتاح | اليورو فقط في المجاني | التكاملات القديمة |
لدينا تحليلات جنبًا إلى جنب لعدد منها في مقارنة واجهات العملات وفي مقارنة واجهات أسعار الصرف الفورية.
الخيار الأول: استضافة Frankfurter بنفسك
أكثر الإجابات إهمالًا. تنشر Frankfurter صورة Docker، وتشغيلها بنفسك يزيل الأمرين اللذين يقلقان فرق الإنتاج فعلًا: محدد المعدل المشترك وغياب التحكم.
docker run -d -p 8080:8080 --name frankfurter \
lineofflight/frankfurterما تكسبه: استدعاءات داخلية غير محدودة، ومصير جاهزيتك بيدك، والقدرة على تثبيت مزود بعينه. وما تتحمله: حاوية، وقاعدة بيانات، ومراقبة، وشخص يلاحظ حين ينكسر الجلب من المصدر في عطلة مصرفية. هذه تكلفة حقيقية — وهي في جوهرها حجة تحليل البناء مقابل الشراء لدينا، مطبَّقة على شيفرة كتبها شخص آخر بالفعل.
الاستضافة الذاتية هي الخيار الصائب حين يكون حجمك كبيرًا، ومتطلبات الكمون صارمة، والأسعار المرجعية اليومية كافية فعلًا. لكنها لا تساعد إطلاقًا إذا كانت المشكلة حاجتك إلى أسعار خلال اليوم — ستشغّل عندئذٍ نسختك الخاصة من البيانات اليومية نفسها.
الخيار الثاني: الانتقال إلى واجهة بمفتاح وأسعار خلال اليوم
إذا كان سبب وجودك هنا هو حداثة الأسعار، أو تغطية أزواج نادرة، أو الحاجة إلى من يرد على بريدك، فالجواب الصادق هو واجهة تجارية بمفتاح.
إليك المهمة نفسها على الجانبين. Frankfurter أولًا:
curl "https://api.frankfurter.dev/v2/rate/USD/EUR"ومكافئها في Finexly:
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.finexly.com/v1/rate?from=USD&to=EUR"{ "pair": "USD_EUR", "rate": 0.9215 }مقابلة نقاط النهاية
| المهمة | Frankfurter v2 | Finexly v1 |
|---|---|---|
| سرد العملات | GET /v2/currencies | GET /v1/currencies |
| زوج واحد | GET /v2/rate/EUR/USD | GET /v1/rate?from=EUR&to=USD |
| عدة أزواج | GET /v2/rates?base=USD"es=EUR,GBP | GET /v1/convert?q=USD_EUR,USD_GBP |
| تحويل مبلغ | (غير متاحة — اضرب بنفسك) | GET /v1/convert-amount?from=USD&to=EUR&amount=100 |
| البيانات التاريخية | GET /v2/rates?date=1999-01-04 | الباقات المدفوعة — انظر دليل الأسعار التاريخية |
BASE_QUOTE صريحة، ما يتيح جلب USD_EUR وGBP_JPY في الطلب نفسه دون قسمة متقاطعة.غلاف للترحيل
لا تنثر عميلًا جديدًا في أنحاء قاعدة شيفرتك. ضع الاثنين خلف واجهة واحدة، فيصبح التراجع مجرد تغيير في الإعدادات:
import os
import requests
FINEXLY_KEY = os.environ["FINEXLY_API_KEY"]
def get_rate(base: str, quote: str, provider: str = "finexly") -> float:
"""Return the mid-market rate for base->quote."""
if provider == "frankfurter":
r = requests.get(
f"https://api.frankfurter.dev/v2/rate/{base}/{quote}",
timeout=5,
)
r.raise_for_status()
return float(r.json()["rate"])
r = requests.get(
"https://api.finexly.com/v1/rate",
params={"from": base, "to": quote},
headers={"Authorization": f"Bearer {FINEXLY_KEY}"},
timeout=5,
)
r.raise_for_status()
return float(r.json()["rate"])
print(get_rate("USD", "EUR"))تفصيلان يستحقان النقل. مفتاح API يأتي من بيئة التشغيل لا من الشيفرة المصدرية أبدًا — إذ تشير وثائق Finexly إلى أن المفاتيح الممررة كمعامل استعلام قد تتسرب عبر سجلات وصول الخادم وترويسات HTTP Referrer، لذا فترويسة Authorization هي مسار الإنتاج. كما أن لكل استدعاء مهلة زمنية، لأن القيمة الافتراضية في معظم عملاء HTTP هي «الانتظار إلى الأبد».
راقب ترويسات الاستجابة X-RateLimit-Limit وX-RateLimit-Used وX-RateLimit-Units لترى استهلاك الحصة لحظيًا. هذه القياسات هي بالضبط ما لا يمكن أن تمنحه واجهة بلا مصادقة، وغالبًا ما تكون السبب الحقيقي وراء انتقال الفرق.
الخيار الثالث: الهجين — خزّن واحدة مؤقتًا وارجع إلى الأخرى
النمط الذي تتقارب نحوه معظم أنظمة الإنتاج. استخدم مزودك الأساسي، وخزّن بقوة، واحتفظ بالواجهة المجانية بلا مصادقة كملاذ أخير:
const CACHE = new Map();
const TTL_MS = 60_000;
async function getRate(base, quote) {
const key = `${base}_${quote}`;
const hit = CACHE.get(key);
if (hit && Date.now() - hit.at < TTL_MS) return hit.rate;
let rate;
try {
const res = await fetch(
`https://api.finexly.com/v1/rate?from=${base}&to=${quote}`,
{ headers: { Authorization: `Bearer ${process.env.FINEXLY_API_KEY}` } }
);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
rate = (await res.json()).rate;
} catch (err) {
// Degrade to daily reference rates rather than failing the request
const res = await fetch(`https://api.frankfurter.dev/v2/rate/${base}/${quote}`);
rate = (await res.json()).rate;
}
CACHE.set(key, { rate, at: Date.now() });
return rate;
}تخزين مؤقت لمدة 60 ثانية على باقة مجانية بـ 1,000 طلب يغطي تطبيقًا صغيرًا بأريحية، لأن حجم استدعاءاتك يصبح دالة الزمن لا دالة حركة المرور. ضع علامة على استجابات الاحتياط في سجلاتك كي لا يمر تدهور صامت إلى سعر الأمس دون ملاحظة لأسبوع كامل. المزيد عن اختيار مدة الصلاحية وسلوك إعادة المحاولة في دليل التخزين المؤقت ومعالجة الأخطاء.
قائمة تحقق للقرار
امشِ في هذه القائمة وتوقف عند أول «نعم»:
- هل يجب أن تتغير الأسعار خلال يوم التداول؟ ← تحتاج واجهة بيانات سوقية لا واجهة أسعار مرجعية.
- هل هذا مسار خاضع للتنظيم أو للتدقيق؟ ← ثبّت مزودًا محددًا، واحفظ السعر الذي استخدمته، ولا تشتقه من جديد أبدًا.
- هل حجم الاستدعاءات كبير لكن الأسعار اليومية كافية؟ ← استضف Frankfurter بنفسك.
- هل تحتاج من يرد عليك عند العطل؟ ← تحتاج باقة بمفتاح ومستوى دعم.
- لا شيء مما سبق؟ ← ابقَ على Frankfurter. خزّنها مؤقتًا، وعالج فجوة نهاية الأسبوع، واصرف وقتك في مكان آخر.
معظم الفرق التي تخرج بحثًا عن بدائل واجهة Frankfurter تكتشف عند الخطوة الخامسة أن مشكلتها الحقيقية كانت تخزينًا مؤقتًا مفقودًا ويوم أحد غير معالج.
الأسئلة الشائعة
هل واجهة Frankfurter مجانية فعلًا للاستخدام التجاري؟ نعم. يذكر المشروع أنها مجانية للاستخدام التجاري، بلا حصة شهرية أو يومية — وتُقيَّد الطلبات فقط لمنع الإساءة. المقابل هو غياب اتفاقية مستوى الخدمة وعقد الدعم، فالمخاطرة تقع عليك.
هل تقدّم Frankfurter أسعار البنك المركزي الأوروبي فقط؟
لم يعد الأمر كذلك. تمزج واجهة الإصدار الثاني بيانات 84 بنكًا مركزيًا عبر 201 عملة، ويمكنك حصر النطاق بمصدر واحد عبر معامل providers. أما الوصف الشائع «البنك المركزي الأوروبي فقط، 30 عملة» فيعود إلى إصدارات أقدم.
لماذا لا تعيد Frankfurter بيانات في عطلة نهاية الأسبوع؟ لأن البنوك المركزية لا تنشر أسعارًا مرجعية في الأيام غير التجارية. وأي واجهة مبنية على بيانات بنوك مركزية لديها الفجوة نفسها. فإما أن تمدّد آخر سعر منشور، أو تستخدم مصدر بيانات سوقية يسعّر باستمرار.
ما أفضل بديل مجاني لـ Frankfurter؟ يعتمد على ما تريد أن يشتريه لك «المجاني». للأسعار اليومية غير المحدودة، لا شيء يتفوق على Frankfurter — استضفها بنفسك. ولباقة مجانية بتحديثات خلال اليوم ومفتاح API حقيقي، تمنحك باقة Finexly المجانية 1,000 طلب شهريًا عبر أكثر من 170 عملة. انظر دليل واجهات العملات المجانية للصورة الأوسع.
هل يمكنني استخدام Frankfurter وواجهة مدفوعة معًا؟ نعم، وهي بنية منطقية. وجّه حركة المرور الاعتيادية إلى مزودك الأساسي وارجع إلى Frankfurter عند الخطأ، كما في المثال الهجين أعلاه. فقط احرص على تسجيل استجابات الاحتياط، لأنها تحمل ضمانات حداثة مختلفة.
ابدأ الآن
إذا كانت الأسعار المرجعية اليومية تكفي لما تبنيه، فابقَ على Frankfurter — إنه مشروع جيد ولن يكلفك شيئًا. وإذا كنت تحتاج أسعارًا تتحرك خلال اليوم، أو تغطية تتجاوز مجموعات البنوك المركزية المرجعية، أو ترويسات استخدام يمكنك مراقبتها فعلًا، احصل على مفتاح Finexly المجاني — دون بطاقة ائتمان. ابدأ بـ 1,000 طلب شهريًا عبر أكثر من 170 عملة وترقَّ مع نموك، أو قارن الباقات أولًا في صفحة الأسعار.
Explore More
Vlado Grigirov
Senior Currency Markets Analyst & Financial Strategist
Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...
View full profile →