Changelog

Everything that changed, in order.

Endpoint behaviour, limits, response fields, documentation and pricing — recorded as it shipped. If a figure in the API changed, it is written down here rather than left to be discovered mid-integration.

Last entry 2026-11-063 dated entries

Both timestamps, and a gate on every reading

  • Every API response now carries a freshness block: when we read the rates, when the source last published them, how old the reading is and whether it is behind schedule. The rate desk and status page show the same two figures side by side.
  • Every reading is validated before it is stored — complete, positive values, the base quoted at 1, no loss of the catalogue, and no market-wide move large enough to suggest a broken feed. A refused reading keeps the previous one answering.
  • The status page publishes the result of the most recent check, so data quality is shown rather than asserted.
  • Keyed calls now have per-key burst windows (20 a second, 2,000 an hour) and report them in x-ratelimit headers. Volume is still bounded only by your balance, and a refused call spends nothing.
  • Requests with a URL longer than 2,048 characters answer 414 instead of being parsed.
  • The sync floor is measured from the reading being served rather than the last run, so a tick that never fired no longer leaves the store stale until two cycles pass.
  • Marketing copy no longer states a sync interval. The data page and FAQ describe how freshness actually works instead.

One balance, stated plainly

  • The signup bonus is read from a single constant everywhere, so the rate desk, the API quota block and the pricing page can no longer quote different totals.
  • Limits, tier lists and examples were audited against the live endpoint: the open response carries current rates only, with no quota and no history.
  • API examples on the homepage and in the reference now print the catalogue size the store actually holds instead of a frozen figure.
  • The pricing cards mark what a tier does not include under its own heading, so a crossed-out line can never read as a promise.
  • ?base= rejects stray whitespace and ?snapshots= takes decimal digits only, instead of quietly accepting 'EUR ' or '0x5'.
  • robots.txt narrows its API rule to /api/v1, and the status, questions, changelog and contact pages were added.

Legal and reference pages settled

  • Privacy, terms, refunds and security policies republished with a stated last-updated date.
  • Response fields, error codes and public windows documented from the same constants the endpoints enforce.

Earlier

Shipped earlier

  • Comparisons, integration guides and currency reference pages, with matching structured data, sitemap and llms.txt entries.
  • One-time PayPal top-ups credited on the server once the capture is confirmed.
  • Keyed endpoint with a shared lifetime balance and unlimited keys per account.
  • The rate desk: current reading, cross-pair view, per-currency pages and stored reading history.
  • Open endpoint with no key, returning current rates and the full currency catalogue.

Something missing, or a change you would like to see? Write to us — the API reference is the current contract.

Read the contract, not the history.

The reference is generated from the same constants the endpoints enforce, so it always describes the API as it is today.