価格ストリームリファレンス
1つのWebSocket接続で商品スポット価格とFXレートを配信し、購読対象ごとの初回価格と価格変更時の更新を送信
アクセスと制限
価格ストリームはBasicとProのプランで利用できます。 Freeプランのキーにはplan_upgrade_requiredが返され、接続が閉じられます。
価格、イベント、予測の各ストリームには共通の同時接続数の上限があり、Freeは1、Basicは2、Proは10です。各接続は月間割り当ての1回分を消費します。
接続
APIキーをAuthorization: Bearerヘッダーに設定し、wss://api.narwhalapi.com/v1/prices/streamに接続します。
ブラウザーはWebSocket接続にそのヘッダーを設定できません。サーバーからPOST /v1/prices/stream-ticketを送信し、返されたチケットを?ticket=に指定して接続します。チケットは1回だけ使用でき、30秒後に期限切れとなり、許可されたオリジンが必要です。 予測ストリームにも同じチケットの規則が適用されます。
購読
サーバーは{"type":"ready"}を送信します。5秒以内に購読メッセージを1件送信してください:
{
"action": "subscribe",
"commodities": [
{
"commodity": "XAU",
"currency": "USD"
}
],
"fx": [
{
"base": "USD",
"currencies": [
"EUR",
"JPY"
]
}
]
}commodities:GET /v1/commodities/spot/{commodity}/{currency}でサポートされる商品と通貨のペアを最大20件指定できます。fx: 基準通貨を最大5件指定できます。currenciesは省略可能です。省略するとその基準通貨で提供されるすべての通貨を受信し、指定する場合は最大64通貨を列挙できます。
サーバーは{"type":"subscribed"}を返し、購読した各価格を1回ずつ送信します。その後は価格が変わった場合にのみ送信します。価格は約1秒ごとに確認されます。
購読内容を変更するには再接続してください。2件目の購読メッセージを送信すると、resubscribe_requiredで接続が閉じられます。
メッセージ
価格メッセージの本文はRESTエンドポイントと同じで、小数の桁数、フォールバック、古いデータを示すフラグも同じです。
| メッセージ | 内容または送信頻度 |
|---|---|
ready | 接続開始時に送信されます。5秒以内に購読してください。 |
subscribed | 購読が受け付けられました。 |
commodity | spotにはGET /v1/commodities/spot/{commodity}/{currency}のレスポンス本文が入ります。 |
fx | rateには、GET /v1/fx/rates/{base}のratesの1項目と、baseおよびmarket_sessionが入ります。 |
heartbeat | as_ofを含めて30秒ごとに送信されます。 |
pong | {"action":"ping"}への応答です。 |
error | エラーのcodeを含み、その後接続が閉じられます。 |
{
"type": "commodity",
"spot": {
"symbol": "XAU-USD",
"price": "4195.86",
"currency": "USD",
"unit": "troy_ounce",
"timestamp": "2026-10-11T06:25:00Z",
"stale": false
}
}{
"type": "fx",
"base": "USD",
"market_session": "open",
"rate": {
"currency": "EUR",
"rate": "0.8924",
"timestamp": "2026-10-09T00:00:00Z",
"stale": false
}
}接続を維持する
{"action":"ping"}を送信すると{"type":"pong"}が返されます。サーバーは30秒ごとにheartbeatも送信します。メッセージは速やかに読み取ってください。読み取りが5秒間止まったクライアントはslow_consumerで切断されます。
1接続あたり最大30フレームを送信できます。再接続すると購読した各価格が再送信されますが、受信できなかった変更は再送されません。
エラー
エラーは{"type":"error","code":"..."}として届き、その後接続が閉じられます。
| コード | 意味 |
|---|---|
unauthorized | APIキーまたはチケットがないか、無効です。 |
plan_upgrade_required | このストリームにはBasicまたはProプランが必要です。 |
stream_limit | プランのストリーム同時接続数の上限に達しました。 |
quota_unavailable | 月間割り当てを使い切ったか、確認できません。 |
subscribe_required | readyメッセージから5秒以内に購読メッセージを受信しませんでした。 |
resubscribe_required | 2件目の購読メッセージが送信されました。購読内容を変更するには再接続してください。 |
invalid_command | メッセージは購読アクションでもpingアクションでもありません。 |
invalid_frame | メッセージのJSONが無効か、購読の上限を超えています。 |
commodity_not_supported | 購読メッセージ内の商品は提供されていません。 |
currency_not_supported | 購読メッセージ内の通貨は提供されていません。 |
revoked | APIキーが取り消されたか、接続リースが失われました。 |
slow_consumer | クライアントが5秒間メッセージを読み取りませんでした。 |
command_limit | クライアントが1つの接続で30フレームを超えて送信しました。 |
unavailable | ストリームは一時的に利用できません。後で再接続してください。 |
ドキュメント