Exchange rates
An exchange rate converts between currencies when a customer is billed in one and you report in another. Kontier syncs rates, lets you override them, and pins the rate an invoice used so the number never moves afterwards.
That pinning is the important part. A finalised invoice is a legal record; if it were re-converted at today's rate, last quarter's revenue would change every morning.
Snapshots
Rates are stored as dated snapshots. A snapshot is every rate as of a given date, so a conversion is always "this pair, on that day", not "this pair, now".
| Endpoint | Returns |
|---|---|
GET /v1/fx/snapshots | Snapshots for a date |
GET /v1/fx/snapshots/latest | The most recent snapshot |
GET /v1/fx/sync-status | Whether the sync is current, and when it last ran |
Check sync-status before investigating a "wrong" conversion. A stale sync
explains more FX surprises than a wrong rate does.
Overrides
POST /v1/fx/overrides sets a rate yourself, for a pair and a period. Two
reasons to reach for one:
- A contractual rate. A customer negotiated a fixed EUR/CHF rate for the year, and the contract wins over the market.
- A correction. The synced rate was wrong and the invoices need to be right.
An override takes precedence over the synced snapshot for its pair and window. Because it changes money, treat adding one as a deliberate act rather than a configuration tweak.
Pinning at finalisation
While an invoice is a draft, conversions are indicative and follow the current rate. When it is finalised, the rate is written down with the document and never recalculated.
So an invoice finalised on 3 March at 0.9520 stays at 0.9520 forever, even if you regenerate the PDF a year later.
Draft totals in another currency can move
Two people opening the same draft on different days may see slightly different converted totals, because nothing is pinned yet. That is correct. If the number must not move, finalise the invoice.
The same logic governs credit notes: a note against an invoice uses the invoice's pinned rate, not today's, so a reversal is exactly equal and opposite.
Dashboard and API names
| In the dashboard | In the API |
|---|---|
| Organization → Billing & Money → FX | /v1/fx/* |
| Rates for a date | GET /fx/snapshots |
| Sync status | GET /fx/sync-status |
| Override | POST /fx/overrides |
| the rate on a finalised invoice | pinned at finalisation, not recomputed |
Where exchange rates go next
- Prices are per currency. FX converts for reporting; it does not invent a price. A customer billed in CHF needs a CHF price.
- Invoices record the rate they used, per line.
- Analytics converts historical figures using the rate each invoice was pinned at, which is why past periods stay stable.
Reference
| Topic | When you need it |
|---|---|
| Currencies | How money is represented on the wire |
| Invoices | Where a pinned rate is recorded |
| Credit notes | Reversing at the original rate |
| FX API | Snapshots, overrides and sync status |