agentsclimarketplace

Exchangerate dev

Skill nusantara-ventures/exchangerate-skills/skills/exchangerate-dev

Agent Skills for exchangerate.dev — FX rates API. Currency conversion, FX correctness, portfolio translation, multi-currency pricing. Works keyless.

Install
npx -y skills add nusantara-ventures/exchangerate-skills --skill exchangerate-dev

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Use the exchangerate.dev API correctly for anything involving foreign-exchange rates — fetching live or historical currency rates, converting amounts between currencies, building FX time-series, or wiring the exchangerate.dev MCP server into an agent. Use this skill whenever the user mentions exchange rates, currency conversion, forex/FX data, "USD to EUR", multi-currency features, or needs a rates API — even if they don't name a provider. Works keyless out of the box (no signup needed to try it).

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

7.5 KB, as published. Nobody here has run it

exchangerate.dev API

Foreign-exchange rates over a clean REST API. 465 currency pairs across 31 currencies; actively-traded currencies reprice live (~60 s) on trading days, with ECB/FRED daily reference rates filling the rest. Every response labels its own freshness (source, market_session) per currency, so you never have to guess whether a rate is current — don't hardcode which currencies are live; the sources map tells you per call.

Base URL: https://api.exchangerate.dev

Auth — start keyless, add a key for volume

Data endpoints need no API key. Anonymous calls are served at the Free tier's rate limit (12 req/min, per IP). Just call it:

curl "https://api.exchangerate.dev/v1/latest?base=USD&symbols=EUR,JPY"

For more volume, get a free key (10,000 calls/month, no credit card) at https://exchangerate.dev/signup and send it as a Bearer token:

curl "https://api.exchangerate.dev/v1/latest?base=USD" \
  -H "Authorization: Bearer $EXCHANGERATE_API_KEY"

Store the key in the EXCHANGERATE_API_KEY environment variable — never hard-code it or pass it on a command line that lands in shell history. Rate-limit state is visible on every response via x-ratelimit-limit, x-ratelimit-remaining, and x-ratelimit-reset headers; back off when remaining hits 0 rather than retrying blind.

Endpoints

Latest rates — GET /v1/latest

curl "https://api.exchangerate.dev/v1/latest?base=EUR&symbols=USD,JPY,IDR"
{
  "result": "success",
  "base": "EUR",
  "source": "live",
  "sources": { "USD": "live", "JPY": "live", "IDR": "live" },
  "market_session": "open",
  "timestamp": "2026-07-06T10:41:30Z",
  "data_updated_at": "2026-07-06T10:41:09Z",
  "rates": { "USD": 1.14192, "JPY": 185.366, "IDR": 20512.88 },
  "derived_symbols": [],
  "notice": "Indicative rates, not for settlement."
}

GET /v1/latest/USD (base in the path) works too, as does the Frankfurter-style parameter set — code written against Frankfurter runs unchanged against this endpoint. Omit symbols to get all supported quote currencies.

Convert — GET /v1/convert/{FROM}/{TO}/{AMOUNT}

curl "https://api.exchangerate.dev/v1/convert/EUR/USD/100"
{
  "result": "success",
  "from": "EUR", "to": "USD", "amount": 100.0,
  "rate": 1.14192, "converted": 114.19,
  "derived": false, "derivation_bps_max": null,
  "source": "live", "market_session": "open",
  "timestamp": "2026-07-06T10:41:29Z"
}

converted is already rounded to the target currency's minor units — prefer it over multiplying rate yourself and re-rounding.

Batch convert — POST /v1/convert

One from currency, many targets. Each pair is metered as one call.

curl -X POST "https://api.exchangerate.dev/v1/convert" \
  -H "Content-Type: application/json" \
  -d '{"from": "USD", "pairs": [["EUR", 100], ["GBP", 50], ["JPY", 1000]]}'

The body shape is {"from": string, "pairs": [[symbol, amount], ...]} — an array of two-element tuples, not an array of objects. Response carries a conversions array with to, amount, rate, converted, derived per pair.

Single pair by slug — GET /v1/rate/{slug}

curl "https://api.exchangerate.dev/v1/rate/eur-usd"

Returns pair, base, quote, rate plus the standard freshness fields. Slug is case-insensitive (eur-usd); unknown pairs return code: "invalid_pair".

Historical snapshot — GET /v1/{YYYY-MM-DD}?base=...&symbols=...

Daily series back to 1999-01-04.

curl "https://api.exchangerate.dev/v1/2024-01-15?base=USD&symbols=EUR,JPY"

Weekend/holiday dates return the most recent business-day fix with "is_forward_filled": true. Always check that flag when the exact date matters (accounting, audits) — see the fx-rates-correctness skill for the full pitfall list.

Time-series — GET /v1/range

curl "https://api.exchangerate.dev/v1/range?base=USD&symbols=EUR&start_date=2024-01-01&end_date=2024-06-30"

Parameters are start_date / end_date (not start/end). Returns one row per business day (weekends are absent, not null). Max 366 rows per page; when has_more is true, pass next_cursor to get the next page — don't assume one page covers the whole range.

Currency metadata — GET /v1/currencies

{ "code": "AUD", "name": "Australian Dollar", "type": "fiat", "decimals": 5, "minor_units": 2, "is_derived": false }

Call this first when you need valid codes, per-pair decimal precision (decimals = quote precision, minor_units = cash rounding), or to filter out triangulated pairs.

Reading the freshness fields (the part most integrations get wrong)

Every response self-describes its freshness. Inspect these before presenting a rate as "current":

  • source — the least-fresh tier across returned rates: live (~60 s intraday), ecb_daily (ECB fix, ~16:00 CET business days), fred_daily (FRED reference).
  • sources — per-currency map; a mixed request can be live for EUR and ecb_daily for MYR.
  • market_sessionopen, weekend, or interbank_closed. source: live + market_session: weekend means the value is the last trading-week consensus, not a fresh quote. Say so in any UI or answer.
  • data_updated_at — when the pipeline last wrote the value; timestamp — when the response was produced.
  • derived_symbols / derived: true — the pair was triangulated through USD (error ≈ 1–2 bps, bounded by derivation_bps_max). Filter these out for research that needs native quotes.

All rates are indicative (aggregated market data, ~5–15 bps) — fine for display, dashboards, analytics, and internal tooling; not for settlement or as a regulated source of record.

MCP server (for agent hosts)

Five tools — list_currencies, get_rate, convert, get_range, search_docs — on every plan including Free. HTTP endpoint: https://api.exchangerate.dev/v1/mcp/, or stdio:

{
  "mcpServers": {
    "exchangerate": {
      "command": "npx",
      "args": ["exchangerate-dev-mcp"],
      "env": { "EXCHANGERATE_API_KEY": "YOUR_KEY" }
    }
  }
}

Prefer the MCP server when the host supports it (Claude Desktop/Code, Cursor); use REST when writing application code. Source: https://github.com/nusantara-ventures/exchangerate-dev-mcp

Error handling

Errors return {"result": "error", "code": "...", "message": "..."} with a stable code (missing_parameter, invalid_request, invalid_pair, ...). Branch on code, not on message text. HTTP 429 = rate limited; respect x-ratelimit-reset (unix seconds) before retrying.

Related skills in this repo

  • fx-rates-correctness — weekend gaps, forward-fill, precision, triangulation: the correctness pitfalls.
  • multi-currency-pricing — adding multi-currency display prices to an app.
  • portfolio-currency-translation — translating multi-market portfolios into one home currency.
  • fx-accounting-rates — rate-of-record choices for invoicing and bookkeeping.
  • fx-dashboard-widgets — live rate tickers, charts, and session-aware UI.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.