المصادقة والحدود
تدعم endpoints البيانات تجربة مجهولة: 10 طلبات في الدقيقة و100 في الساعة لكل IP. يستخدم الطلب بالمفتاح الحصة الشهرية للحساب. تتأخر أسعار Free بمقدار 15 دقيقة (الترويسة X-Price-Delay-Seconds: 900).
Authorization: Bearer YOUR_KEYX-RateLimit-Remaining: 9999X-RateLimit-Reset: 1788220800حقول تشرح حداثة البيانات
يحدد source فئة المصدر، ويصف market_session حالة السوق، ويبيّن data_updated_at وقت أقدم مشاهدة ساهمت في الاستجابة. احتفظ بالثلاثة.
نقاط النهاية
| GET /v1/latest[/{BASE}] | الأسعار الحالية، كلها أو مفلترة عبر symbols. |
| GET /v1/{YYYY-MM-DD}[/{BASE}] | لقطة تاريخية لتاريخ وعملة أساس. |
| GET /v1/convert/{FROM}/{TO}[/{AMOUNT}] · POST /v1/convert | تحويل مبلغ عبر GET أو دفعة عبر POST. |
| GET /v1/rate/{slug} | سعر زوج واحد بواسطة slug. |
| GET /v1/range | سلسلة يومية مع ترقيم وتنزيلات. |
| GET /v1/currencies | قائمة العملات المدعومة دون معاملات. |
| GET /v1/account | الحساب والخطة والمفتاح النشط واستهلاك الشهر. |
| GET /v1/indices/{index_slug} · GET /v1/indices/{index_slug}/timeseries | أحدث قيمة لمؤشرات USD وسلاسلها التاريخية. |
السلاسل خلال اليوم والتغطية
يدعم /v1/timeseries الفواصل 1m و5m و15m و1h و4h، والبيانات المرجعية اليومية 1d. لا يدعم 2h. تقاطعات SGD التي لا تشمل USD غير متاحة عند 4h، لكن USD/SGD والاتجاه العكسي متاحان. بدأ جمع بيانات السوق في 2026-09-14. تُحفظ بيانات 1m لمدة 30 يومًا، ولا يوجد حذف مجدول للفواصل الأكبر. مدة الاحتفاظ لا تعني توفر تاريخ كامل بهذه المدة. تغطي الفواصل خلال اليوم من 1m إلى 1h عدد 221 زوجًا فريدًا: 143 زوجًا مع USD و78 زوجًا متقاطعًا.
تتطلب التقاطعات التاريخية مشاهدات إغلاق فعلية ضمن الفترة نفسها بتوقيت UTC، بفارق لا يتجاوز 5 ثوانٍ. يستخدم effective_at وقت المشاهدة الأقدم. لا تُملأ الفجوات، وقد تتغير الفترة المفتوحة. يستخدم 1d البيانات المرجعية اليومية لجميع عملات الكتالوج. يُحسب كل زوج مرة واحدة في الجدول، مع دعم الاتجاهين.
| interval | الأزواج الفريدة |
|---|---|
1m | 221 |
5m | 221 |
15m | 221 |
1h | 221 |
4h | 209 |
1d | 10296 |
curl "https://api.exchangerate.dev/v1/timeseries?base=EUR&symbols=JPY&interval=15m&from=2026-09-14T12:00:00Z&to=2026-09-14T13:00:00Z" \ -H "Authorization: Bearer YOUR_API_KEY"الفترة المدعومة التي لا تحتوي على مشاهدات تعيد HTTP 200 مع data: [] وhas_more: false وnext_cursor: null. الفاصل غير المعروف يعيد unsupported_interval، والزوج خارج التغطية يعيد unsupported_pair_interval وrejected_pairs مع HTTP 400. يُرفض الطلب المختلط بالكامل.
WebSocket مباشر
اتصل بـ wss://api.exchangerate.dev/v1/stream وأرسل auth خلال 10 ثوانٍ. احتفظ بالمفتاح على الخادم، لا في URL أو JavaScript عام. الاتصالات المجهولة غير مدعومة. بعد authenticated أرسل subscribe. العملات المدعومة مذكورة أدناه؛ وتتطلب التقاطعات مشاهدتين حديثتين بفارق لا يتجاوز 5 ثوانٍ. قد تظهر الحالة unavailable أو stale. كل اتصال مقبول يستهلك وحدة واحدة من الحصة الشهرية.
الجدول للحسابات الجديدة. تحتفظ الحسابات الحالية بحدود الخطط القديمة Basic 3 × 25 أو Pro 10 × 100 (عدد الاتصالات × عدد الأزواج لكل اتصال). حدودك الفعلية في رسالة authenticated.
AUD, CAD, CHF, EUR, GBP, JPY, MXN, NOK, NZD, PLN, SEK, SGD, USD, ZAR
| الخطة | الاتصالات المتزامنة | الأزواج لكل اتصال |
|---|---|---|
| Free | 0 | 0 |
| Basic | 0 | 0 |
| Plus | 1 | 10 |
| Pro | 5 | 100 |
{"action":"auth","api_key":"YOUR_KEY"}{"action":"subscribe","base":"EUR","symbols":["USD","JPY"]}الأخطاء
REST: كل خطأ يستخدم { result: "error", code, message }. تضيف 429 ترويسة Retry-After، ولا تُستخدم بيانات وهمية عند تعطل المصدر. يتضمن HTTP 403 plan_gated الحقلين tier وinterval؛ وعند تجاوز الفترة التاريخية يتضمن أيضًا history_days وearliest_allowed. إذا كانت ترقية تسمح بالطلب، يتضمن upgrade_plans وupgrade_offers (plan وloses) وupgrade_url.
{ "result": "error", "code": "missing_parameter", "message": "required parameter missing: symbols"}{ "result": "error", "code": "plan_gated", "message": "The 15m interval is not included in your plan.", "tier": "plus_2026", "interval": "15m", "upgrade_plans": ["pro_2026"], "upgrade_offers": [{ "plan": "pro_2026", "loses": [] }], "upgrade_url": "https://exchangerate.dev/pricing?plan=pro_2026&source=api&reason=plan_gated"}curl -fsS --max-time 10 "https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP"from urllib.request import Request, urlopenimport json# Identify your application explicitly when calling the API.request = Request("https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP", headers={"User-Agent": "exchangerate-docs/1.0"})with urlopen(request, timeout=10) as response: data = json.load(response)print(data["rates"]["EUR"])const response = await fetch("https://api.exchangerate.dev/v1/latest/USD?symbols=EUR,GBP", { signal: AbortSignal.timeout(10_000),});if (!response.ok) throw new Error(`HTTP ${response.status}`);const data = await response.json();console.log(data.rates.EUR);أدلة التكامل: Python · JavaScript / Node.js · Google Sheets · Excel · Go · Swift · Zapier