会計ソフト向け為替レートAPI
仕訳、レポート、月末評価替えに現在または過去の為替レートを使えます。換算額と一緒に、レート、日付、出典、繰越フラグを保存します。

会計イベントごとに1つのレートを使う
請求、入金、月末締めは別の日に起きます。すべてを今日のレートで計算し直してはいけません。会計方針で決めた日付のレートを取得し、その日付を仕訳に保存します。7月15日付の2,400 EURの請求書は、10月にレポートを開いても同じUSD計上額を示す必要があります。
現在のレートは、今の市場を反映するダッシュボードや概算に向いています。過去の取引には過去レートのエンドポイントを使います。指定日が週末や祝日なら、直前に公表された値が返り、is_forward_filledが付きます。会社のルールに合わせて、その値を採用、表示、または拒否できます。
金額と一緒に根拠を保存する
元の通貨と金額を残します。さらに、レポート通貨、換算額、丸めていないレート、指定日、観測時刻を示すdata_updated_at、source、is_forward_filledを保存します。換算後の金額だけでは足りません。これらがないと、過去のレポートと今日の計算結果が違う理由を経理担当者が説明できません。
金額には適切な10進数型を使い、通貨の小数桁に合わせて金額を丸めます。レート自体は全桁を保存します。レートを先に丸めると、小さな差が何千行にも積み重なり、後の照合で初めて問題になります。
月末に未決済残高を評価替えする
外貨建ての売掛金、買掛金、現金残高は、締め日に評価替えすることがあります。その日付のレート一式を1回取得し、処理全体で同じ値を使います。レポートを再現できるように、処理IDまたは締め日も結果と一緒に保存します。
元の取引額を上書きしません。評価替えの調整は別の記録として残します。請求書が支払われたら、帳簿価額と実際の決済額を比較します。これで、当初の価額、期末調整、支払結果を分けて確認できます。
データはAPI、採用レートは会計方針が決める
exchangerate.devのレートは、参照、分析、レポート向けの参考値です。会社の会計方針を決めるものでも、公式な記帳原始資料でもありません。使える日付と出典は、会社、監査人、契約、または地域の規則が決めます。
そのルールをソフトウェアに書き込みます。取引日か計上日か、休日をどう扱うか、月末にどの出典を使うかを明確にします。ルールが決まれば、APIで同じ処理を毎回行い、後の確認に必要な情報を残せます。
過去レートで仕訳を保存する
APIキーはサーバー側に置きます。この例では、計算結果と一緒に為替レートと出典情報を保存します。
import Decimal from 'decimal.js';
type HistoricalRates = {
date: string;
rates: Record<string, number>;
source: 'live' | 'ecb_daily' | 'market_daily';
data_updated_at: string;
is_forward_filled: boolean;
derived_symbols: string[];
};
const entry = {
id: 'inv_1048',
accountingDate: '2026-07-15',
currency: 'EUR',
amount: '2400.00',
} as const;
const response = await fetch(
`https://api.exchangerate.dev/v1/${entry.accountingDate}/${entry.currency}?symbols=USD`,
{ headers: { Authorization: `Bearer ${process.env.EXR_API_KEY}` } },
);
if (!response.ok) throw new Error('Could not load the accounting-date FX rate');
const fx = (await response.json()) as HistoricalRates;
const rawRate = fx.rates.USD;
if (!Number.isFinite(rawRate)) throw new Error('Missing EUR/USD rate');
// Decimal arithmetic avoids binary floating-point errors in booked money.
const rate = new Decimal(String(rawRate));
const reportingAmount = new Decimal(entry.amount)
.mul(rate)
.toDecimalPlaces(2, Decimal.ROUND_HALF_UP)
.toFixed(2);
await saveLedgerFx({
entry_id: entry.id,
original_currency: entry.currency,
original_amount: entry.amount,
reporting_currency: 'USD',
reporting_amount: reportingAmount,
fx_rate: rate.toString(),
fx_requested_date: fx.date,
fx_source: fx.source,
fx_observed_at: fx.data_updated_at,
fx_is_forward_filled: fx.is_forward_filled,
});APIを試してみますか?
クイックスタートを読み、レスポンス項目を確認してください。アカウントの利用枠が必要になったら料金も確認できます。
Freeは評価および社内の非商用利用向けです。BasicとProは商用利用に対応します。
無料の評価用キーを作成 →