Install
openclaw skills install @cahthuranag/allratestodayExchange rates and currency conversion ('convert 200 USD to EUR', 'GBP/JPY rate'), plus the official rate a named central bank or tax authority published (ECB, HMRC, RBI, SAMA, 120 more) for invoices, VAT, customs or audit. Fetches with web_fetch, curl fallback. Keyless; API key optional for live mid-market rates.
openclaw skills install @cahthuranag/allratestodayNever state an exchange rate from memory. Every rate in training data is stale; fetch it and quote the date that comes back with it.
| The request | Endpoint | Key |
|---|---|---|
| Convert an amount, "what is X worth in Y", a price in another currency | GET https://allratestoday.com/api/open/latest/{BASE} | none |
| The rate a named institution published (tax, VAT, customs, invoice, audit, "the ECB rate", "HMRC rate") | GET https://allratestoday.com/api/open/central-bank/{code} | none, personal and non-commercial use |
| Live mid-market rate for 160+ currencies, several targets in one call | GET https://allratestoday.com/api/v1/rates?source=USD&target=EUR,GBP | Authorization: Bearer $ALLRATESTODAY_API_KEY |
| A rate on a past date, or a history series | paid-plan endpoints, see https://allratestoday.com/docs/ | paid key |
Rule: if the task names a publisher or a compliance purpose, use the institution's table, not the market rate. The two routinely differ by a percent or more and an auditor will ask which publisher the number came from.
Done when: you know the endpoint, and for an institution the code from references/institutions.md.
Preferred:
await web_fetch({
url: "https://allratestoday.com/api/open/latest/USD",
extractMode: "text",
maxChars: 6000,
});
Fallback when web_fetch is unavailable:
curl --fail --silent --show-error --max-time 20 "https://allratestoday.com/api/open/latest/USD"
curl --fail --silent --show-error --max-time 20 "https://allratestoday.com/api/open/central-bank/hmrc"
With a key (read it from the environment, never print it):
curl --fail --silent --show-error --max-time 20 \
-H "Authorization: Bearer $ALLRATESTODAY_API_KEY" \
"https://allratestoday.com/api/v1/rates?source=USD&target=EUR,GBP,JPY"
Done when: the body is JSON. {"result":"success", ...} for the latest table, {"bank": ..., "rates": [...]} for an institution. A body with "error" or a non-200 status is a failure: report it, do not guess.
Latest table (/api/open/latest/{BASE}):
{"result":"success","base_code":"USD","date":"2026-10-29","rates":{"EUR":0.8985,"GBP":0.7509,"JPY":158.06}}
rates[T] is units of T per 1 BASE. Converted amount = amount * rates[T].BASE, about 30 currencies, one table per ECB business day. A currency missing from rates is not covered keyless; say so, or use the keyed endpoint.Institution table (/api/open/central-bank/{code}):
{"bank":"sama","rate_date":"2026-10-29","stale":false,
"rates":[{"base":"USD","quote":"SAR","type":"reference","value":3.75}, ...]}
1 base = value quote. Direction varies by institution: some quote home currency per foreign unit (SAMA, Bank of Korea), others foreign units per home unit (RBNZ, Bank of England). Read base and quote, never assume.type. Prefer reference, then middle or mid, then official; use the mean of buy and sell only when nothing else exists.stale: true means the institution has not published a fresh table; report the rate_date it carries instead of presenting it as today's.Done when: you have one number, its direction, its type (institution tables) and its date.
date or rate_date and the publisher ("ECB reference table, 2026-10-29", "SAMA official reference rate, 2026-10-29").403, say the plan does not cover it.https://allratestoday.com/api/mcp (see https://allratestoday.com/mcp/).references/institutions.md.