
数週間おきに、r/algotradingやr/optionsで誰かが同じ趣旨の質問をする。金価格用のWebSocketはあるのか、それとも毎秒RESTエンドポイントをポーリングし続けるしかないのか、という質問だ。質問する人はたいてい、価格が動いた瞬間にそれを検知する必要があるボットや、リアルタイムのXAUティッカーを表示するダッシュボードを作っていて、1秒ループでREST APIを叩き続けることに違和感を覚えている。その違和感は正しい。ポーリングはリクエスト枠を消費し、平均レイテンシとしてポーリング間隔の半分を上乗せしてしまい、それでも二回のリクエストの間に発生したティックは取りこぼす。
手短に答えるなら、イエスだ。goldprice.devは金・銀・銅のティックを、値が付いたその瞬間にWebSocket経由でプッシュしている。より長い答えは、そもそもどのAPIがストリーミングを提供しているのかという話だ。専業の金価格APIの大半はそれを提供していない。両方を以下で説明する。
このストリームの中身
wss://api.goldprice.dev/v1/streamは、Plusプランで使えるWebSocketだ。接続し、キーで認証し、欲しいシンボルを購読すれば、価格が更新されるたびにサーバーがフレームを送ってくる。金(XAU-USD-SPOT)・銀(XAG-USD-SPOT)・銅(HG-USD-SPOT)はライブ配信に対応する。PlusはSSEまたはWebSocketを1本、Proは各5本とディーラー価格配信を利用できる。
ティックは次のような形をしている。
{"type":"tick","symbol":"XAU-USD-SPOT","price":"3976.379","conf":"0.829","computed_at":"2026-07-01T02:13:25Z"}priceは10進数の文字列なので、浮動小数点の丸め誤差を引き継がずにパースできる。confは選択されたソースが提供する場合だけ含まれる信頼区間であり、クライアントは省略される場合にも対応する必要がある。computed_atはサーバー側でその値が計算された時刻で、自分自身のエンドツーエンドのレイテンシを測る基準として使うものだ。
ハンドシェイク
3つのメッセージでストリーミングが始まる:接続、認証、購読だ。
import WebSocket from "ws";const ws = new WebSocket("wss://api.goldprice.dev/v1/stream");ws.on("open", () => { ws.send(JSON.stringify({ action: "auth", api_key: process.env.GOLDPRICE_API_KEY }));});ws.on("message", (raw) => { const msg = JSON.parse(raw); if (msg.type === "welcome") { // 認証完了。次に欲しいものを伝える。 ws.send(JSON.stringify({ action: "subscribe", symbols: ["XAU-USD-SPOT", "XAG-USD-SPOT", "HG-USD-SPOT"] })); } else if (msg.type === "tick") { console.log(`${msg.computed_at} ${msg.symbol} ${msg.price}`); }});ws.on("close", (code) => { // 4401 キーが不正または未指定、4403 プランがPlus未満、4429 接続数の上限超過。 console.error("stream closed", code);});接続すると、サーバーは自分のプラン階層とシンボル上限を含んだwelcomeフレームを送ってくる。購読するとsubscribedという確認応答が返り、加えて各シンボルの直近の既知価格の即時スナップショットも一緒に返ってくるので、次のティックが届くまでの間、空欄ではなく何かしら描画できるものが手元にある状態になる。市場が静かなときや週末など、およそ20秒間何も流れてこない場合は、{"type":"heartbeat"}が送られてくるので、接続がハングしているのではなく生きていることが分かる。
再接続は自分で処理する必要がある。ソケットが切断されたら、新しいソケットを開き、authとsubscribeを送り直す。ここが多くの人が見落とす一点だ。再接続はしても再購読を忘れてしまい、なぜティックが来ないのかと首をかしげることになる。
実際にWebSocketを提供している他のAPI
これははっきりさせておく価値がある。「リアルタイム金価格API」という言葉はかなり緩く使われていて、検索結果の多くは、ストリームではなく更新間隔が短いだけのポーリングだからだ。2026年半ば時点で、よく名前が挙がるサービスの公開ドキュメントを一通り確認した。すると二つのグループに分かれた。
貴金属専業のAPIはほぼすべてREST限定だ。GoldAPI.io、MetalpriceAPI、Metals.devは、どのプラン階層にもWebSocketがなく、一定間隔でポーリングするしかない。Metals-APIは一応WebSocketを掲載しているが、それは年額$25,000程度から始まるカスタムのEnterprise契約の中だけの話で、公開されたストリーミングのドキュメントもないため、普通のプロジェクトにとっては実質的に選択肢に入らない。Alpha Vantageは貴金属よりはるかに広い範囲をカバーしているが、最上位プランであっても依然としてREST限定だ。
実際に金をストリーミング配信しているAPIは、幅広いマーケットデータを扱う大型プラットフォームだ。そこでは金は数万あるシンボルの一つに過ぎず、ストリーミングはより上位のプランの向こう側にある。
| API | WebSocket | WebSocket上の金 | ストリーミングの入口 |
|---|---|---|---|
| goldprice.dev | あり | あり(XAU・XAG・HG) | Plus、$39/月 |
| Twelve Data | あり | あり(XAU/USDは公式ドキュメントの例に使われている) | 実際のストリーミング枠には年払いProの約$191/月が必要 |
| TraderMade | あり | あり(XAU/USD) | 有料プラン、約£599/月から |
| Finage | あり | あり(XAU/USD、forex/CFDフィード経由) | 有料WebSocket、約$299/月から |
| Polygon.io(現Massive) | あり | forexペアのみ、XAUの対応はドキュメント上不明確 | 有料のcurrenciesプラン |
| Finnhub | あり(無料プランに含まれる) | ブローカー系forex、XAUは明確にドキュメント化されていない | 無料、最大50シンボルまで |
| GoldAPI.io | なし | — | RESTポーリングのみ |
| MetalpriceAPI | なし | — | RESTポーリングのみ |
| Metals.dev | なし | — | RESTポーリングのみ |
| Metals-API | Enterpriseのみ | 未文書化 | 年額$25,000程度のカスタム契約 |
| Alpha Vantage | なし | — | RESTポーリングのみ |
(2026年半ば時点の公開ドキュメントに基づく。競合の価格や対応範囲は変わりうるので、選定前に必ず最新のページを確認してほしい。)
この表が示しているのは一つの空白地帯だ。WebSocket経由で金を取得したいなら、選択肢はこれまでほぼ、金がforexのついでのような扱いを受け、ストリーミングが月額$200近くから始まる大型マルチアセットプラットフォームか、ポーリングを強いてくる貴金属専業APIのどちらかしかなかった。goldprice.devは貴金属を主軸に据えたAPIであり、$39で金・銀・銅をストリーミング配信する。
ストリームが不要な場合
WebSocketが真価を発揮するのは、接続を張りっぱなしにして、秒未満単位の値動きを気にする場面だ。リアルタイムティッカー、約定執行画面、ある閾値を監視するボットなどがそれにあたる。数分おきに価格をチェックするだけのジョブであれば、/v1/spot/XAU-USD-SPOTにある普通のRESTエンドポイントのほうがシンプルで、ソケットを維持する必要もない。SSEを使うなら、PlusとProで/v1/prices/streamを利用できる。Server-Sent Eventsでリアルタイムの金価格をストリーミングするで、WebSocketクライアントなしの接続方法を解説している。
このAPIを使う価値があるかどうか、まだ検討中だろうか。Reddit上の金価格APIに関する開発者の質問、一挙回答では、無料プラン、制限、そしてこの数字がどこから来ているのかを扱っている。始めるだけなら、無料キーの取得は1分もかからない。WebSocket自体はPlusプランにある。
リアルタイムの金価格、ヒストリカルOHLC、マルチソース集計,REST・SSE経由で提供。