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.