毎日のデータ取得をスケジュールする

リクエストを、ファイルに追記する小さなスクリプトに入れ、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 レートが残ります。

  1. キーを環境ファイルに置く 無料キーを取得し、~/.narwhal.env に export NARWHAL_API_KEY=... を記述します。自分だけが読めるようファイルのモードを 600 にしてください。スケジュールされたコマンドは、Python を起動する前にこのファイルを読み込みます。
  2. 毎日の取得スクリプトを保存する /home/me/daily_pull.py として保存してください。daily.csv が新規のときは列名を書き込み、リクエストが成功した後に run_at_utc、xau_usd、usd_idr の行を追記します。
    Python:金と USD/IDR を CSV に追記
    #!/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"],
            ]
        )
  3. 毎日の cron エントリを追加する UTC のサーバーでは、この crontab エントリで UTC の午前0時過ぎに取得を実行します。キーは環境ファイルから読み込み、スクリプトの出力とエラーは /home/me/daily_pull.log に書き出します。
    UTC サーバーでの毎日の cron エントリ
    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 では、取得時刻が最初に来て、その後にヘッダーで決めた順に金価格と為替レートが続きます。

2026年10月24日の CSV の行
run_at_utc,xau_usd,usd_idr
2026-10-24T12:17:15Z,3996.00,18107.8

公開。

次のステップ