Frankfurter
Exchange rates from central banks. We use v1: ECB only, 1999 to today, 30 currencies.
The keyless exchange-rate source worth building on: no signup, CORS open so a browser can call it directly, and history to 1999-01-04. Its failure modes are quiet rather than loud, which is the whole reason for an entry. First, a non-working day resolves BACKWARDS with a 200 — ask for a Sunday and you get Friday's rates with only the `date` field changed, so a consumer that echoes the requested date mislabels its own data. Second, every bad input is the same opaque `404 {"message":"not found"}`: unknown currency, pre-1999 date and future date are indistinguishable, so the client translates that one status into an error naming all three. Third, and the expensive one: cross rates are computed server-side and rounded, so how much precision survives depends on which way you ask. `base=USD` gives `JPY: 154.75`; the same pair as `base=JPY` gives `USD: 0.00646`, whose last digit is worth ~24x more relative to the value. At the extreme it is disqualifying: `base=IDR` gives `GBP: 4.2e-05`, last digit worth 2.4% of the rate. Always make the larger unit the base and divide. Do NOT quote a single precision figure from one reading, though — this verdict did, and was wrong by 10x for a day. JSON drops trailing zeros, so `0.00640` arrives as `0.0064` and any digit-counting measurement reads one decimal too few; the served digit count moves between readings and no `N decimals` or `N significant digits` rule fits all of it (0 to 6 decimals observed across nine bases). Treat every such figure as an upper bound and assert on the RATIO between directions, which is stable. Compare with the Treasury's own quarterly rate (see fiscaldata): same nominal quantity, different authority, and for US federal reporting the Treasury's is the one that counts. COMMERCIAL USE, since it is the first question anyone asks: yes, in three layers. The code is MIT and self-hostable, so the hosted instance's rate limit is optional. The hosted service says so outright — its FAQ answers "Yes, absolutely. See each provider's terms for details on the underlying data" — which hands the data licence back to you. And the ECB data v1 serves may be reused free of charge, commercially included, on two conditions: quote the source (their example is "Source: ECB statistics.") and do not modify the statistics or metadata. The trap is not the licence but the PURPOSE: the ECB states these rates are published for information only and that "using the rates for transaction purposes is strongly discouraged", so displaying, invoicing and reporting are fine while settling at that rate is not what they are for. The no-modification condition also collides with the rounding above — a server-computed cross rate is no longer the published figure — so the clean form is base=EUR plus your own arithmetic and your own attribution. And the version split matters here more than anywhere: v2's default blended rate draws on 84 providers of which only 29 publish a terms_url at all, so 55 of them come with unknown terms. Filter to a named provider, or stay on v1, before any of this is a commercial answer. Also worth knowing when the day comes to move: v2 fixes the opaque 404 — an unknown parameter is 422 naming it.