No Official SDKs on Open Exchange Rates: AllRatesToday's JavaScript, Python, and PHP Libraries
Open Exchange Rates' own docs spell it out: "We don't actively support or maintain any of these community libraries (except where stated)." The recommended integration path is direct HTTP — "access latest.json via AJAX, CURL, Scrapy, node-httpagent, or your method of choice."
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.
AllRatesToday 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.
What "no official SDK" means
Open Exchange Rates' API Libraries & Extensions 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.
What you give up without an official SDK:
- Type definitions. Auto-complete for endpoint names, parameters, and response shapes.
- Version-stable contract. Community libs sometimes drift from the official API spec.
- Consistent error handling. Each lib defines its own error classes and conventions.
- Unified retry/backoff. Each lib (re)implements retries from scratch, often badly.
- Support. Open Exchange Rates can't help if the bug is in a third-party library.
AllRatesToday's official SDKs
JavaScript / TypeScript
npm install @allratestoday/sdk import AllRatesToday from '@allratestoday/sdk';
const client = new AllRatesToday(process.env.ALLRATES_API_KEY!);
// Single rate (typed response)
const { rate } = await client.getRate('USD', 'EUR');
// Convert with typed result
const { result } = await client.convert('USD', 'EUR', 1000);
// Historical — returns a typed time series
const history = await client.getHistoricalRates('USD', 'EUR', '30d');
history.rates.forEach(p => console.log(p.time, p.rate)); Full TypeScript types. Throws a typed AllRatesTodayError on 4xx/5xx. Handles retry/backoff by default.
Python
pip install allratestoday from allratestoday import AllRatesToday
client = AllRatesToday(api_key="YOUR_KEY")
rate = client.get_rate("USD", "EUR")
result = client.convert("USD", "EUR", 1000)
history = client.get_historical_rates("USD", "EUR", "30d") Ships with type hints, async variant (AsyncAllRatesToday), and context-manager support.
PHP
composer require allratestoday/sdk use AllRatesToday\AllRatesToday;
$client = new AllRatesToday('YOUR_KEY');
$rate = $client->getRate('USD', 'EUR');
$result = $client->convert('USD', 'EUR', 1000); PSR-18 compatible HTTP client, PSR-3 logger support.
The same task in raw HTTP (what you'd write against Open Exchange Rates)
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:
async function getRate(from, to, attempt = 0) {
const url = `https://openexchangerates.org/api/latest.json?app_id=${APP_ID}&base=${from}&symbols=${to}`;
try {
const res = await fetch(url);
if (res.status === 429) {
// rate limited — backoff
if (attempt < 3) {
await new Promise(r => setTimeout(r, 2 ** attempt * 1000));
return getRate(from, to, attempt + 1);
}
throw new Error('Rate limited after retries');
}
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const data = await res.json();
if (data.error) throw new Error(data.description);
return data.rates[to];
} catch (err) {
// re-throw normalized
throw err;
}
} About 20 lines of hand-rolled glue per team. The AllRatesToday SDK gives you all of this behind a three-word method call.
Note: the base={from} 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. We cover that pain point separately.
MCP and DeepSeek: AI-coding-tool integrations
AllRatesToday also ships integrations Open Exchange Rates doesn't offer at all:
- MCP server (
@allratestoday/mcp-server) — plugs into Claude Code, Cursor, Claude Desktop, ChatGPT Desktop. Your AI assistant can callget_exchange_rate,get_historical_rates,list_currencies, andget_rates_authenticateddirectly. - DeepSeek package (
allratestoday-deepseek) — Python function-calling library for DeepSeek's Chat Completions API.
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.
When community libraries are fine
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.
When you want an official SDK
- Production apps where error handling and retry policy need to be consistent and tested.
- TypeScript or typed Python codebases where response types avoid class of bugs.
- Teams that want vendor support when something breaks.
- Anyone building on top of the SDK (wrappers, higher-level libraries, custom agents).
Skip the hand-rolled HTTP client
Install the SDK, start calling client.getRate(), done. No credit card required.
Get your free API key