2026年10月10日(土)付の請求書には、2026年10月9日(金)の EUR/USD レート 1.1206 を使います。EUR 12,500 は USD 14,007.50 に換算されます。週末にはレートがないため、過去 7 日分をリクエストし、請求書の日付以前の最後の行を採用します。
APIを使う方法
- APIキーを設定 無料キーを取得し、環境変数
NARWHAL_API_KEYに保存します。スクリプトはこの変数を読み取り、Authorization: Bearer YOUR_KEYヘッダーでキーを送信します。Narwhal の REST API と MCP では同じキーを使えます。ここでのリクエストは REST API に送ります。 - 請求書の日付とその前の数日分をリクエストする
GET /v1/fx/rates/EUR/observationsにcurrencies=USD、start_date、end_dateを付けて使います。スクリプトと同じく、終了日を請求書の日付にし、開始日はそこから 7 日引いた日にします。この範囲なら、請求書が週末や祝日にあたる場合でも、レートのある前の日がレスポンスに含まれます。 - 最後の観測値を読み取る 請求書の日付、基準通貨、相手通貨を指定して Python スクリプトを実行します。関数は
observationsの最後の行を取り、その日付とレートの両方を返します。この 2 つはセットで保管してください。請求書の日付は調べたい日付で、返された日付は換算に使った観測値の日付です。import os from datetime import date, timedelta import requests def rate_on(invoice: date, base: str, quote: str) -> tuple[str, float]: """The rate for the invoice date, or for the last day with a rate before it (weekends, holidays).""" start = invoice - timedelta(days=7) r = requests.get( f"https://api.narwhalapi.com/v1/fx/rates/{base}/observations", params={ "currencies": quote, "start_date": start.isoformat(), "end_date": invoice.isoformat(), "limit": 100, }, headers={"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"}, timeout=10, ) r.raise_for_status() last = r.json()["observations"][-1] return last["date"], float(last["rates"][0]["rate"]) day, rate = rate_on(date(2026, 10, 10), "EUR", "USD") # 10 October 2026 is a Saturday print(day, rate, "-> EUR 12,500 =", round(12500 * rate, 2), "USD") - 請求額にレートを掛ける 返されたレートで請求額を換算します。2026年10月10日付の請求書では、スクリプトは 2026年10月9日とレート 1.1206 を返します。出力は観測日と換算後の金額を並べて表示します。請求書が何百枚もある場合は、7 日間のウィンドウをキャッシュしてスクリプトを使います。
スプレッドシートまたはコードを使わずに計算する
数枚の請求書なら、取得したレートのシートを使い、日付の列とレートの列を用意します。検索を使う前に、日付を昇順に並べ替えてください。請求書の日付を A2 に入れ、数式では対応する列に dates と rates を使います。
=LOOKUP(A2, dates, rates)近似一致は、A2 以前で最も新しい日付のレートを返します。そのため、土曜日の請求書には、週末用の別の数式なしで、レートのある前の日が使われます。返されたレートを請求額に掛けますが、レートは必要な通貨の向きのものを使ってください。シートの方法もスクリプトと同じ規則で、請求書の日付までで最後に得られる観測値を選びます。この週末と祝日の扱いは、会計方針に明記しておいてください。
状況に応じた方法の選び方
| 状況 | 適した方法 | 理由 |
|---|---|---|
| 数枚の請求書 | 取得したレートのシートで検索する | 日付の近似一致で週末を処理する |
| 何百枚もの請求書 | 7 日間のウィンドウをキャッシュするスクリプト | 全請求書に日付検索を使う |
| 法定レート | 当局が公表するレート | Narwhal が提供するのは市場の日次観測レートです |
どのレートを税務当局や監査人が認めるかは、会計方針に含まれます。方針によっては、請求書の日付、支払日、月平均、中央銀行のレートが求められます。日付検索を使う前に、どれが当てはまるかを確認してください。Narwhal が提供するのは市場の日次観測レートです。方針が法定レートを求める場合は、当局が公表するレートを使ってください。ここでの請求書日付による計算は、方針がその日付とこれらの市場観測値を求める場合に当てはまります。
通貨ペアの向きはどちらでリクエストすればよいですか?
請求書の通貨を基準通貨、換算したい通貨を相手通貨としてリクエストします。EUR 建ての請求書を USD に換算する場合は、EUR を基準通貨、USD を相手通貨にします。返されるレートは EUR 1 あたりの USD なので、EUR の請求額にそのレートを掛けます。
基準通貨は observations エンドポイントのパスに入り、相手通貨は currencies パラメーターに指定します。Python の呼び出しでは、請求書の日付の後ろに置く基準通貨と相手通貨の引数が、この同じ選択にあたります。シートにレートを入れるときもこの向きを保てば、EUR の請求書の検索結果が EUR 1 あたりの USD になります。
請求書の日付に convert エンドポイントを使えますか?
過去の請求書の日付には observations を使ってください。convert エンドポイントには日付パラメーターがないためです。GET /v1/fx/convert?from=EUR&to=USD&amount=12500 は現在のレートでしか換算しません。請求書の日付に適用されていた観測値は選びません。日付のある請求書では、observations の範囲をリクエストし、その日付以前の最後のレートを金額に掛けてください。
レスポンスが、指定した日付より後から始まるのはなぜですか?
請求書の日付で照会する場合、範囲には請求書の日付に加え、その日にレートがないときのための、より前の観測値を含める必要があります。すべてのアカウントで全履歴を取得できます。
エラーはapplication/problem+json形式で、status、code、detail、request_idを含みます。リクエストが失敗したときは、エラーの詳細を確認してください。
実例:2026年10月10日付の EUR 12,500 の請求書
請求書の日付 2026年10月10日(土)と金額 EUR 12,500 から始めます。その日付までの 7 日間をリクエストします。請求書は週末にあたるため、その前の最後の観測値である 2026年10月9日(金)を採用します。この日の EUR/USD レートは EUR 1 あたり USD 1.1206 です。
2026年10月9日のレートで EUR 12,500 に 1.1206 を掛けると、2026年10月10日付の請求書は USD 14,007.50 になります。スクリプトは観測日を 2026-10-09、換算後の金額を 14007.5 USD と表示します。
| 手順 | 値 |
|---|---|
| 請求書の日付 | 2026年10月10日、土曜日 |
| 観測日 | 2026年10月9日、金曜日 |
| 2026年10月9日の EUR/USD レート | EUR 1 あたり USD 1.1206 |
| 2026年10月10日付の請求書を換算する | 結果:EUR 12,500 × 1.1206 = USD 14,007.50 |
公開。