Guide
Free currency API with no API key: rates in five lines
The fastest possible start: one fetch, no credential, no signup.
What this covers
Most currency APIs gate the first request behind a signup form. Fiat Agent's open endpoint does not: it returns the current reading of the whole catalogue for anyone who asks, which is enough to build a converter, check data quality, or decide whether the service fits before creating an account.
This walkthrough is deliberately short. It covers the one request, the shape it returns, what the public windows are, and the point at which you should switch to a key.
Make the request
One GET, no headers, no query string. The response is JSON and carries the base currency, the number of codes it covers, and the timestamp of the reading behind every figure.
JavaScript · open endpoint
const res = await fetch("https://fiatagent.base44.app/api/v1/public/rates");
if (!res.ok) throw new Error("Fiat Agent: " + res.status);
const { meta, data } = await res.json();
console.log(meta.base_currency); // "USD"
console.log(meta.currency_count); // how many codes are in this reading
console.log(meta.updated_at); // ISO timestamp of the reading
console.log(data.latest.rates.EUR); // EUR per 1 USDRead the two halves of the response
meta describes the response itself — base, count, reading timestamp, tier and the windows that apply to you. data.latest.rates is the quote map: currency code to units of that currency per one unit of the base.
Because every quote is against the same base, any pair is one division away. You do not need a second request to convert between two non-base currencies.
JavaScript · any pair from one response
const per = (from, to) => data.latest.rates[to] / data.latest.rates[from];
console.log(per("EUR", "JPY").toFixed(2), "JPY per 1 EUR");Know the public windows
The open endpoint is bounded per client: 5 a second, 50 an hour and 50 a day. The call that would exceed a window answers 429 with a retry-after header, and the response body names the window that was hit.
That is plenty for a page that fetches once on load, and not enough for a loop, a cron-driven backfill or a server that fetches per request. Those belong on a key.
When to take a key
Take a key when you need the current rate on every request without thinking about a window, when you need stored history, or when you want usage you can attribute to an environment. A new account opens with a 5,000-request signup bonus, so the keyed endpoint is reachable without paying anything.
The only change to your code is where the credential travels: a bearer header rather than a query parameter.
JavaScript · the same read, keyed
const res = await fetch("https://fiatagent.base44.app/api/v1/rates", {
headers: { Authorization: "Bearer " + process.env.FIAT_AGENT_KEY },
});
const { meta, data } = await res.json();
console.log(meta.quota.remaining, "requests left in the balance");Common questions
Is the open endpoint really free, with no key?
Yes. No signup, no card, no credential — it is rate-limited per client and returns the current reading only.
Does the open endpoint return historical rates?
No. History is served from the keyed endpoint, which accepts ?from= and ?to= date ranges.
What happens if I exceed the public window?
The call answers 429 rate_limited with a retry-after header. Nothing is charged and no key is required to try again later.
Run it against the real thing.
The open endpoint needs no key, so you can paste these samples into a terminal before you sign up for anything.