<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Madhushan </title>
    <description>The latest articles on DEV Community by Madhushan  (@chathuranga_basnayaka_d50).</description>
    <link>https://dev.to/chathuranga_basnayaka_d50</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3869509%2F6d1cfce1-9843-4a19-a648-5dfac84ccab7.png</url>
      <title>DEV Community: Madhushan </title>
      <link>https://dev.to/chathuranga_basnayaka_d50</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chathuranga_basnayaka_d50"/>
    <language>en</language>
    <item>
      <title>AllRatesToday vs Open Exchange Rates: The 2026 Exchange Rate API Comparison</title>
      <dc:creator>Madhushan </dc:creator>
      <pubDate>Tue, 21 Apr 2026 19:43:23 +0000</pubDate>
      <link>https://dev.to/chathuranga_basnayaka_d50/allratestoday-vs-open-exchange-rates-the-2026-exchange-rate-api-comparison-4p49</link>
      <guid>https://dev.to/chathuranga_basnayaka_d50/allratestoday-vs-open-exchange-rates-the-2026-exchange-rate-api-comparison-4p49</guid>
      <description>&lt;h1&gt;
  
  
  AllRatesToday vs Open Exchange Rates: The 2026 Exchange Rate API Comparison
&lt;/h1&gt;

&lt;p&gt;Open Exchange Rates has been a staple currency API for more than a decade. It's reliable, well-documented, and the 1,000-request free tier is generous on paper. But talk to developers shipping payments, invoicing, and multi-currency checkouts in 2026 and you hear the same five complaints repeatedly: &lt;strong&gt;USD-only base currency on the free tier&lt;/strong&gt;, &lt;strong&gt;hourly updates&lt;/strong&gt;, &lt;strong&gt;no official SDKs&lt;/strong&gt;, &lt;strong&gt;time-series queries burn the quota&lt;/strong&gt;, and &lt;strong&gt;the conversion endpoint is paid-only&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This article compares Open Exchange Rates against &lt;strong&gt;AllRatesToday&lt;/strong&gt; across the criteria that actually matter, and explains where AllRatesToday was built specifically to fix each of those pain points.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR — Side-by-side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;AllRatesToday&lt;/th&gt;
&lt;th&gt;Open Exchange Rates&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Update frequency&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;60 seconds&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hourly (free/Dev/Enterprise), 10 min (Unlimited $97/mo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free tier requests&lt;/td&gt;
&lt;td&gt;300/month&lt;/td&gt;
&lt;td&gt;1,000/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Base currency (free)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Any&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;USD only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple base currencies&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;All plans&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developer plan ($12/mo) and above&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historical data (free)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes, cheap&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes, but each day = 1 request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversion endpoint&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Paid only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Official SDKs&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;JS, Python, PHP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None (community-maintained only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP / AI integrations&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Yes&lt;/strong&gt; (Claude Code, Cursor, DeepSeek)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data source&lt;/td&gt;
&lt;td&gt;Reuters/Refinitiv + interbank&lt;/td&gt;
&lt;td&gt;"Blended" (undisclosed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS on free&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CORS&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Update frequency: real-time vs hourly
&lt;/h2&gt;

&lt;p&gt;This is the single biggest technical difference.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AllRatesToday&lt;/strong&gt; refreshes rates every &lt;strong&gt;60 seconds&lt;/strong&gt; from Reuters (Refinitiv) and interbank market feeds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Exchange Rates&lt;/strong&gt; refreshes &lt;strong&gt;hourly&lt;/strong&gt; on its free, Developer ($12/mo), and Enterprise ($47/mo) tiers. Only the Unlimited plan ($97/mo) updates every 10 minutes — and that's still not real-time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For anything where the exchange rate affects the amount of money changing hands — checkout pricing, cross-border quotes, treasury dashboards — hourly data can be 1% off the market during a volatile session. That 1% comes out of your margin.&lt;/p&gt;

&lt;p&gt;OpenExchangeRates' hourly cadence made sense in 2012. In 2026, real-time rates are available for free from several providers, and your users will notice the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  Base currency: USD-only is a 2012-era constraint
&lt;/h2&gt;

&lt;p&gt;Open Exchange Rates' free plan &lt;strong&gt;only supports USD as a base currency&lt;/strong&gt;. If you're building anything with a non-USD home market — a European SaaS, an Indian fintech, a Southeast Asian marketplace — you have two options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetch USD-based rates and do cross-rate math in application code (extra code, rounding risk).&lt;/li&gt;
&lt;li&gt;Upgrade to the Developer plan ($12/mo) or higher to get flexible base currencies.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AllRatesToday lets you pass &lt;strong&gt;any base currency on any plan&lt;/strong&gt;, including the free tier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/v1/rates?source=EUR&amp;amp;target=USD,GBP,CHF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done. No workarounds, no upgrade required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Historical data: watch the quota burn
&lt;/h2&gt;

&lt;p&gt;OpenExchangeRates does include historical data on the free plan — but with a catch. The &lt;code&gt;time-series.json&lt;/code&gt; endpoint &lt;strong&gt;counts one request per day of data returned&lt;/strong&gt;. A 30-day query uses 30 of your 1,000 monthly requests. A one-year backfill (365 days) uses 36.5% of your quota in a single call.&lt;/p&gt;

&lt;p&gt;AllRatesToday's historical endpoint returns the entire range as one request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/historical-rates?source=USD&amp;amp;target=EUR&amp;amp;from=2025-04-01&amp;amp;to=2026-04-01
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One request, one year of data, no quota multiplier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conversion: free vs paid
&lt;/h2&gt;

&lt;p&gt;Open Exchange Rates exposes a dedicated &lt;code&gt;/api/convert.json&lt;/code&gt; endpoint — but it's &lt;strong&gt;paid-only&lt;/strong&gt;. On the free tier you have to fetch rates and do the multiplication in your own code.&lt;/p&gt;

&lt;p&gt;With AllRatesToday's official SDKs, &lt;code&gt;convert()&lt;/code&gt; is a one-liner on every plan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// { from: 'USD', to: 'EUR', amount: 1000, rate: 0.9234, result: 923.4 }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Official SDKs
&lt;/h2&gt;

&lt;p&gt;OpenExchangeRates' own documentation says it plainly: they don't maintain official SDKs. There are "several hundred" community integrations, but the company "isn't able to provide support for any of these libraries, except those they actively maintain or contribute to." In practice, that means picking a third-party library on GitHub, auditing it yourself, and hoping the maintainer is still active.&lt;/p&gt;

&lt;p&gt;AllRatesToday ships first-party SDKs for three languages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npm install @allratestoday/sdk&lt;/code&gt; (JavaScript/TypeScript)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pip install allratestoday&lt;/code&gt; (Python)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;composer require allratestoday/sdk&lt;/code&gt; (PHP)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus an MCP server for AI coding tools (Claude Code, Cursor, Claude Desktop) and a DeepSeek function-calling package — integrations Open Exchange Rates doesn't ship at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data source transparency
&lt;/h2&gt;

&lt;p&gt;OpenExchangeRates describes its data as "blended" from multiple sources, but &lt;strong&gt;doesn't disclose which sources&lt;/strong&gt;. That's fine for shopping-cart-accurate rates, but it's not enough for a regulated environment where auditors ask where the number came from.&lt;/p&gt;

&lt;p&gt;AllRatesToday publishes its sources: &lt;strong&gt;Reuters (Refinitiv) and interbank market feeds&lt;/strong&gt;. These are the same feeds used by Bloomberg terminals and enterprise treasury systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Open Exchange Rates is still the right call
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You already have a working integration and don't want to touch it.&lt;/li&gt;
&lt;li&gt;You need 1,000+ requests/month on a free tier and can tolerate hourly data.&lt;/li&gt;
&lt;li&gt;Your use case is USD-only accounting or price display where base flexibility doesn't matter.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When AllRatesToday is the better choice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You need real-time (60-second) rates without paying.&lt;/li&gt;
&lt;li&gt;You need any-base-currency flexibility on a free plan.&lt;/li&gt;
&lt;li&gt;You want official SDKs instead of community libraries.&lt;/li&gt;
&lt;li&gt;You want MCP or DeepSeek tool-calling for AI assistants.&lt;/li&gt;
&lt;li&gt;You need transparent data sources for compliance or audit.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Migration is a one-afternoon job
&lt;/h2&gt;

&lt;p&gt;The two APIs share the same JSON shape for the core "get rates" call. In most projects, swapping the client is a handful of lines. We've written a &lt;a href="https://dev.to/blog/migrate-from-openexchangerates-to-allratestoday/"&gt;full migration guide&lt;/a&gt; that covers every endpoint.&lt;/p&gt;




&lt;p&gt;Ready to switch? &lt;a href="https://allratestoday.com/register" rel="noopener noreferrer"&gt;Get your free AllRatesToday API key&lt;/a&gt; — real-time rates, any base currency, free historical data, and official SDKs. No credit card required.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Open Exchange Rates' USD-Only Base Currency Is a Problem (And How AllRatesToday Fixes It)</title>
      <dc:creator>Madhushan </dc:creator>
      <pubDate>Tue, 21 Apr 2026 19:42:26 +0000</pubDate>
      <link>https://dev.to/chathuranga_basnayaka_d50/why-open-exchange-rates-usd-only-base-currency-is-a-problem-and-how-allratestoday-fixes-it-3ica</link>
      <guid>https://dev.to/chathuranga_basnayaka_d50/why-open-exchange-rates-usd-only-base-currency-is-a-problem-and-how-allratestoday-fixes-it-3ica</guid>
      <description>&lt;h1&gt;
  
  
  Why Open Exchange Rates' USD-Only Base Currency Is a Problem
&lt;/h1&gt;

&lt;p&gt;Open Exchange Rates' free plan locks you to a single base currency: &lt;strong&gt;USD&lt;/strong&gt;. If you want to query rates with EUR, GBP, INR, or any other currency as the base, you have to upgrade to the Developer plan at $12/month — and even that has per-base limits on the cheaper tiers.&lt;/p&gt;

&lt;p&gt;For a US-market product, this is fine. For everyone else, it's an unnecessary constraint that leaks into your codebase. This article explains why, what the workarounds actually cost, and why &lt;strong&gt;AllRatesToday&lt;/strong&gt; lets you use any base currency on any plan, including the free tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "USD-only base" means in practice
&lt;/h2&gt;

&lt;p&gt;When you call Open Exchange Rates' free &lt;code&gt;/latest.json&lt;/code&gt; endpoint, the response is always "1 USD equals X of each target":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"base"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"EUR"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9234&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"GBP"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.7891&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"INR"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;83.42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your product thinks in EUR ("what's 1 EUR in USD and GBP?"), you can't ask that question directly. You have to ask for USD rates, then derive the EUR rates yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;usdRates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getOpenExchangeRates&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// base = USD&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eurToUsd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;usdRates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EUR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;             &lt;span class="c1"&gt;// invert&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eurToGbp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;usdRates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GBP&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;usdRates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EUR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// cross-rate&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eurToInr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;usdRates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;INR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;usdRates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EUR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// cross-rate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three problems show up immediately:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Rounding accumulates.&lt;/strong&gt; Every inversion and cross-rate multiplication introduces floating-point error. Over thousands of conversions a day, the drift is measurable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code clutter.&lt;/strong&gt; Every place you'd write a single API call becomes three lines of math. Bugs hide in the transformation code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mental model mismatch.&lt;/strong&gt; Your product thinks in EUR; your API thinks in USD. Engineers constantly translate back and forth when reading logs, tests, and metrics.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The workarounds (and what each costs you)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Workaround 1: Do the cross-rate math.&lt;/strong&gt; Cheapest option, zero infra cost, but adds code complexity and a rounding-bug surface area. Fine for low-stakes use cases; risky for payments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workaround 2: Upgrade to the Developer plan.&lt;/strong&gt; $12/month ($144/year) buys you base-currency flexibility — but you're also paying for features you might not need (larger quotas, priority support). If base currency is the &lt;em&gt;only&lt;/em&gt; reason you're upgrading, that's $144/year for what should be a free feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Workaround 3: Cache both directions.&lt;/strong&gt; Fetch USD-based rates, then pre-compute EUR-based rates on the way into your cache. Works, but now you have two code paths and a cache invalidation concern.&lt;/p&gt;

&lt;h2&gt;
  
  
  How AllRatesToday handles it
&lt;/h2&gt;

&lt;p&gt;Any base currency, any plan, including the free tier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="s2"&gt;"https://allratestoday.com/api/v1/rates?source=EUR&amp;amp;target=USD,GBP,INR"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EUR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.0830&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"GBP"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.8546&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"INR"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;90.34&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-21T12:00:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No inversion, no cross-rate math, no upgrade required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this actually affects
&lt;/h2&gt;

&lt;p&gt;Most products outside the US hit this wall:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;European SaaS&lt;/strong&gt; billing in EUR, showing prices in GBP and CHF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indian fintech&lt;/strong&gt; with INR as the home currency, quoting cross-border remittances.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Southeast Asian marketplaces&lt;/strong&gt; with SGD or MYR as the base, displaying prices in regional currencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LATAM payment platforms&lt;/strong&gt; with BRL, MXN, or ARS as the base.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canadian and Australian products&lt;/strong&gt; where CAD or AUD is the natural home currency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Any of these use cases require either paying for Open Exchange Rates or writing cross-rate glue code. With AllRatesToday, you skip both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-base queries in one call
&lt;/h2&gt;

&lt;p&gt;AllRatesToday also supports multi-target queries with any base. One request gives you EUR against every currency you care about:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET /api/v1/rates?source&lt;span class="o"&gt;=&lt;/span&gt;EUR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open Exchange Rates' equivalent requires either upgrading or making one request per base — each of which counts against your quota.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger picture
&lt;/h2&gt;

&lt;p&gt;USD-only base on the free tier is an artifact of Open Exchange Rates' original design from the early 2010s, when USD was the default reference for almost every web app. In 2026, that assumption is showing its age. Cross-border commerce, EU and UK fintech, Indian SaaS, and Southeast Asian marketplaces all benefit from native multi-base support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AllRatesToday&lt;/strong&gt; was built with this in mind: every endpoint accepts any supported currency as the source, and there's no plan-gated "base currency" feature.&lt;/p&gt;




&lt;p&gt;Done paying for a feature that should be free? &lt;a href="https://allratestoday.com/register" rel="noopener noreferrer"&gt;Get your free AllRatesToday API key&lt;/a&gt; — any base currency, real-time rates, 160+ currencies, no credit card.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Open Exchange Rates Hourly Updates vs AllRatesToday's 60-Second Real-Time Feed</title>
      <dc:creator>Madhushan </dc:creator>
      <pubDate>Tue, 21 Apr 2026 19:41:53 +0000</pubDate>
      <link>https://dev.to/chathuranga_basnayaka_d50/open-exchange-rates-hourly-updates-vs-allratestodays-60-second-real-time-feed-473g</link>
      <guid>https://dev.to/chathuranga_basnayaka_d50/open-exchange-rates-hourly-updates-vs-allratestodays-60-second-real-time-feed-473g</guid>
      <description>&lt;h1&gt;
  
  
  Open Exchange Rates Hourly Updates vs AllRatesToday's 60-Second Real-Time Feed
&lt;/h1&gt;

&lt;p&gt;Open Exchange Rates' documentation is explicit about cadence: &lt;strong&gt;"All plans update hourly, except for the Unlimited Plan, which updates every 10 minutes."&lt;/strong&gt; The Unlimited plan is $97/month.&lt;/p&gt;

&lt;p&gt;That means unless you're paying top tier, the rate you see at 14:03 is the rate that was set at around 14:01 — and it will not change until roughly 15:01. Between the two timestamps, you're working with data that's up to 59 minutes stale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AllRatesToday&lt;/strong&gt; refreshes every 60 seconds across every plan, including the free tier. This article explains why that matters, when hourly data is enough, and how much hourly staleness costs in concrete scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  The update cadence, plan by plan
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider / Plan&lt;/th&gt;
&lt;th&gt;Update interval&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AllRatesToday — Free&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;60 seconds&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AllRatesToday — Any paid plan&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;60 seconds&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenExchangeRates — Free&lt;/td&gt;
&lt;td&gt;60 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenExchangeRates — Developer ($12/mo)&lt;/td&gt;
&lt;td&gt;60 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenExchangeRates — Enterprise ($47/mo)&lt;/td&gt;
&lt;td&gt;60 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenExchangeRates — Unlimited ($97/mo)&lt;/td&gt;
&lt;td&gt;10 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Even at $97/month, Open Exchange Rates is a 10-minute cadence. AllRatesToday's free tier is 10x fresher than their top-paid tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Real-time" is a loaded word. Here's the reality.
&lt;/h2&gt;

&lt;p&gt;No public API is truly tick-by-tick real-time — that data lives on paid Bloomberg/Refinitiv terminals. The practical question is: &lt;strong&gt;how stale can the number be when I display it?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;60 seconds&lt;/strong&gt; — fast enough that a displayed rate and the true market rate disagree by at most a few basis points for major pairs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;10 minutes&lt;/strong&gt; — enough for markets to move 10-30 bps on a normal day, 50+ bps during announcements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;60 minutes&lt;/strong&gt; — markets can move 50-100 bps on a calm day, 200+ bps during Fed/ECB announcements or macro surprises.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Concrete cost: a mid-size e-commerce checkout
&lt;/h2&gt;

&lt;p&gt;Imagine an online store processing 1,000 cross-border orders per day with an average ticket of $100. The store displays prices in the customer's local currency and settles in USD.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scenario A&lt;/strong&gt; (60-second rates): the displayed price and the true market rate disagree by an average of ~2 bps across the day. Expected daily slippage cost: ~$20 (0.02% × $100,000).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scenario B&lt;/strong&gt; (hourly rates): the displayed price and the true market rate disagree by an average of ~15-25 bps across the day, depending on volatility. Expected daily slippage cost: ~$150-250.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On a calm day, hourly rates cost the business $130-230 more than 60-second rates. On a volatile day, the gap widens.&lt;/p&gt;

&lt;p&gt;Over a year on a $36M GMV operation, that's tens of thousands of dollars in cumulative rate drift — a multiple of what any real-time rate API costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where hourly data is actually fine
&lt;/h2&gt;

&lt;p&gt;Not every use case cares. Hourly updates are sufficient for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read-only dashboards&lt;/strong&gt; (analytics, reporting) where decisions aren't made in-flight.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accounting rollups&lt;/strong&gt; that only care about end-of-day or end-of-month snapshots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Historical charting&lt;/strong&gt; where intraday precision isn't the point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Informational widgets&lt;/strong&gt; (country pages, blog posts) where "roughly correct" is good enough.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your app fits these profiles, Open Exchange Rates' hourly cadence is not a problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where hourly data hurts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Payments and checkout.&lt;/strong&gt; The rate that determines how much the customer pays.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quotes and invoicing.&lt;/strong&gt; A USD invoice converted at 09:00 can be 0.5% off by 09:55 on a volatile morning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treasury and cash management.&lt;/strong&gt; Intra-day FX moves directly hit the balance sheet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trading and backtesting.&lt;/strong&gt; Anywhere the rate is part of a P&amp;amp;L calculation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remittance marketplaces.&lt;/strong&gt; Users comparing rates across providers; stale data = lost trust.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How AllRatesToday delivers 60-second rates
&lt;/h2&gt;

&lt;p&gt;Rates are pulled from &lt;strong&gt;Reuters (Refinitiv) and interbank market feeds&lt;/strong&gt; every 60 seconds and cached at the edge. The API response reflects the most recent snapshot, and every response includes a &lt;code&gt;time&lt;/code&gt; field so you can confirm freshness:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EUR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9234&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-21T14:03:22Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;time&lt;/code&gt; is more than 60 seconds behind "now," something's wrong. With Open Exchange Rates' hourly cadence, the &lt;code&gt;timestamp&lt;/code&gt; field is &lt;em&gt;supposed&lt;/em&gt; to be up to 59 minutes old — so you can't use it as a freshness check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rate limits aren't the bottleneck. Data is.
&lt;/h2&gt;

&lt;p&gt;A common misconception: "Open Exchange Rates gives 1,000 free requests, AllRatesToday gives 300. So Open Exchange Rates is more generous."&lt;/p&gt;

&lt;p&gt;Request quota isn't the constraint for most apps — &lt;strong&gt;freshness is&lt;/strong&gt;. Once you've fetched rates, you'll cache them for their validity window anyway. The question is how often the source updates, not how often you're allowed to poll.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With AllRatesToday, you can poll every 60 seconds and always get fresh data.&lt;/li&gt;
&lt;li&gt;With Open Exchange Rates free, polling more than once per hour returns the same stale number. The extra 900 requests buy you nothing but duplicated responses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words: a 300-request quota on a 60-second feed gives you &lt;strong&gt;more fresh data points per day&lt;/strong&gt; than a 1,000-request quota on a 60-minute feed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migration: one URL swap
&lt;/h2&gt;

&lt;p&gt;If you're on Open Exchange Rates' free tier and hourly data isn't cutting it, the migration is short. The JSON response shape is nearly identical — swap the URL and the auth header.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- https://openexchangerates.org/api/latest.json?app_id=XXX
&lt;/span&gt;&lt;span class="gi"&gt;+ https://allratestoday.com/api/v1/rates?source=USD
&lt;/span&gt;  (Authorization: Bearer YOUR_API_KEY)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A &lt;a href="https://dev.to/blog/migrate-from-openexchangerates-to-allratestoday/"&gt;full migration guide&lt;/a&gt; walks through every endpoint.&lt;/p&gt;




&lt;p&gt;Stop serving hour-old rates. &lt;a href="https://allratestoday.com/register" rel="noopener noreferrer"&gt;Get your free AllRatesToday API key&lt;/a&gt; — 60-second updates from Reuters and interbank feeds, every plan including free.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>No Official SDKs on Open Exchange Rates: AllRatesToday's JavaScript, Python, and PHP Libraries</title>
      <dc:creator>Madhushan </dc:creator>
      <pubDate>Tue, 21 Apr 2026 19:41:20 +0000</pubDate>
      <link>https://dev.to/chathuranga_basnayaka_d50/no-official-sdks-on-open-exchange-rates-allratestodays-javascript-python-and-php-libraries-n5n</link>
      <guid>https://dev.to/chathuranga_basnayaka_d50/no-official-sdks-on-open-exchange-rates-allratestodays-javascript-python-and-php-libraries-n5n</guid>
      <description>&lt;h1&gt;
  
  
  No Official SDKs on Open Exchange Rates: AllRatesToday's JavaScript, Python, and PHP Libraries
&lt;/h1&gt;

&lt;p&gt;Open Exchange Rates' own docs spell it out: &lt;strong&gt;"We don't actively support or maintain any of these community libraries (except where stated)."&lt;/strong&gt; The recommended integration path is direct HTTP — "access latest.json via AJAX, CURL, Scrapy, node-httpagent, or your method of choice."&lt;/p&gt;

&lt;p&gt;For a simple read-only endpoint, that's workable. But when you hit production concerns — retries, typed responses, caching, error normalization, rate-limit handling — you're reimplementing the same client wrapper every team has already written ten times over.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AllRatesToday&lt;/strong&gt; ships first-party SDKs for JavaScript/TypeScript, Python, and PHP, plus MCP server and DeepSeek integration for AI coding tools. This article walks through why that matters and what the DX difference looks like in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "no official SDK" means
&lt;/h2&gt;

&lt;p&gt;Open Exchange Rates' &lt;a href="https://docs.openexchangerates.org/reference/api-libraries-extensions" rel="noopener noreferrer"&gt;API Libraries &amp;amp; Extensions&lt;/a&gt; page lists community libraries for Ruby, Python, PHP, Node.js, .NET, Java, and others. Some are well-maintained; others were last updated in 2017. All are third-party.&lt;/p&gt;

&lt;p&gt;What you give up without an official SDK:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Type definitions.&lt;/strong&gt; Auto-complete for endpoint names, parameters, and response shapes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version-stable contract.&lt;/strong&gt; Community libs sometimes drift from the official API spec.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistent error handling.&lt;/strong&gt; Each lib defines its own error classes and conventions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unified retry/backoff.&lt;/strong&gt; Each lib (re)implements retries from scratch, often badly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support.&lt;/strong&gt; Open Exchange Rates can't help if the bug is in a third-party library.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AllRatesToday's official SDKs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  JavaScript / TypeScript
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @allratestoday/sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;AllRatesToday&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@allratestoday/sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AllRatesToday&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ALLRATES_API_KEY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Single rate (typed response)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Convert with typed result&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Historical — returns a typed time series&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getHistoricalRates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;30d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full TypeScript types. Throws a typed &lt;code&gt;AllRatesTodayError&lt;/code&gt; on 4xx/5xx. Handles retry/backoff by default.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;allratestoday
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;allratestoday&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AllRatesToday&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AllRatesToday&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_rate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;USD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EUR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;USD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EUR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_historical_rates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;USD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EUR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;30d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ships with type hints, async variant (&lt;code&gt;AsyncAllRatesToday&lt;/code&gt;), and context-manager support.&lt;/p&gt;

&lt;h3&gt;
  
  
  PHP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require allratestoday/sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;AllRatesToday\AllRatesToday&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AllRatesToday&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'YOUR_KEY'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getRate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'USD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'EUR'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'USD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'EUR'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PSR-18 compatible HTTP client, PSR-3 logger support.&lt;/p&gt;

&lt;h2&gt;
  
  
  The same task in raw HTTP (what you'd write against Open Exchange Rates)
&lt;/h2&gt;

&lt;p&gt;Here's a realistic production client you'd need to write against Open Exchange Rates to get the same features the AllRatesToday SDK gives you for free:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getRate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`https://openexchangerates.org/api/latest.json?app_id=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;APP_ID&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;base=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;symbols=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// rate limited — backoff&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;getRate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Rate limited after retries&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`HTTP &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// re-throw normalized&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;About 20 lines of hand-rolled glue per team. The AllRatesToday SDK gives you all of this behind a three-word method call.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: the &lt;code&gt;base=${from}&lt;/code&gt; parameter in the URL above won't work on the Open Exchange Rates free plan — base is USD-only. You'd need either the Developer tier or to switch to cross-rate math. &lt;a href="https://dev.to/blog/openexchangerates-usd-base-currency-problem/"&gt;We cover that pain point separately&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP and DeepSeek: AI-coding-tool integrations
&lt;/h2&gt;

&lt;p&gt;AllRatesToday also ships integrations Open Exchange Rates doesn't offer at all:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP server&lt;/strong&gt; (&lt;code&gt;@allratestoday/mcp-server&lt;/code&gt;) — plugs into Claude Code, Cursor, Claude Desktop, ChatGPT Desktop. Your AI assistant can call &lt;code&gt;get_exchange_rate&lt;/code&gt;, &lt;code&gt;get_historical_rates&lt;/code&gt;, &lt;code&gt;list_currencies&lt;/code&gt;, and &lt;code&gt;get_rates_authenticated&lt;/code&gt; directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek package&lt;/strong&gt; (&lt;code&gt;allratestoday-deepseek&lt;/code&gt;) — Python function-calling library for DeepSeek's Chat Completions API.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither of these makes sense without a well-defined SDK layer, and that's the practical payoff of shipping an official client: you can build higher-level integrations on top of it without every downstream user rebuilding the wrapper.&lt;/p&gt;

&lt;h2&gt;
  
  
  When community libraries are fine
&lt;/h2&gt;

&lt;p&gt;If you're on a language AllRatesToday doesn't yet officially support (Ruby, Go, Rust, .NET, Java), the community libraries for Open Exchange Rates and AllRatesToday are both usable — just audit the maintenance status before shipping.&lt;/p&gt;

&lt;h2&gt;
  
  
  When you want an official SDK
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Production apps where error handling and retry policy need to be consistent and tested.&lt;/li&gt;
&lt;li&gt;TypeScript or typed Python codebases where response types avoid class of bugs.&lt;/li&gt;
&lt;li&gt;Teams that want vendor support when something breaks.&lt;/li&gt;
&lt;li&gt;Anyone building on top of the SDK (wrappers, higher-level libraries, custom agents).&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Skip the hand-rolled HTTP client. &lt;a href="https://allratestoday.com/register" rel="noopener noreferrer"&gt;Get your free AllRatesToday API key&lt;/a&gt; — install the SDK, start calling &lt;code&gt;client.getRate()&lt;/code&gt;, done.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Open Exchange Rates Free Plan vs AllRatesToday Free Tier: What You Actually Get</title>
      <dc:creator>Madhushan </dc:creator>
      <pubDate>Tue, 21 Apr 2026 19:40:51 +0000</pubDate>
      <link>https://dev.to/chathuranga_basnayaka_d50/open-exchange-rates-free-plan-vs-allratestoday-free-tier-what-you-actually-get-22cc</link>
      <guid>https://dev.to/chathuranga_basnayaka_d50/open-exchange-rates-free-plan-vs-allratestoday-free-tier-what-you-actually-get-22cc</guid>
      <description>&lt;h1&gt;
  
  
  Open Exchange Rates Free Plan vs AllRatesToday Free Tier: What You Actually Get
&lt;/h1&gt;

&lt;p&gt;"Free" does a lot of work in API pricing pages. Two providers can both claim a free tier and deliver wildly different value. Open Exchange Rates' headline number — &lt;strong&gt;1,000 requests/month&lt;/strong&gt; — looks more generous than AllRatesToday's &lt;strong&gt;300 requests/month&lt;/strong&gt; until you put the feature matrices side by side.&lt;/p&gt;

&lt;p&gt;This article walks through what each free tier actually gives you, and explains why more requests per month isn't the right metric for most apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-side feature matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;AllRatesToday Free&lt;/th&gt;
&lt;th&gt;OpenExchangeRates Free&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Monthly requests&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update frequency&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;60 seconds&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;60 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Base currency&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Any&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;USD only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple targets per call&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historical data&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes (one request per range)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes (one request per day)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversion endpoint&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Paid plans only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time-series endpoint&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes but burns quota&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CORS&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Official SDKs&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;JS, Python, PHP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP / DeepSeek integrations&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credit card required&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Request quota: the number everyone looks at
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1,000 vs 300 monthly requests.&lt;/strong&gt; Numerically, Open Exchange Rates wins here.&lt;/p&gt;

&lt;p&gt;But — critically — request &lt;em&gt;count&lt;/em&gt; is not the same as &lt;em&gt;data coverage&lt;/em&gt;. If you query Open Exchange Rates 1,000 times per month on the free tier, you're getting the same hourly snapshots over and over. Rates only change once per hour on their free plan.&lt;/p&gt;

&lt;p&gt;With AllRatesToday's 60-second cadence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can poll once per minute and always get fresh data (1,440 new snapshots per day available, you fetch what you need).&lt;/li&gt;
&lt;li&gt;A typical single-page app that fetches one rate on page load serves 300 unique users per month on the free plan — and each of them sees a rate that's at most 60 seconds old.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Open Exchange Rates' 60-minute cadence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The data only updates 24 times per day.&lt;/li&gt;
&lt;li&gt;You can fire 1,000 requests per month, but anything above 24 × 30 = 720 requests fetches duplicate data.&lt;/li&gt;
&lt;li&gt;For serving page loads, the cap-per-month number dominates; for serving fresh data, the cadence does.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Update frequency: 60x difference
&lt;/h2&gt;

&lt;p&gt;This is the biggest real gap between the two free tiers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AllRatesToday Free:&lt;/strong&gt; 60-second updates from Reuters/Refinitiv and interbank feeds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenExchangeRates Free:&lt;/strong&gt; 60-minute updates, sourced from a blended feed (providers not publicly disclosed).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For anything involving money — checkout, invoicing, treasury, payments — 60-second beats 60-minute every time. We &lt;a href="https://dev.to/blog/openexchangerates-hourly-updates-vs-realtime/"&gt;break down the cost of hourly staleness in a separate article&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Base currency: USD-only is a wall
&lt;/h2&gt;

&lt;p&gt;Open Exchange Rates' free plan &lt;strong&gt;only supports USD&lt;/strong&gt; as a base. Want EUR-based rates? Upgrade to Developer ($12/mo). Want INR? Same. Want GBP? Same.&lt;/p&gt;

&lt;p&gt;AllRatesToday's free tier accepts any supported currency as the source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/v1/rates?source=EUR&amp;amp;target=USD,GBP,CHF
GET /api/v1/rates?source=INR&amp;amp;target=USD,EUR,AED
GET /api/v1/rates?source=AUD&amp;amp;target=NZD,USD,EUR
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your product's home currency isn't USD, this single difference can decide which API you pick.&lt;/p&gt;

&lt;h2&gt;
  
  
  Historical data: quota-friendly vs quota-burning
&lt;/h2&gt;

&lt;p&gt;Both providers include historical data on the free tier — but they count it differently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenExchangeRates:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;historical/{date}.json&lt;/code&gt; — one request per specific date.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;time-series.json&lt;/code&gt; — &lt;strong&gt;one request per day returned&lt;/strong&gt;. A 30-day range uses 30 requests. A one-year backfill uses 365 requests (36.5% of your monthly quota in a single call).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AllRatesToday:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;historical-rates?from=X&amp;amp;to=Y&lt;/code&gt; — &lt;strong&gt;one request per range&lt;/strong&gt;, regardless of how many days. A one-year backfill is one request, not 365.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're doing any kind of analytics, charting, or backtesting, this is a significant free-tier advantage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conversion endpoint: free vs paid
&lt;/h2&gt;

&lt;p&gt;Open Exchange Rates has a dedicated &lt;code&gt;/api/convert.json&lt;/code&gt; endpoint for "convert 1,000 USD to EUR" — but it's &lt;strong&gt;paid plans only&lt;/strong&gt;. On the free tier, you fetch rates and do the multiplication client-side.&lt;/p&gt;

&lt;p&gt;AllRatesToday ships conversion on every plan. With the SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// { from: 'USD', to: 'EUR', amount: 1000, rate: 0.9234, result: 923.4 }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For typical shopping-cart and invoicing flows, this alone saves a fair amount of glue code.&lt;/p&gt;

&lt;h2&gt;
  
  
  SDKs and AI integrations
&lt;/h2&gt;

&lt;p&gt;Open Exchange Rates' free tier gives you raw HTTP access. AllRatesToday's free tier includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Official JavaScript/TypeScript SDK.&lt;/li&gt;
&lt;li&gt;Official Python SDK.&lt;/li&gt;
&lt;li&gt;Official PHP SDK.&lt;/li&gt;
&lt;li&gt;MCP server for Claude Code, Cursor, Claude Desktop, ChatGPT Desktop.&lt;/li&gt;
&lt;li&gt;DeepSeek function-calling package.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these incur extra cost — they're tools for working with the free tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to pick each free tier
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pick OpenExchangeRates Free when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need 500+ rate lookups per month &lt;em&gt;and&lt;/em&gt; hourly data is fine &lt;em&gt;and&lt;/em&gt; USD-only base works &lt;em&gt;and&lt;/em&gt; you don't need the conversion endpoint.&lt;/li&gt;
&lt;li&gt;You already have a working integration and switching isn't worth the effort.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pick AllRatesToday Free when:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need real-time (60-second) rates — the top reason.&lt;/li&gt;
&lt;li&gt;Your product isn't USD-centric (EUR, GBP, INR, AUD, SGD, BRL, etc.).&lt;/li&gt;
&lt;li&gt;You want historical data without burning quota.&lt;/li&gt;
&lt;li&gt;You want the conversion endpoint.&lt;/li&gt;
&lt;li&gt;You want an official SDK.&lt;/li&gt;
&lt;li&gt;You want MCP or DeepSeek support for AI tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The bigger picture
&lt;/h2&gt;

&lt;p&gt;Free tiers are marketing. The numbers on the pricing page are chosen to make the provider look good on a comparison chart. Look at what each free tier &lt;em&gt;enables&lt;/em&gt; — fresh data, flexible queries, real endpoints — and the gap narrows or reverses.&lt;/p&gt;

&lt;p&gt;For most non-US products, AllRatesToday's free tier is the more useful one even though the request cap is lower. For USD-only products on hourly data, Open Exchange Rates works.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://allratestoday.com/register" rel="noopener noreferrer"&gt;Get your free AllRatesToday API key&lt;/a&gt; — 60-second rates, any base currency, free historical, conversion endpoint, official SDKs. No credit card.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Open Exchange Rates Time-Series Burns Your Quota: AllRatesToday's Historical Rates Explained</title>
      <dc:creator>Madhushan </dc:creator>
      <pubDate>Tue, 21 Apr 2026 19:40:17 +0000</pubDate>
      <link>https://dev.to/chathuranga_basnayaka_d50/open-exchange-rates-time-series-burns-your-quota-allratestodays-historical-rates-explained-2ij7</link>
      <guid>https://dev.to/chathuranga_basnayaka_d50/open-exchange-rates-time-series-burns-your-quota-allratestodays-historical-rates-explained-2ij7</guid>
      <description>&lt;h1&gt;
  
  
  Open Exchange Rates Time-Series Burns Your Quota
&lt;/h1&gt;

&lt;p&gt;If you've shipped anything against Open Exchange Rates that touches history, you've probably hit this the hard way. Their documentation is explicit: &lt;strong&gt;"Requests to the time-series.json API endpoint count as one request for each day of data returned."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meaning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;7 days of data = 7 requests&lt;/li&gt;
&lt;li&gt;30 days = 30 requests (3% of your free 1,000/month cap)&lt;/li&gt;
&lt;li&gt;90 days = 90 requests (9%)&lt;/li&gt;
&lt;li&gt;365 days = 365 requests (36.5% of your free monthly quota in a single call)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a charting use case that backfills a year of daily rates across 5 currency pairs, you're at 5 × 365 = 1,825 requests — past the free tier in a single page load.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AllRatesToday&lt;/strong&gt; prices historical differently: &lt;strong&gt;one request per range, not per day&lt;/strong&gt;. This article explains the difference, what it costs in practice, and how to design around either.&lt;/p&gt;

&lt;h2&gt;
  
  
  The quota model
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OpenExchangeRates &lt;code&gt;time-series.json&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/time-series.json?app_id=XXX&amp;amp;start=2025-01-01&amp;amp;end=2025-12-31&amp;amp;base=USD&amp;amp;symbols=EUR
# costs: 365 requests against your monthly quota
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The endpoint returns all 365 daily rates in one HTTP call — but internally it's billed as if you'd made 365 individual historical requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  AllRatesToday &lt;code&gt;historical-rates&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /api/historical-rates?source=USD&amp;amp;target=EUR&amp;amp;from=2025-01-01&amp;amp;to=2025-12-31
# costs: 1 request against your monthly quota
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One HTTP call, one quota decrement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concrete scenarios
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Scenario 1: Dashboard with 5 pairs × 90-day history&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenExchangeRates: 5 × 90 = 450 requests per dashboard load. Past the free 1,000/mo cap after two loads.&lt;/li&gt;
&lt;li&gt;AllRatesToday: 5 × 1 = 5 requests per load. ~60 loads possible on the free 300/mo cap.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scenario 2: Tax-year backfill (1 year, 1 pair)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenExchangeRates: 365 requests. One-shot operation consumes 36.5% of the monthly quota.&lt;/li&gt;
&lt;li&gt;AllRatesToday: 1 request. 0.33% of the monthly quota.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scenario 3: Multi-pair backtest (10 pairs × 3 years)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenExchangeRates: 10 × 1,095 = 10,950 requests. Well past any plan below Enterprise.&lt;/li&gt;
&lt;li&gt;AllRatesToday: 10 requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The OpenExchangeRates model effectively turns historical analysis into a line-item purchase: every day of data you want, you pay for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the pricing model exists
&lt;/h2&gt;

&lt;p&gt;Historical data is bandwidth-heavy. An "all currencies for one day" response can be 5-10 KB. Open Exchange Rates' per-day billing reflects internal cost: each day is a separate backend lookup. It's defensible from an infra economics perspective.&lt;/p&gt;

&lt;p&gt;It's still a bad developer experience. When your request count doesn't match your HTTP call count, capacity planning gets confusing fast. You have to explain to new team members why one line of code burned 365 requests.&lt;/p&gt;

&lt;p&gt;AllRatesToday's approach is to price the &lt;strong&gt;API surface area&lt;/strong&gt;, not the &lt;strong&gt;underlying row count&lt;/strong&gt;. One call, one request, regardless of the date range. Simpler to reason about, easier to stay under quota.&lt;/p&gt;

&lt;h2&gt;
  
  
  When per-day billing is fine
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You only pull history for specific dates (accounting, invoice reconciliation). Open Exchange Rates' &lt;code&gt;historical/{date}.json&lt;/code&gt; is one request per date — the same price as AllRatesToday for single-date queries.&lt;/li&gt;
&lt;li&gt;You rarely look at ranges — your app mostly uses current rates.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When range-based pricing matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Charting: every dashboard render pulls a range.&lt;/li&gt;
&lt;li&gt;Analytics: rolling 30/90/365-day windows.&lt;/li&gt;
&lt;li&gt;Backtesting: long ranges across many pairs.&lt;/li&gt;
&lt;li&gt;Reporting: monthly/quarterly/yearly recaps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Any of these become 10-50x cheaper in quota terms on AllRatesToday.&lt;/p&gt;

&lt;h2&gt;
  
  
  AllRatesToday historical endpoint, in detail
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET &lt;span class="s2"&gt;"https://allratestoday.com/api/historical-rates?source=USD&amp;amp;target=EUR&amp;amp;from=2025-01-01&amp;amp;to=2025-12-31"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EUR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-12-31"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9521&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-02"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9534&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-12-31"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9214&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Supported periods include shortcuts (&lt;code&gt;period=30d&lt;/code&gt;, &lt;code&gt;period=1y&lt;/code&gt;) and custom date ranges. Every range is one request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrating a time-series query
&lt;/h2&gt;

&lt;p&gt;Most apps using Open Exchange Rates' &lt;code&gt;time-series.json&lt;/code&gt; pass &lt;code&gt;start&lt;/code&gt;, &lt;code&gt;end&lt;/code&gt;, and a &lt;code&gt;base&lt;/code&gt;/&lt;code&gt;symbols&lt;/code&gt; combination. The equivalent AllRatesToday call is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;- https://openexchangerates.org/api/time-series.json?start=2025-01-01&amp;amp;end=2025-12-31&amp;amp;base=USD&amp;amp;symbols=EUR&amp;amp;app_id=XXX
&lt;/span&gt;&lt;span class="gi"&gt;+ https://allratestoday.com/api/historical-rates?source=USD&amp;amp;target=EUR&amp;amp;from=2025-01-01&amp;amp;to=2025-12-31
&lt;/span&gt;  (Authorization: Bearer YOUR_API_KEY)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response shape is different (array of &lt;code&gt;{time, rate}&lt;/code&gt; vs keyed object), but the transformation is straightforward.&lt;/p&gt;

&lt;h2&gt;
  
  
  What if you still need per-day granularity?
&lt;/h2&gt;

&lt;p&gt;Both APIs support single-date historical lookups at one-request-per-date:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenExchangeRates: &lt;code&gt;GET /api/historical/2025-06-15.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;AllRatesToday: &lt;code&gt;GET /api/historical-rates?source=USD&amp;amp;target=EUR&amp;amp;from=2025-06-15&amp;amp;to=2025-06-15&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your app cares about a handful of specific dates rather than ranges, either API is fine.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://allratestoday.com/register" rel="noopener noreferrer"&gt;Get your free AllRatesToday API key&lt;/a&gt; — free historical data, one request per range, 60-second real-time updates. No credit card.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Migrating from Open Exchange Rates to AllRatesToday: A Developer's Guide</title>
      <dc:creator>Madhushan </dc:creator>
      <pubDate>Tue, 21 Apr 2026 19:39:30 +0000</pubDate>
      <link>https://dev.to/chathuranga_basnayaka_d50/migrating-from-open-exchange-rates-to-allratestoday-a-developers-guide-38o1</link>
      <guid>https://dev.to/chathuranga_basnayaka_d50/migrating-from-open-exchange-rates-to-allratestoday-a-developers-guide-38o1</guid>
      <description>&lt;h1&gt;
  
  
  Migrating from Open Exchange Rates to AllRatesToday: A Developer's Guide
&lt;/h1&gt;

&lt;p&gt;If you've decided to move off Open Exchange Rates — for real-time rates, any-base-currency flexibility, official SDKs, or free historical data — the migration itself is usually a one-afternoon job. The JSON shapes are similar enough that most of the work is mechanical.&lt;/p&gt;

&lt;p&gt;This guide walks you through every endpoint, shows the URL and response-shape differences, and ends with the SDK drop-in for each supported language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before you start
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Get your AllRatesToday API key&lt;/strong&gt; at &lt;a href="https://allratestoday.com/register" rel="noopener noreferrer"&gt;allratestoday.com/register&lt;/a&gt;. Free tier, no credit card.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep both keys active&lt;/strong&gt; during migration so you can run a side-by-side comparison.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write a wrapper in one place.&lt;/strong&gt; If your codebase has inline &lt;code&gt;fetch&lt;/code&gt; calls to &lt;code&gt;openexchangerates.org&lt;/code&gt;, consolidate them before migrating. Then you'll only touch one file.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Endpoint-by-endpoint mapping
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Latest rates
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Open Exchange Rates:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://openexchangerates.org/api/latest.json?app_id=YOUR_APP_ID
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"disclaimer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"license"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1713702122&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"base"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"EUR"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9234&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"GBP"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.7891&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AllRatesToday:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://allratestoday.com/api/v1/rates?source=USD
Authorization: Bearer YOUR_API_KEY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"EUR"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9234&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"GBP"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.7891&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-21T14:03:22Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Differences:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;base&lt;/code&gt; → &lt;code&gt;source&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;timestamp&lt;/code&gt; (Unix epoch) → &lt;code&gt;time&lt;/code&gt; (ISO 8601)&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;disclaimer&lt;/code&gt;/&lt;code&gt;license&lt;/code&gt; fields (they don't exist in AllRatesToday responses).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Specific currency pair
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Open Exchange Rates&lt;/strong&gt; (free tier is USD-only):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://openexchangerates.org/api/latest.json?symbols=EUR&amp;amp;app_id=YOUR_APP_ID
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response gives &lt;code&gt;{base: "USD", rates: {EUR: 0.9234}}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AllRatesToday:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://allratestoday.com/api/v1/rates?source=USD&amp;amp;target=EUR
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EUR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9234&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-04-21T14:03:22Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: &lt;strong&gt;AllRatesToday returns a scalar &lt;code&gt;rate&lt;/code&gt; when a single &lt;code&gt;target&lt;/code&gt; is specified&lt;/strong&gt;, and a &lt;code&gt;rates&lt;/code&gt; object when multiple are specified. Open Exchange Rates always returns a &lt;code&gt;rates&lt;/code&gt; object.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Non-USD base currency
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Open Exchange Rates (paid plans only):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://openexchangerates.org/api/latest.json?base=EUR&amp;amp;app_id=YOUR_APP_ID
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the free tier, this fails with &lt;code&gt;403&lt;/code&gt; and message &lt;code&gt;"Changing the API&lt;/code&gt;base&lt;code&gt;currency is available for Developer, Enterprise and Unlimited plan clients."&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AllRatesToday (all plans, including free):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://allratestoday.com/api/v1/rates?source=EUR
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just works. If you're currently doing cross-rate math client-side because of the USD-only restriction, you can delete all of that code.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Historical rate for a specific date
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Open Exchange Rates:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://openexchangerates.org/api/historical/2025-06-15.json?app_id=YOUR_APP_ID
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AllRatesToday:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://allratestoday.com/api/historical-rates?source=USD&amp;amp;target=EUR&amp;amp;from=2025-06-15&amp;amp;to=2025-06-15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response returns an array with one entry.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Time-series / range historical
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Open Exchange Rates&lt;/strong&gt; (counts 1 request per day):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://openexchangerates.org/api/time-series.json?start=2025-01-01&amp;amp;end=2025-12-31&amp;amp;base=USD&amp;amp;symbols=EUR&amp;amp;app_id=YOUR_APP_ID
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"base"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"2025-01-01"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"EUR"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9521&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"2025-01-02"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"EUR"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9534&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AllRatesToday&lt;/strong&gt; (1 request per range):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://allratestoday.com/api/historical-rates?source=USD&amp;amp;target=EUR&amp;amp;from=2025-01-01&amp;amp;to=2025-12-31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EUR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-12-31"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rates"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9521&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-02"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9534&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Transformation&lt;/strong&gt; (OXR → ART shape):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;oxrRates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;oxrResponse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;artRates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;oxrRates&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(([&lt;/span&gt;&lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pair&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Currency conversion
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Open Exchange Rates&lt;/strong&gt; (paid plans only):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://openexchangerates.org/api/convert/1000/USD/EUR?app_id=YOUR_APP_ID
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the free tier, this returns &lt;code&gt;403&lt;/code&gt; with &lt;code&gt;"The requested feature is not available on your current plan."&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AllRatesToday&lt;/strong&gt; (all plans, including free), via SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// { from: 'USD', to: 'EUR', amount: 1000, rate: 0.9234, result: 923.4 }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or raw HTTP (fetch the rate and multiply client-side — same pattern you likely already have for OXR free tier):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/v1/rates?source=USD&amp;amp;target=EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. List of supported currencies
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Open Exchange Rates:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://openexchangerates.org/api/currencies.json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns &lt;code&gt;{ "AED": "UAE Dirham", "AFN": "Afghan Afghani", ... }&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AllRatesToday:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://allratestoday.com/api/v1/symbols
Authorization: Bearer YOUR_API_KEY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns the same shape.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authentication difference
&lt;/h2&gt;

&lt;p&gt;Open Exchange Rates uses a query-string &lt;code&gt;app_id&lt;/code&gt; parameter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;?app_id=YOUR_APP_ID
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AllRatesToday uses a standard &lt;code&gt;Authorization: Bearer&lt;/code&gt; header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authorization: Bearer YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your current code has URL builders that interpolate &lt;code&gt;app_id&lt;/code&gt;, swap to an HTTP client that sets the auth header once globally. The SDKs do this for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  SDK drop-in replacements
&lt;/h2&gt;

&lt;p&gt;Instead of replacing URLs by hand, replace your OXR client with AllRatesToday's SDK.&lt;/p&gt;

&lt;h3&gt;
  
  
  JavaScript / TypeScript
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @allratestoday/sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;AllRatesToday&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@allratestoday/sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AllRatesToday&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ALLRATES_API_KEY&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getHistoricalRates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;30d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;allratestoday
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;allratestoday&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AllRatesToday&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AllRatesToday&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_rate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;USD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EUR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_historical_rates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;USD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EUR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;30d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  PHP
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require allratestoday/sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;AllRatesToday\AllRatesToday&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AllRatesToday&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'YOUR_API_KEY'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$client&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getRate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'USD'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'EUR'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Side-by-side validation
&lt;/h2&gt;

&lt;p&gt;Keep both providers live for a week and compare results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;oxr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;art&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="nf"&gt;fetchOXR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nf"&gt;fetchART&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;diffBps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;oxr&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;art&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;art&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;diffBps&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;oxr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;art&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;diffBps&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rate mismatch&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For major pairs, you should see the two within ~20 basis points during normal market hours. Larger diffs usually mean one of the sources is stale (OXR hourly cadence) or you're comparing different market timestamps.&lt;/p&gt;

&lt;h2&gt;
  
  
  After migration
&lt;/h2&gt;

&lt;p&gt;Once you're on AllRatesToday:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delete any cross-rate math that existed to work around OXR's USD-only free tier.&lt;/li&gt;
&lt;li&gt;Reduce historical calls to one-per-range (instead of one-per-day) and reclaim quota.&lt;/li&gt;
&lt;li&gt;Swap any &lt;code&gt;/api/convert.json&lt;/code&gt; workarounds for &lt;code&gt;client.convert()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Rollback plan
&lt;/h2&gt;

&lt;p&gt;Keep the OXR client wrapper behind a feature flag for two weeks. If anything goes wrong, flip back with a config change while you debug. Don't delete the OXR code until you've had a full billing cycle on AllRatesToday.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://allratestoday.com/register" rel="noopener noreferrer"&gt;Get your free AllRatesToday API key&lt;/a&gt; and start your migration today. Free tier, no credit card, 60-second rates.&lt;/p&gt;

</description>
      <category>api</category>
      <category>javascript</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Open Exchange Rates Pricing vs AllRatesToday: Which Exchange Rate API Is Cheaper in 2026?</title>
      <dc:creator>Madhushan </dc:creator>
      <pubDate>Tue, 21 Apr 2026 19:38:30 +0000</pubDate>
      <link>https://dev.to/chathuranga_basnayaka_d50/open-exchange-rates-pricing-vs-allratestoday-which-exchange-rate-api-is-cheaper-in-2026-57j2</link>
      <guid>https://dev.to/chathuranga_basnayaka_d50/open-exchange-rates-pricing-vs-allratestoday-which-exchange-rate-api-is-cheaper-in-2026-57j2</guid>
      <description>&lt;h1&gt;
  
  
  Open Exchange Rates Pricing vs AllRatesToday: Which Exchange Rate API Is Cheaper in 2026?
&lt;/h1&gt;

&lt;p&gt;Open Exchange Rates' pricing is straightforward on the surface: &lt;strong&gt;$12/month Developer, $47/month Enterprise, $97/month Unlimited&lt;/strong&gt;, plus a Forever Free plan with 1,000 requests/month. The trick is reading what each tier gates.&lt;/p&gt;

&lt;p&gt;Several features that most apps need — non-USD base currency, the conversion endpoint, 10-minute updates — are only available starting at Developer or Unlimited. By the time you've unlocked the basics, the monthly cost can exceed what you'd pay for a fully-featured tier elsewhere.&lt;/p&gt;

&lt;p&gt;This article compares the two providers' pricing dollar-for-dollar and explains which tier you'd actually land on for common use cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Exchange Rates' plan breakdown
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Requests / month&lt;/th&gt;
&lt;th&gt;Updates&lt;/th&gt;
&lt;th&gt;Base currency&lt;/th&gt;
&lt;th&gt;Conversion endpoint&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;Hourly&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;USD only&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Developer&lt;/td&gt;
&lt;td&gt;$12/mo ($120/yr)&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;Hourly&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;$47/mo ($470/yr)&lt;/td&gt;
&lt;td&gt;100,000&lt;/td&gt;
&lt;td&gt;Hourly&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;$97/mo ($970/yr)&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10 min&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Key things to notice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time-ish data (10-minute updates) only appears on the $97/mo tier.&lt;/li&gt;
&lt;li&gt;Every tier is hourly except Unlimited. There is no "true real-time" tier.&lt;/li&gt;
&lt;li&gt;The conversion endpoint is paid-only — $12/mo minimum.&lt;/li&gt;
&lt;li&gt;Any non-USD base currency requires paid — $12/mo minimum.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Open Exchange Rates' tiers actually cost to unlock basic features
&lt;/h2&gt;

&lt;p&gt;If your product needs any of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Non-USD base currency (EUR, GBP, INR, AUD, etc.)&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;/api/convert.json&lt;/code&gt; endpoint&lt;/li&gt;
&lt;li&gt;Faster than hourly updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...then the effective floor is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$12/month for Developer (non-USD base, conversion endpoint, hourly updates).&lt;/li&gt;
&lt;li&gt;$97/month for Unlimited (10-minute updates).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AllRatesToday's pricing approach
&lt;/h2&gt;

&lt;p&gt;AllRatesToday bundles the features most teams need into every plan — including the free tier:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Free&lt;/th&gt;
&lt;th&gt;Paid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Update frequency&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;60 seconds&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;60 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Base currency&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Any&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historical data&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes (one request per range)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversion endpoint&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS, CORS&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Official SDKs&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP / DeepSeek&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Paid tiers raise request quotas and add higher rate limits — but no core feature is gated behind them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dollar-for-dollar: three real scenarios
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scenario 1: European SaaS pricing display (EUR base, 5,000 lookups/month)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;OpenExchangeRates requires Developer plan ($12/mo).&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free plan fails: USD-only base currency.&lt;/li&gt;
&lt;li&gt;Developer plan: $144/year, 10,000 req/month, hourly updates, any base.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AllRatesToday covers it on the free tier.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free plan: 300 req/month + 60-second rates. But 5,000 lookups/month exceeds the free cap.&lt;/li&gt;
&lt;li&gt;With server-side caching (one hourly fetch serves all pageviews): 720 req/month — still over.&lt;/li&gt;
&lt;li&gt;With 5-minute caching: 8,640 req/month — still over.&lt;/li&gt;
&lt;li&gt;Realistic path: a paid plan sized for 5,000-10,000 req/month. For apples-to-apples, call it comparable to OXR Developer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verdict: similar total cost, but &lt;strong&gt;AllRatesToday ships 60-second updates vs OXR hourly&lt;/strong&gt;. You pay the same and get fresher data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario 2: US e-commerce checkout (USD base, 2,000 lookups/month)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;OpenExchangeRates Free works.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;USD-only base is fine for a US product.&lt;/li&gt;
&lt;li&gt;1,000 req/month limit → either cache aggressively or upgrade to Developer ($12/mo).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AllRatesToday's free tier is tight at 2,000 lookups/month.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same deal: cache aggressively or use a small paid tier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verdict: OXR Free is cheaper here &lt;em&gt;if&lt;/em&gt; you can fit in 1,000 req/month and don't care about hourly vs 60-second. Otherwise costs are similar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario 3: Analytics dashboard with year-to-date historical (1 year × 5 pairs, reloaded 50x/day)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;OpenExchangeRates:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;time-series.json&lt;/code&gt; counts 1 request per day returned.&lt;/li&gt;
&lt;li&gt;365 days × 5 pairs × 50 loads/day × 30 days = &lt;strong&gt;2,737,500 requests/month&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;This is well beyond Unlimited's "unlimited" threshold in practice (expect throttling/pricing conversation).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AllRatesToday:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;historical-rates&lt;/code&gt; counts 1 request per range.&lt;/li&gt;
&lt;li&gt;5 pairs × 50 loads/day × 30 days = &lt;strong&gt;7,500 requests/month&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verdict: 365x less quota consumption for the same user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Per-feature cost rollup
&lt;/h2&gt;

&lt;p&gt;For each feature, here's the minimum monthly cost to unlock it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;OpenExchangeRates&lt;/th&gt;
&lt;th&gt;AllRatesToday&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;60-second rate updates&lt;/td&gt;
&lt;td&gt;Not available at any tier&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10-minute rate updates&lt;/td&gt;
&lt;td&gt;$97/mo&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hourly updates&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-USD base currency&lt;/td&gt;
&lt;td&gt;$12/mo&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversion endpoint&lt;/td&gt;
&lt;td&gt;$12/mo&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historical time-series (365 days)&lt;/td&gt;
&lt;td&gt;$0 at 365 reqs or $12/mo for comfort&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free (1 request)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Official SDK&lt;/td&gt;
&lt;td&gt;Not available&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP server&lt;/td&gt;
&lt;td&gt;Not available&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  When Open Exchange Rates' pricing is competitive
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You're building a USD-only product (US e-commerce, US SaaS, US fintech).&lt;/li&gt;
&lt;li&gt;Hourly data is acceptable.&lt;/li&gt;
&lt;li&gt;You don't need the conversion endpoint.&lt;/li&gt;
&lt;li&gt;You already have an Open Exchange Rates integration and churn isn't worth a few dollars saved.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When AllRatesToday is the clear price winner
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Any product whose home currency isn't USD.&lt;/li&gt;
&lt;li&gt;Anything where fresher-than-hourly data matters.&lt;/li&gt;
&lt;li&gt;Analytics/dashboards that pull historical ranges.&lt;/li&gt;
&lt;li&gt;Teams that use AI coding assistants and want MCP integration.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;a href="https://allratestoday.com/register" rel="noopener noreferrer"&gt;Get your free AllRatesToday API key&lt;/a&gt; — every feature unlocked, 60-second rates, any base currency, and historical data, at $0. No credit card required.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Open Exchange Rates Conversion Endpoint Is Paid-Only: How AllRatesToday Handles Currency Conversion</title>
      <dc:creator>Madhushan </dc:creator>
      <pubDate>Tue, 21 Apr 2026 19:36:48 +0000</pubDate>
      <link>https://dev.to/chathuranga_basnayaka_d50/open-exchange-rates-conversion-endpoint-is-paid-only-how-allratestoday-handles-currency-conversion-4pe5</link>
      <guid>https://dev.to/chathuranga_basnayaka_d50/open-exchange-rates-conversion-endpoint-is-paid-only-how-allratestoday-handles-currency-conversion-4pe5</guid>
      <description>&lt;h1&gt;
  
  
  Open Exchange Rates Conversion Endpoint Is Paid-Only
&lt;/h1&gt;

&lt;p&gt;Open Exchange Rates has a dedicated conversion endpoint — &lt;code&gt;GET /api/convert/{value}/{from}/{to}&lt;/code&gt; — that returns the converted amount in one call. Convenient, except for one thing: &lt;strong&gt;it's paid plans only&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Call it on the free tier and you get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;403&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"not_allowed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The requested feature is not available on your current plan."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AllRatesToday&lt;/strong&gt; ships conversion on every plan, including the free tier — as both an API endpoint and as a one-liner in the official SDKs. This article explains the gap and the three ways to work around it (or avoid it entirely).&lt;/p&gt;

&lt;h2&gt;
  
  
  What the conversion endpoint does
&lt;/h2&gt;

&lt;p&gt;Both providers expose something equivalent to: "convert 1,000 USD to EUR, return the amount."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open Exchange Rates&lt;/strong&gt; (Developer plan and up):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://openexchangerates.org/api/convert/1000/USD/EUR?app_id=YOUR_APP_ID
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"request"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/convert/1000/USD/EUR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EUR"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"meta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1713702122&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.9234&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"response"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;923.4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;AllRatesToday&lt;/strong&gt; (every plan):&lt;/p&gt;

&lt;p&gt;Via SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// { from: 'USD', to: 'EUR', amount: 1000, rate: 0.9234, result: 923.4 }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Via HTTP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://allratestoday.com/api/v1/convert?source=USD&amp;amp;target=EUR&amp;amp;amount=1000
Authorization: Bearer YOUR_API_KEY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why the conversion endpoint matters
&lt;/h2&gt;

&lt;p&gt;You can always fetch the rate and multiply in application code. That's what OXR free-tier users end up doing. So why is a dedicated endpoint useful?&lt;/p&gt;

&lt;p&gt;Three reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One round trip instead of two.&lt;/strong&gt; Some apps fetch rates only when they need to convert a specific amount.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistent rounding.&lt;/strong&gt; Server-side conversion uses a canonical multiplication, avoiding floating-point drift between clients.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean call sites.&lt;/strong&gt; &lt;code&gt;convert(amount, from, to)&lt;/code&gt; reads more clearly than a rate fetch followed by a multiplication.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a checkout flow, an invoicing system, or a remittance quote, this is the natural shape.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to work around the OXR free-tier lock
&lt;/h2&gt;

&lt;p&gt;If you're on Open Exchange Rates' free tier and need conversion, you have three options:&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1: Fetch rate, multiply client-side
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;convertOXR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Note: free tier is USD-base only, so if `from !== 'USD'` you need cross-rate math&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://openexchangerates.org/api/latest.json?app_id=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;APP_ID&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;symbols=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rates&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Downsides: two issues compound here — no conversion &lt;em&gt;and&lt;/em&gt; USD-only base. For non-USD sources, you end up with cross-rate inversions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: Upgrade to Developer plan
&lt;/h3&gt;

&lt;p&gt;$12/month unlocks conversion along with non-USD base and a larger quota. If that's the &lt;em&gt;only&lt;/em&gt; feature you need, it's an expensive upgrade.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 3: Switch to AllRatesToday
&lt;/h3&gt;

&lt;p&gt;Free tier, conversion endpoint included, no upgrade required.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;AllRatesToday&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@allratestoday/sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AllRatesToday&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ALLRATES_API_KEY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Where AllRatesToday's conversion shines
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Multi-currency invoicing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;quote&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GBP&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;INR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// [&lt;/span&gt;
&lt;span class="c1"&gt;//   { from: 'USD', to: 'EUR', amount: 12000, rate: 0.9234, result: 11080.80 },&lt;/span&gt;
&lt;span class="c1"&gt;//   { from: 'USD', to: 'GBP', amount: 12000, rate: 0.7891, result:  9469.20 },&lt;/span&gt;
&lt;span class="c1"&gt;//   { from: 'USD', to: 'INR', amount: 12000, rate: 83.42,  result: 1001040.00 }&lt;/span&gt;
&lt;span class="c1"&gt;// ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cross-border checkout
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;settleCurrency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;displayCurrency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;detectUserCurrency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;displayPrice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;settleCurrency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;displayCurrency&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;productPrice&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// display: show displayPrice in displayCurrency&lt;/span&gt;
&lt;span class="c1"&gt;// settle:  record settleCurrency amount for payment processor&lt;/span&gt;
&lt;span class="c1"&gt;// audit:   log `rate` + timestamp for reconciliation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Remittance quotes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;quoteRemittance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fee&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computeFee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;sendAmount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;sendCurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;receiveAmount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;fee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;receiveCurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;rate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;fee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;quotedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What if I'm on Unlimited anyway?
&lt;/h2&gt;

&lt;p&gt;If you're already paying Open Exchange Rates for Unlimited ($97/mo), you have conversion access. That's fine — the migration calculus is whether the &lt;strong&gt;other&lt;/strong&gt; AllRatesToday wins (60-second updates, free historical ranges, official SDKs, MCP integration) are worth the switch.&lt;/p&gt;

&lt;p&gt;For teams building AI-assisted applications, the MCP server alone is usually the tipping point. Your coding assistant can call &lt;code&gt;convert_currency&lt;/code&gt; as a tool, without you writing any integration glue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conversion rounding: one subtle note
&lt;/h2&gt;

&lt;p&gt;Both providers compute &lt;code&gt;result = amount × rate&lt;/code&gt; server-side. Both are exposed to floating-point representation issues for very large amounts. If you're in a context where exact decimal arithmetic matters (payments, accounting), you should always round to the target currency's minor unit (usually 2 decimal places):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;euros&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The conversion endpoint doesn't exempt you from doing this — it just saves the round trip.&lt;/p&gt;




&lt;p&gt;Stop paying $12/month for a feature that should be free. &lt;a href="https://allratestoday.com/register" rel="noopener noreferrer"&gt;Get your free AllRatesToday API key&lt;/a&gt; — conversion endpoint, any base currency, 60-second rates. No credit card.&lt;/p&gt;

</description>
      <category>openexchangerates</category>
    </item>
    <item>
      <title>Data Sources: Open Exchange Rates' Blended Feed vs AllRatesToday's Reuters + Interbank</title>
      <dc:creator>Madhushan </dc:creator>
      <pubDate>Tue, 21 Apr 2026 19:36:11 +0000</pubDate>
      <link>https://dev.to/chathuranga_basnayaka_d50/data-sources-open-exchange-rates-blended-feed-vs-allratestodays-reuters-interbank-4gib</link>
      <guid>https://dev.to/chathuranga_basnayaka_d50/data-sources-open-exchange-rates-blended-feed-vs-allratestodays-reuters-interbank-4gib</guid>
      <description>&lt;h1&gt;
  
  
  Data Sources: Open Exchange Rates' Blended Feed vs AllRatesToday's Reuters + Interbank
&lt;/h1&gt;

&lt;p&gt;When your product touches money, "where does the rate come from?" is a question your risk, compliance, or audit team will eventually ask. If the answer is vague, the conversation gets expensive.&lt;/p&gt;

&lt;p&gt;Open Exchange Rates describes its data as: &lt;em&gt;"collected from several reliable sources and blended together algorithmically... other sources are not currently disclosed, but providers are monitored closely and routinely checked."&lt;/em&gt; That's a reasonable description for a consumer-facing product. For a regulated environment, it leaves gaps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AllRatesToday&lt;/strong&gt; publishes its sources explicitly: &lt;strong&gt;Reuters (Refinitiv) and interbank market feeds&lt;/strong&gt;. This article explains why that transparency matters, what the practical accuracy difference looks like, and when it actually affects your decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two approaches
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Open Exchange Rates: blended, undisclosed
&lt;/h3&gt;

&lt;p&gt;From their FAQ and documentation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data is aggregated from multiple sources.&lt;/li&gt;
&lt;li&gt;The specific providers are not disclosed publicly.&lt;/li&gt;
&lt;li&gt;Providers are monitored internally.&lt;/li&gt;
&lt;li&gt;Rates aim to be "consistent and unbiased, providing the most representative market rate possible — generally the midpoint between the most common buy/sell prices."&lt;/li&gt;
&lt;li&gt;They note rates "are accurate enough for 99% of cases (shopping carts, personal finance, estimates, etc.)."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most web apps, this is fine. For a regulated fintech or a public company's accounting close, the audit trail stops at "a blend."&lt;/p&gt;

&lt;h3&gt;
  
  
  AllRatesToday: named, publicly disclosed
&lt;/h3&gt;

&lt;p&gt;Sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reuters (Refinitiv)&lt;/strong&gt; — the institutional FX data feed used by banks, asset managers, and trading desks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interbank market feeds&lt;/strong&gt; — the rates at which banks transact with each other.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same mid-market rate philosophy: no bank markup, no retail spread, just the midpoint between buy and sell in the institutional market.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why sourcing transparency matters
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Compliance and audit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SOX (US public companies):&lt;/strong&gt; auditors ask how revenue denominated in foreign currencies was translated. "Blended from undisclosed sources" is a weak answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IFRS / GAAP reporting:&lt;/strong&gt; exchange rate disclosures in financial statements often require naming the source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SOC 2 / ISO 27001:&lt;/strong&gt; service organization controls ask about data provenance for inputs to pricing and billing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FX-regulated industries (remittance, payments, broker-dealer):&lt;/strong&gt; regulators care whether your rate source is reproducible and independently verifiable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reuters/Refinitiv and interbank are named, industry-standard feeds. Easy to describe in an audit memo, easy to reproduce if someone asks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Accuracy under stress
&lt;/h3&gt;

&lt;p&gt;Blended feeds average out discrepancies between sources. That can be good (no single outlier dominates) or bad (a real move gets smoothed before it propagates). Reuters/Refinitiv publishes continuous intraday quotes sampled from actual interbank transactions, so the feed reflects real market activity, not a cleaned-up mid-market synthesis.&lt;/p&gt;

&lt;p&gt;In calm markets, the two approaches produce nearly identical numbers. In volatile markets — central bank announcements, macro surprises, geopolitical events — the Reuters/interbank feed tends to move first and more sharply.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reproducibility
&lt;/h3&gt;

&lt;p&gt;If a customer disputes a rate ("you charged me at 0.923 but the market was at 0.925 at that time"), you need to point them at a source they can verify. A named feed makes that trivial; a blended feed makes it a judgment call.&lt;/p&gt;

&lt;h2&gt;
  
  
  When the difference doesn't matter
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Price display for informational purposes ("USD/EUR is roughly 0.92 today").&lt;/li&gt;
&lt;li&gt;Shopping carts where rates are hedged through a payment processor (the processor's rate is what actually applies).&lt;/li&gt;
&lt;li&gt;Analytics dashboards where accuracy to within 5-10 basis points is fine.&lt;/li&gt;
&lt;li&gt;Non-regulated use cases where no one will ever ask for source documentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When the difference matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Anywhere the rate is the &lt;em&gt;contractual&lt;/em&gt; conversion rate (remittance, cross-border invoicing, settlement).&lt;/li&gt;
&lt;li&gt;Audited financial reporting.&lt;/li&gt;
&lt;li&gt;Regulated industries (fintech, broker-dealer, payments).&lt;/li&gt;
&lt;li&gt;Backtests where you want the most realistic intraday behavior.&lt;/li&gt;
&lt;li&gt;Any case where a customer or auditor could demand source documentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The data-pipeline picture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OpenExchangeRates (inferred from public descriptions)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Undisclosed Source A] ──┐
[Undisclosed Source B] ──┤
[Undisclosed Source C] ──┼──&amp;gt; Blending algorithm ──&amp;gt; latest.json (updated hourly)
[Undisclosed Source N] ──┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Opacity: which sources, how many, what weights, what rejection rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  AllRatesToday
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reuters (Refinitiv) FX feed ──┐
Interbank market feeds ───────┼──&amp;gt; Mid-market aggregation ──&amp;gt; /api/v1/rates (updated every 60s)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Transparency: sources named, philosophy stated (mid-market), cadence documented.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to evaluate your own situation
&lt;/h2&gt;

&lt;p&gt;Ask these questions about your use case:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Will anyone ever ask where this rate came from?&lt;/strong&gt; (Auditor, regulator, customer, internal finance team.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the rate the contractual amount?&lt;/strong&gt; (Vs. a display-only reference.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Does my industry have rules about FX data provenance?&lt;/strong&gt; (Payments, remittance, insurance, broker-dealer.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do I need the freshest possible rate during volatile sessions?&lt;/strong&gt; (Trading-adjacent, treasury, hedging.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One "yes" = sourcing transparency matters enough to choose a named-feed provider. No "yes"es = blended is fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical test
&lt;/h2&gt;

&lt;p&gt;Run both providers side-by-side for a month and log the delta on major pairs during volatile days (US CPI release, ECB meeting, BoJ intervention). You'll see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calm day: delta &amp;lt;5 bps most of the time.&lt;/li&gt;
&lt;li&gt;Volatile hour: delta can reach 20-50 bps as OpenExchangeRates' hourly cadence lags the Reuters/interbank feed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most apps, 5 bps on a calm day doesn't matter. For any app where the rate is the contractual amount, a 30-bp gap during volatility does.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://allratestoday.com/register" rel="noopener noreferrer"&gt;Get your free AllRatesToday API key&lt;/a&gt; — Reuters/Refinitiv + interbank feeds, 60-second updates, named and auditable sources. No credit card.&lt;/p&gt;

</description>
      <category>openexchangerates</category>
      <category>exchangerateapi</category>
    </item>
    <item>
      <title>How to Use the AllRatesToday MCP Server with Claude Code and Cursor</title>
      <dc:creator>Madhushan </dc:creator>
      <pubDate>Tue, 21 Apr 2026 19:20:39 +0000</pubDate>
      <link>https://dev.to/chathuranga_basnayaka_d50/how-to-use-the-allratestoday-mcp-server-with-claude-code-and-cursor-5db9</link>
      <guid>https://dev.to/chathuranga_basnayaka_d50/how-to-use-the-allratestoday-mcp-server-with-claude-code-and-cursor-5db9</guid>
      <description>&lt;h1&gt;
  
  
  How to Use the AllRatesToday MCP Server with Claude Code and Cursor
&lt;/h1&gt;

&lt;p&gt;AI coding tools are great at writing code and explaining diffs, but they're unreliable at anything numeric and time-sensitive. Ask Claude Code "what's today's USD to EUR rate?" and you'll get a stale guess. The &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; (MCP) fixes this by letting clients call real tools. This post walks through the &lt;strong&gt;AllRatesToday MCP server&lt;/strong&gt; — what it does, how to install it in four different clients, and how to debug when something goes wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the AllRatesToday MCP server?
&lt;/h2&gt;

&lt;p&gt;It's a small npm package — &lt;a href="https://www.npmjs.com/package/@allratestoday/mcp-server" rel="noopener noreferrer"&gt;&lt;code&gt;@allratestoday/mcp-server&lt;/code&gt;&lt;/a&gt; — that exposes four currency tools over the MCP stdio transport. Any MCP-compatible client (Claude Code, Cursor, Claude Desktop, ChatGPT Desktop, and any custom MCP host) can call them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;API key?&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_exchange_rate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;Current mid-market rate between two currencies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_historical_rates&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Time series over 1d, 7d, 30d, or 1y.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_rates_authenticated&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;Multi-target rates with higher limits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_currencies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;All 160+ supported currencies.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two of the four tools (&lt;code&gt;get_exchange_rate&lt;/code&gt; and &lt;code&gt;list_currencies&lt;/code&gt;) work without an API key. Set &lt;code&gt;ALLRATES_API_KEY&lt;/code&gt; for the historical and multi-target endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js 18 or newer.&lt;/strong&gt; &lt;code&gt;npx&lt;/code&gt; ships with Node and handles installing the package on first run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An MCP-compatible client.&lt;/strong&gt; Claude Code, Cursor (0.42+), Claude Desktop, or ChatGPT Desktop all qualify.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional: AllRatesToday API key&lt;/strong&gt; — &lt;a href="https://dev.to/register/"&gt;register for a free one&lt;/a&gt; if you need higher limits.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install in Claude Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add allratestoday &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; @allratestoday/mcp-server
claude mcp &lt;span class="nb"&gt;env &lt;/span&gt;allratestoday &lt;span class="nv"&gt;ALLRATES_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;art_live_xxxxx   &lt;span class="c"&gt;# optional&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code will install the package on first invocation via &lt;code&gt;npx&lt;/code&gt;. Verify it's loaded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp list
&lt;span class="c"&gt;# should show: allratestoday  running  (4 tools)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now open any chat and ask: &lt;em&gt;"What's the USD to EUR rate right now?"&lt;/em&gt; Claude Code picks up the &lt;code&gt;get_exchange_rate&lt;/code&gt; tool, calls it, and answers with the live number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install in Cursor
&lt;/h2&gt;

&lt;p&gt;Edit &lt;code&gt;~/.cursor/mcp.json&lt;/code&gt; (or create a project-local &lt;code&gt;.cursor/mcp.json&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allratestoday"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@allratestoday/mcp-server"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ALLRATES_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"art_live_xxxxx"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Cursor. Settings → Cursor Settings → MCP should now list "allratestoday" with a green indicator. You can toggle individual tools there if you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install in Claude Desktop (and ChatGPT Desktop)
&lt;/h2&gt;

&lt;p&gt;Edit the desktop client's config file:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS:&lt;/strong&gt; &lt;code&gt;~/Library/Application Support/Claude/claude_desktop_config.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows:&lt;/strong&gt; &lt;code&gt;%APPDATA%\Claude\claude_desktop_config.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT Desktop&lt;/strong&gt; uses the same JSON shape in its own config — paste the block below.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allratestoday"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@allratestoday/mcp-server"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ALLRATES_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"art_live_xxxxx"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fully quit and reopen the app. The "Search and tools" icon should show &lt;code&gt;allratestoday&lt;/code&gt; with four tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example prompts
&lt;/h2&gt;

&lt;p&gt;A few prompts that exercise each tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;"What's 1,250 GBP in Singapore dollars?"&lt;/em&gt; — calls &lt;code&gt;get_exchange_rate&lt;/code&gt;, multiplies client-side.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"Show me the trend of USD/JPY over the last 30 days."&lt;/em&gt; — calls &lt;code&gt;get_historical_rates&lt;/code&gt; with &lt;code&gt;period=30d&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"Get me today's rates for EUR against USD, GBP, and CHF in one call."&lt;/em&gt; — calls &lt;code&gt;get_rates_authenticated&lt;/code&gt; with comma-separated targets (requires API key).&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;"What currencies does AllRatesToday support?"&lt;/em&gt; — calls &lt;code&gt;list_currencies&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Debugging tool calls
&lt;/h2&gt;

&lt;p&gt;If the assistant isn't calling the tool, or calls are failing, there are three quick checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Is the server actually running?
&lt;/h3&gt;

&lt;p&gt;In your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; @allratestoday/mcp-server
&lt;span class="c"&gt;# waits on stdin — this is correct, stdio transport&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Press Ctrl+C to exit. If this errors (e.g. &lt;code&gt;command not found: npx&lt;/code&gt;), install Node 18+.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Send a raw &lt;code&gt;tools/list&lt;/code&gt; request
&lt;/h3&gt;

&lt;p&gt;MCP is JSON-RPC over stdio. You can drive it manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"0"}}}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"notifications/initialized"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":2,"method":"tools/list"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | npx &lt;span class="nt"&gt;-y&lt;/span&gt; @allratestoday/mcp-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see the handshake plus a list of all five tool schemas. If this works, the server is healthy — the problem is in the client config.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Check the client's MCP log
&lt;/h3&gt;

&lt;p&gt;Claude Desktop writes a log you can read at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS&lt;/span&gt;
~/Library/Logs/Claude/mcp&lt;span class="k"&gt;*&lt;/span&gt;.log

&lt;span class="c"&gt;# Windows&lt;/span&gt;
%APPDATA%&lt;span class="se"&gt;\C&lt;/span&gt;laude&lt;span class="se"&gt;\l&lt;/span&gt;ogs&lt;span class="se"&gt;\m&lt;/span&gt;&lt;span class="nb"&gt;cp&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for &lt;code&gt;allratestoday&lt;/code&gt; lines. A common issue: the config's JSON is invalid (trailing comma, missing quote). The log will say so.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do I need an API key?
&lt;/h2&gt;

&lt;p&gt;Only for two of the four tools. &lt;code&gt;get_exchange_rate&lt;/code&gt; and &lt;code&gt;list_currencies&lt;/code&gt; call public endpoints and work without a key. &lt;code&gt;get_historical_rates&lt;/code&gt; and &lt;code&gt;get_rates_authenticated&lt;/code&gt; both require &lt;code&gt;ALLRATES_API_KEY&lt;/code&gt;. Set one if you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Historical rate data (1d/7d/30d/1y periods).&lt;/li&gt;
&lt;li&gt;Multi-target single-call lookups (e.g. EUR against USD + GBP + CHF).&lt;/li&gt;
&lt;li&gt;Higher rate limits (the public endpoints have reasonable but not unlimited quotas).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A free key with 300 requests/month is &lt;a href="https://dev.to/register/"&gt;available at registration&lt;/a&gt; — no credit card.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about privacy?
&lt;/h2&gt;

&lt;p&gt;The MCP server runs locally on your machine and talks to &lt;code&gt;allratestoday.com/api&lt;/code&gt; directly. It doesn't log prompts, and it doesn't proxy through a third party. Source is &lt;a href="https://github.com/cahthuranag/mcp-server" rel="noopener noreferrer"&gt;on GitHub&lt;/a&gt; — you can read it end-to-end in under 15 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related integrations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek (Python):&lt;/strong&gt; &lt;a href="https://dev.to/deepseek/"&gt;&lt;code&gt;allratestoday-deepseek&lt;/code&gt;&lt;/a&gt; — same tools, wired into DeepSeek's function calling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Any LLM with browsing:&lt;/strong&gt; our &lt;a href="///llms.txt"&gt;/llms.txt&lt;/a&gt; tells them the public endpoint to call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every supported client:&lt;/strong&gt; the full rundown is on &lt;a href="https://dev.to/mcp/"&gt;the MCP landing page&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install the server in your preferred client (above).&lt;/li&gt;
&lt;li&gt;Ask your assistant for a live rate — confirm it cites the number.&lt;/li&gt;
&lt;li&gt;If you need multi-target or higher limits, &lt;a href="https://dev.to/register/"&gt;grab a free API key&lt;/a&gt; and set &lt;code&gt;ALLRATES_API_KEY&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Open an issue or PR on &lt;a href="https://github.com/cahthuranag/mcp-server" rel="noopener noreferrer"&gt;the repo&lt;/a&gt; if something's missing.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;Give your AI assistant real currency data.&lt;/strong&gt; Install in one line. Free tier with real-time rates. No credit card. &lt;a href="https://dev.to/register/"&gt;Get your free API key&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>mcp</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>AllRatesToday in Claude Code, Cursor, and DeepSeek (MCP + Tool Calling)</title>
      <dc:creator>Madhushan </dc:creator>
      <pubDate>Tue, 21 Apr 2026 19:20:00 +0000</pubDate>
      <link>https://dev.to/chathuranga_basnayaka_d50/allratestoday-in-claude-code-cursor-and-deepseek-mcp-tool-calling-30gp</link>
      <guid>https://dev.to/chathuranga_basnayaka_d50/allratestoday-in-claude-code-cursor-and-deepseek-mcp-tool-calling-30gp</guid>
      <description>&lt;h1&gt;
  
  
  AllRatesToday in Claude Code, Cursor, and DeepSeek
&lt;/h1&gt;

&lt;p&gt;If you ask ChatGPT, Claude, or DeepSeek &lt;em&gt;"what's the USD to EUR rate today?"&lt;/em&gt;, you usually get a confident-sounding hallucination. Large language models don't know this week's exchange rates — they know rough historical ranges from their training data. For anything financial, that's a problem.&lt;/p&gt;

&lt;p&gt;Today we're shipping two integrations that fix this specifically for AllRatesToday:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;An MCP server&lt;/strong&gt; — so Claude Code, Cursor, Claude Desktop, and any other Model Context Protocol client can call our rate endpoints directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A DeepSeek function-calling package&lt;/strong&gt; — a Python module that wires up real-time rates as tools for &lt;code&gt;deepseek-chat&lt;/code&gt; and &lt;code&gt;deepseek-reasoner&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both are open source, MIT-licensed, and share the same set of tools: current rate, currency conversion, historical data, and supported-currency list. The first two work without an API key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why add currency tools to an AI assistant?
&lt;/h2&gt;

&lt;p&gt;Three concrete use cases we've heard from users in the last month:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Invoice review.&lt;/strong&gt; "I have an invoice in USD, my books are in EUR — what should I record this as today?" The assistant needs a real rate, not a guess.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Travel planning.&lt;/strong&gt; "Plan a 5-day Tokyo trip for 300,000 JPY." Without a live rate, the model can't accurately translate that into your home currency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-border quotes.&lt;/strong&gt; "Quote this SOW at $12,000 USD but show the Brazilian client a BRL figure." Same problem — requires today's mid-market rate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In each case, the LLM is doing the hard part (understanding intent, formatting output). What it needs is a deterministic tool for the numeric step. That's what these integrations are.&lt;/p&gt;

&lt;h2&gt;
  
  
  The MCP server: for Claude Code, Cursor, Claude Desktop
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.npmjs.com/package/@allratestoday/mcp-server" rel="noopener noreferrer"&gt;&lt;code&gt;@allratestoday/mcp-server&lt;/code&gt;&lt;/a&gt; package implements the &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; — a standard that lets any MCP-compatible AI client call your tools over stdio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install in Claude Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add allratestoday &lt;span class="nt"&gt;--&lt;/span&gt; npx &lt;span class="nt"&gt;-y&lt;/span&gt; @allratestoday/mcp-server
claude mcp &lt;span class="nb"&gt;env &lt;/span&gt;allratestoday &lt;span class="nv"&gt;ALLRATES_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;art_live_xxxxx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install in Cursor or Claude Desktop
&lt;/h3&gt;

&lt;p&gt;Add this to your MCP config (&lt;code&gt;~/.cursor/mcp.json&lt;/code&gt; or Claude Desktop's config file):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allratestoday"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@allratestoday/mcp-server"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"ALLRATES_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"art_live_xxxxx"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart the client. Your assistant now has four new tools: &lt;code&gt;get_exchange_rate&lt;/code&gt;, &lt;code&gt;get_historical_rates&lt;/code&gt;, &lt;code&gt;get_rates_authenticated&lt;/code&gt;, and &lt;code&gt;list_currencies&lt;/code&gt;. Two of them (&lt;code&gt;get_exchange_rate&lt;/code&gt; and &lt;code&gt;list_currencies&lt;/code&gt;) don't need a key; the other two do.&lt;/p&gt;

&lt;p&gt;Full docs and source: &lt;a href="https://dev.to/mcp/"&gt;allratestoday.com/mcp&lt;/a&gt; and &lt;a href="https://github.com/cahthuranag/mcp-server" rel="noopener noreferrer"&gt;github.com/cahthuranag/mcp-server&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The DeepSeek package: Python function calling
&lt;/h2&gt;

&lt;p&gt;DeepSeek's Chat Completions API is OpenAI-compatible, which means the same function-calling mechanism works out of the box. The &lt;a href="https://github.com/cahthuranag/allratestoday-deepseek" rel="noopener noreferrer"&gt;&lt;code&gt;allratestoday-deepseek&lt;/code&gt;&lt;/a&gt; package ships tool schemas, an agent wrapper, and a CLI.&lt;/p&gt;

&lt;h3&gt;
  
  
  One-shot question
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;allratestoday-deepseek
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DEEPSEEK_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-xxxxx
allratestoday-deepseek &lt;span class="nt"&gt;--ask&lt;/span&gt; &lt;span class="s2"&gt;"What is 2500 USD in EUR right now?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Library usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;allratestoday_deepseek&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DeepSeekCurrencyAgent&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;DeepSeekCurrencyAgent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How many Japanese Yen is 500 Swiss Francs?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under the hood, the agent sends your question to &lt;code&gt;deepseek-chat&lt;/code&gt; with the tool schemas attached. If DeepSeek decides to call &lt;code&gt;convert_currency&lt;/code&gt;, the package executes it against the AllRatesToday API and passes the JSON result back. DeepSeek then produces a final answer citing the actual rate.&lt;/p&gt;

&lt;p&gt;If you'd rather drive the tool loop yourself (for integration into LangChain, LangGraph, or a custom orchestrator), import &lt;code&gt;TOOLS&lt;/code&gt; and &lt;code&gt;dispatch_tool&lt;/code&gt; and wire them in directly. See &lt;a href="https://github.com/cahthuranag/allratestoday-deepseek/blob/main/examples/raw_tool_call.py" rel="noopener noreferrer"&gt;the raw example&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Full docs: &lt;a href="https://dev.to/deepseek/"&gt;allratestoday.com/deepseek&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about ChatGPT?
&lt;/h2&gt;

&lt;p&gt;ChatGPT Desktop added MCP support in late 2025, so the MCP server above works there too — same config format as Claude Desktop. For plain &lt;code&gt;chatgpt.com&lt;/code&gt;, you can build a Custom GPT with Actions pointed at our &lt;a href="https://allratestoday.com/openapi.json" rel="noopener noreferrer"&gt;OpenAPI spec&lt;/a&gt;. That's on our roadmap as an official first-party GPT; until then, our &lt;a href="///llms.txt"&gt;llms.txt&lt;/a&gt; tells any browsing-enabled LLM exactly which endpoints to call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the hood: same four tools everywhere
&lt;/h2&gt;

&lt;p&gt;Whether you're using MCP, DeepSeek function calling, or the raw REST API, the operations are the same:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;API key?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_exchange_rate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /api/rate?source=X&amp;amp;target=Y&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;convert_currency&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;(rate × amount, client-side)&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_historical_rates&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /api/historical-rates&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_rates_authenticated&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /api/v1/rates&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_currencies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /api/v1/symbols&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All rates are mid-market, sourced from Reuters (Refinitiv) and interbank market feeds. 160+ currencies supported.&lt;/p&gt;

&lt;h2&gt;
  
  
  Licensing &amp;amp; contributions
&lt;/h2&gt;

&lt;p&gt;Both packages are MIT-licensed. Issues and pull requests are welcome:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/cahthuranag/mcp-server" rel="noopener noreferrer"&gt;github.com/cahthuranag/mcp-server&lt;/a&gt; — MCP server&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/cahthuranag/allratestoday-deepseek" rel="noopener noreferrer"&gt;github.com/cahthuranag/allratestoday-deepseek&lt;/a&gt; — DeepSeek integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you build something on top of these — a custom agent, a Slack bot, a trading notebook — we'd love to hear about it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Real currency data in your AI stack.&lt;/strong&gt; Free tier with 300 requests per month. No credit card required. &lt;a href="https://dev.to/register/"&gt;Get your free API key&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
