EUR/USD 1.14444 -0.17% GBP/USD 1.33348 -0.25% USD/JPY 157.381 +0.01% USD/CHF 0.81952 -0.17% AUD/USD 0.71055 -0.17% USD/CAD 1.40555 +0.16% NZD/USD 0.57245 +0.27% BTC/USD 86,213.40 -0.42% ETH/USD 2,748.68 -0.94% · EUR/USD 1.14444 -0.17% GBP/USD 1.33348 -0.25% USD/JPY 157.381 +0.01% USD/CHF 0.81952 -0.17% AUD/USD 0.71055 -0.17% USD/CAD 1.40555 +0.16% NZD/USD 0.57245 +0.27% BTC/USD 86,213.40 -0.42% ETH/USD 2,748.68 -0.94% ·
7 min read daily exchange rates api

Daily Exchange Rates API for Invoicing: One Reproducible Rate

Finance teams lock a 9:00 UTC daily snapshot on each invoice, keep spot bid/ask for payments, and store the rate for audit.

Daily Exchange Rates API for Invoicing: One Reproducible Rate

When an invoice is issued in one currency and booked or settled in another, the exchange rate is not a decorative field. It is the figure that hits the general ledger, VAT returns, intercompany recharges, and—months later—an auditor's sample. If that figure cannot be reproduced, the books cannot be defended.

Finance teams evaluating an exchange rate for invoicing API are rarely hunting the last tick. They want a daily exchange rates API: one dated rate, rounded by a documented rule, and stored on the document so last month's invoice still converts to the same amount today. Spot bid and ask remain essential—just not on the invoice.

Key takeaways

  • Invoicing needs one dated, reproducible daily rate—not a moving spot quote.
  • A 9:00 UTC snapshot is a timezone-stable convention for books, tax, and statements.
  • Spot bid/ask belongs on payment execution, not on the invoice line.
  • Persist the rate, timestamps, source, and rounding rule; round converted amounts once.

Why invoicing needs one reproducible daily rate

The operational problem is consistency, not tick-level precision. If two invoices issued on the same calendar day for the same pair—say EUR/USD live rate—use different rates because one was generated at 08:12 and another at 16:47, month-end FX gain/loss, tax bases, and customer statements start to disagree. Controllers then reconcile noise that a single daily convention would have prevented.

An auditor or tax authority will ask four questions for each document: which rate was used, on which date, from which source, and how was it rounded? A billing system that can answer those questions is audit-ready. A system that re-queries a live feed when the PDF is regenerated is not.

What reproducible actually means

Given the invoice date (or contractual rate date), the currency pair, and a documented rounding policy, the converted amount must be deterministic. Markets move continuously; accounting needs a convention: one number per pair per day, frozen at a known instant. Live quotes still matter for cash movement; they should not rewrite yesterday's invoices.

Daily 9:00 UTC snapshot versus spot bid/ask

Two jobs get collapsed into "get an FX rate," and that collapse is where invoicing implementations go wrong. Billing needs a stable input. Payments need a tradable price.

Job 9:00 UTC daily snapshot Spot bid/ask
Invoicing and billing Preferred Avoid
General ledger and tax base Preferred Avoid
Customer statements Preferred Avoid
Payment execution Secondary (for comparison) Preferred
FX gain/loss versus cash Invoice side of the difference Settlement side of the difference

Spot bid/ask is the right tool when money is moving: paying a supplier, collecting from a customer, converting balances. The spread is the cost of execution. Putting a bid or an ask on an invoice mixes a trading price into a commercial document and makes the billed amount depend on which side of the market was quoted at a random millisecond. A daily snapshot taken at a fixed clock time is a convention; compared later to the execution rate, it makes FX gain or loss explicit instead of burying it in the invoice total.

How a 9:00 UTC daily snapshot serves the books

UTC is not anyone's local fiscal timezone, which is the point. 09:00 UTC does not drift with US or APAC daylight saving. It falls early in a European business day—09:00 London in winter, 10:00 UK time under BST—after the London cash open, so it can serve as today's rate for invoices issued later that day.

Finance teams typically choose one of three dating policies, then apply that date's snapshot:

  • Invoice-date rate — the snapshot for the calendar day the invoice is issued, common for SaaS and professional services.
  • Transaction-date rate — the snapshot for the goods or service date, often required for revenue recognition.
  • Contractual lock — a rate captured at order, then reused even if later invoices span many days.

The snapshot endpoint is the source; accounting policy chooses which date's snapshot is applied. Those are two different decisions and should not be collapsed into "whatever the API returns right now."

Rate dating and non-business days

Store two timestamps, not one. rate_date is the economic date the snapshot represents. observed_at is the instant of the snapshot itself, for example 2026-03-12T09:00:00Z. If a document is issued on a weekend or market holiday, policy should roll back to the last published snapshot. Rolling forward to Monday's 9:00 UTC would change Saturday invoices when Monday arrives—usually the wrong behaviour. Apply the same rollback to pairs such as GBP/USD live rate and USD/JPY live rate so regional calendars do not fork the books.

Rounding, precision, and storing the rate per document

FX conversion for invoices is a three-step pipeline: fetch the dated rate, multiply or divide the document amount by that rate, then round to the invoice currency's minor units (two decimals for USD, EUR, and GBP; zero for JPY; three for some GCC currencies). Keep the unrounded rate at full published precision, convert each monetary field once, and round the converted amount—not the rate—unless a contract specifies a rounded published rate.

Do not round the rate to four decimals before converting large amounts, round each line and then the total so they no longer match, or re-convert on reprint. Persist pair, rate, rate_date, observed_at, source, rounding mode, original amount, and converted amount.

A practical payload to store on the invoice

The billing record should look like a frozen snapshot of the decision, not a pointer to current mid:

{
  "invoice_id": "INV-2026-0312-00418",
  "invoice_date": "2026-03-12",
  "currency_from": "EUR",
  "currency_to": "USD",
  "amount_from": "12500.00",
  "fx": {
    "pair": "EURUSD",
    "rate": "1.084732",
    "rate_date": "2026-03-12",
    "observed_at": "2026-03-12T09:00:00Z",
    "source": "daily_snapshot_0900_utc",
    "rounding": "half_up",
    "minor_units": 2
  },
  "amount_to": "13559.15"
}

Credit notes, dunning PDFs, and tax exports should read the stored converted amount and rate. They should not call a live endpoint. If a later payment settles at a different spot, that difference is FX gain or loss on settlement—not a restatement of the invoice.

Wiring a daily rates API into billing versus payments

A clean integration splits the two consumers. The billing job loads the 9:00 UTC snapshot into a rates table keyed by pair and rate_date, then looks up by invoice date—never by "now." The payments or treasury job uses a separate live bid/ask quote at execution time. FX gain or loss is the difference between the invoiced converted amount and cash converted at the execution rate. Regenerated invoices must reuse the stored FX block; invoices that share a date and pair must resolve to the same snapshot row. If a snapshot is late, the billing run should wait or fail closed rather than fall back to a live tick.

FAQ

Should invoices use bid, ask, or a mid snapshot?

Invoices should use a documented daily snapshot, typically a mid taken at a fixed time such as 9:00 UTC. Bid and ask are execution prices; applying them to an invoice makes the billed amount depend on spread and timing instead of accounting policy.

What rate should be used on weekends and holidays?

Roll back to the last published 9:00 UTC snapshot and store that rate_date on the document. Waiting for the next business day's snapshot would change weekend invoices when markets reopen.

Why freeze the snapshot at 9:00 UTC instead of a local close?

UTC does not shift with regional daylight saving, so every entity in a group can share one rate date. 09:00 UTC is early enough in a European business day to serve as today's rate for invoices issued later that day.

If the daily rate can be re-fetched later, why store it on the document?

Sources, calendars, and rounding rules can change, and auditors need the rate that was actually applied. Storing the pair, rate, timestamps, source, and rounding mode keeps reprints, credit notes, and tax exports deterministic.

How should the difference between the invoice rate and the payment rate be treated?

Keep the invoice frozen at the daily snapshot and convert the cash settlement at the spot bid or ask used for execution. Book the difference as FX gain or loss; do not rewrite the original invoice amount.

Ready to pin invoicing to a dated daily snapshot and keep live bid/ask for payments? Compare API access on the Live-Rates plans page and start storing an audit-ready rate on every document.

Real-time forex rates for your app

Live bid/ask for the pairs you need, updated every second, with a simple JSON & XML API. Try it free for 7 days.