リクエストを、ファイルに追記する小さなスクリプトに入れ、cronで1日1回実行します。金とUSD/IDRを毎日取得すると、1日2リクエスト、月に約62リクエストです。日次の値には00:00 UTCのタイムスタンプが付くため、UTCの午前0時を過ぎてから実行してください。
API でデータ取得を定期実行する
金のリクエストと為替レートのリクエストには、同じ Narwhal API キーを使います。スクリプトは各リクエストを Authorization: Bearer YOUR_KEY ヘッダー付きで https://api.narwhalapi.com に送り、返ってきた値を daily.csv に追記します。このファイルには、取得時刻と、USD 建ての金価格、USD/IDR レートが残ります。
- キーを環境ファイルに置く 無料キーを取得し、
~/.narwhal.envにexport NARWHAL_API_KEY=...を記述します。自分だけが読めるようファイルのモードを600にしてください。スケジュールされたコマンドは、Python を起動する前にこのファイルを読み込みます。 - 毎日の取得スクリプトを保存する
/home/me/daily_pull.pyとして保存してください。daily.csvが新規のときは列名を書き込み、リクエストが成功した後にrun_at_utc、xau_usd、usd_idrの行を追記します。#!/usr/bin/env python3 """Append today's gold price and USD/IDR rate to daily.csv. Run it once a day.""" import csv, os, pathlib from datetime import datetime, timezone import requests API = "https://api.narwhalapi.com/v1" H = {"Authorization": f"Bearer {os.environ['NARWHAL_API_KEY']}"} gold = requests.get(f"{API}/commodities/spot/XAU/USD", headers=H, timeout=10) fx = requests.get( f"{API}/fx/rates/USD", params={"currencies": "IDR"}, headers=H, timeout=10 ) gold.raise_for_status() # a failed run exits non-zero, so cron mail or your monitor sees it fx.raise_for_status() path = pathlib.Path("daily.csv") new = not path.exists() with path.open("a", newline="") as f: w = csv.writer(f) if new: w.writerow(["run_at_utc", "xau_usd", "usd_idr"]) w.writerow( [ datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), gold.json()["price"], fx.json()["rates"][0]["rate"], ] ) - 毎日の cron エントリを追加する UTC のサーバーでは、この crontab エントリで UTC の午前0時過ぎに取得を実行します。キーは環境ファイルから読み込み、スクリプトの出力とエラーは
/home/me/daily_pull.logに書き出します。15 1 * * * . $HOME/.narwhal.env && /usr/bin/python3 /home/me/daily_pull.py >> /home/me/daily_pull.log 2>&1
各リクエストのタイムアウトは 10 秒です。スクリプトは、レスポンスの price フィールドから金価格を、rates 内の rate フィールドから USD/IDR を読み取り、両方の値を同じ行に書き込みます。以降の実行ではファイルに追記し、列ヘッダーはファイルが新規のときだけ書き込みます。
crontabには環境ファイルのパスだけを書き、キーはNARWHAL_API_KEYに残します。Narwhalは、データAPI全体で1つのアカウント、1つのAPIキー、1つのクレジット残高を使うため、スケジュールした金と為替のリクエストはその残高から引かれます。レスポンスには、レート制限の残りを示すX-RateLimit-Remainingが含まれます。
run_at_utc列には、スクリプトが行を書き込んだ時刻が記録されます。取得した時刻として読んでください。日次の値には00:00 UTCのタイムスタンプが付くため、ファイルへの追記をUTCの午前0時以降にスケジュールすれば、日次ジョブがデータと同じ時間基準になります。
コードなしでフローを定期実行する
毎日のフローは、n8n の Schedule Trigger、Make の「Schedule」、Zapier の「Schedule by Zapier」から始められます。結果の保存には Google Sheets の行追加を使います。スクリプトの CSV ファイルの代わりに、スプレッドシートに値を残したいときの保存先になります。
スケジュールトリガーが毎日フローを開始し、行の追加がその取得結果を保存します。日次の値には00:00 UTCのタイムスタンプが付くため、タイミングはUTCに合わせてください。スケジュール実行のフローはスクリプトと同じ日次のタイミングに従い、スケジューラーと保存はフロー内で処理されます。
スクリプトをスケジュール実行する場合、ほかの選択肢には Windows のタスクスケジューラ、macOS の launchd、クラウドのスケジューラがあります。毎日の処理は、金のリクエストと USD/IDR のリクエストのままです。スクリプトを動かす場所に合うスケジューラを選ぶか、サーバーがない場合はスケジュール実行のフローを使ってください。
状況に応じた方法の選び方
| 状況 | 適した方法 | 理由 |
|---|---|---|
| 常時稼働のサーバーまたはノートパソコン | cron | そのマシンで毎日のスクリプトを実行する |
| サーバーなし | スケジュール実行の n8n、Make、Zapier | 毎日のフローを開始し、結果を Google Sheets に追記する |
| データは時間ではなくイベントで変わる | Webhook | イベントベースの方法でデータを受け取る |
cron はどのタイムゾーンで動きますか?
cron はサーバーのタイムゾーンで動きます。date でサーバーの時刻を確認し、データに合わせるには UTC を使ってください。この crontab エントリは UTC のサーバーを前提としており、午前0時過ぎという実行タイミングもそのタイムゾーンに依存します。
為替の日次レートには00:00 UTCのタイムスタンプが付きます。このタイムスタンプとスクリプトのrun_at_utc列は別の時刻を示します。日次レートにはデータのタイムスタンプがあり、CSVには取得した時刻が記録されます。コモディティと為替の価格はライブなので、各行にはスクリプトを実行した時点の価格が入ります。
毎日の実行が失敗したら?
リクエストが失敗するとスクリプトは0以外のコードで終了し、何も追記されません。daily.csv を開いて行を追記するのは、2つのリクエストがどちらも成功した後です。そのため、リクエストが失敗した回は、ファイルにその回の行が残りません。
cron のメールや監視ツールで、0以外の終了コードを検知できます。アラートを追加するか、失敗後にスクリプトを再実行してください。コモディティ価格アラートは、関連するアラートのチュートリアルです。cron エントリは、出力とエラーをコマンドに書かれたログファイルにも書き出します。
リクエスト制限のエラーでは、Retry-After を含む 429 rate_limit_exceeded と、クレジットを追加するまで待つ 402 insufficient_credits を区別してください。スケジュール実行での扱いは、キャッシュと 429 の処理を参照してください。エラーレスポンスは application/problem+json で、status、code、detail、request_id を含みます。
計算例:1か月分の毎日の取得
毎日の取得ごとに、金のリクエストと USD/IDR のリクエストを数え、その月の日数を掛けます。1日2リクエストで31日なら、スクリプトは62回呼び出し、1,000回あたり $2 で約 $0.12 になります。
| 計算 | 結果 |
|---|---|
| 金のリクエスト + USD/IDR のリクエスト | 1日2リクエスト |
| 2リクエスト × 31日 | 62リクエスト |
| 62 × $2 ÷ 1,000 | 約 $0.12 |
2026年10月24日、取得時刻が 2026-10-24T12:17:15Z の行では、金が 3996.00 USD、USD/IDR が 18107.8 です。CSV では、取得時刻が最初に来て、その後にヘッダーで決めた順に金価格と為替レートが続きます。
run_at_utc,xau_usd,usd_idr
2026-10-24T12:17:15Z,3996.00,18107.8公開。