Dedicated BTC price
A clean, low-overhead BTC last-trade price ticker.
A single-purpose ticker for the most common ask: the current BTC price, from last trades on the BTC perp. Minimal payload, minimal bandwidth. The right surface for bots and dashboards that just need a number that moves.
- Method
- hyperliquid_btc_price.v1.BtcPriceStreaming/StreamBtcPrices
- Endpoint
- stream.hyperliquidrpc.com:443 · gRPC over TLS (HTTP/2)
- Auth
- API key in x-api-key metadata
- Volume
- Tiny: a few messages per second at most. Available on every tier including Free.
When to use it
Most integrations start with one question: what is BTC trading at, right now? This stream answers exactly that and nothing else: the last-trade price from the BTC perp, as a byte-exact decimal string, a few messages per second at most. Bots that gate on price levels, dashboards that show a number, alerting scripts: this is their feed.
The moment you need size, side, wallets, or other markets, step up to the trades stream or an L2 top-of-book subscription. Same endpoint, same key.
Method
// stream.hyperliquidrpc.com:443 — gRPC over TLS (HTTP/2)// auth: API key in x-api-key metadata · server reflection enabledpackage hyperliquid_btc_price.v1; service BtcPriceStreaming { // One message per BTC last-trade price change. rpc StreamBtcPrices (BtcPriceRequest) returns (stream BtcPrice);}The request takes no parameters worth tuning; the stream is pre-filtered to BTC by design.
Subscribe
# Streams JSON-encoded messages until you disconnect.grpcurl -H 'x-api-key: YOUR_KEY' \ -d '{}' \ stream.hyperliquidrpc.com:443 \ hyperliquid_btc_price.v1.BtcPriceStreaming/StreamBtcPricesAvailable on every tier, including Free. It is the recommended first subscription for verifying your key and client setup end-to-end.
Message fields
Fields typed string that carry numbers are byte-exact decimal strings, verbatim from the node. Compare and store them as strings or arbitrary-precision decimals. Never parseFloat a price you intend to reconcile.
Server-side filters
- none (the stream is pre-filtered to BTC by design)
Filters are applied on the server, so filtered-out messages never leave our edge. You only pay for what you subscribe to. Request shapes for every stream family are on Filtering; backfill semantics on Replay & backfill.
Semantics & gotchas
Pure ticker: one message per BTC last-trade price change, no snapshot phase.
- It is a last-trade price, not a mid or mark. The number moves when a trade prints. For a quote-derived mid, use the L2 book with
n_levels: 1; for the mark price, see liquidation events. - Messages arrive on trades, not on a clock. Quiet markets mean quiet streams. If your consumer needs a heartbeat, treat the connection state as liveness, not message arrival.
- px is still a decimal string. Even a ticker deserves exactness: compare as
Decimal, render as received.
Sample message
{ "px": "67012.0", "block_height": 612408133, "time": "2026-06-09T08:14:02.418Z"}Tiny: a few messages per second at most. Available on every tier including Free.
Recipes
Verify your setup in one command
The fastest end-to-end test of a new API key: prices should print within seconds.
grpcurl -H 'x-api-key: YOUR_KEY' -d '{}' \ stream.hyperliquidrpc.com:443 \ hyperliquid_btc_price.v1.BtcPriceStreaming/StreamBtcPricesPrice-level alert
A complete alerting script is a dozen lines. Compare as decimals so thresholds behave at every magnitude.
from decimal import Decimal THRESHOLD = Decimal("70000") for msg in stub.StreamBtcPrices(request, metadata=meta): if Decimal(msg.px) >= THRESHOLD: notify(f"BTC at {msg.px} (block {msg.block_height})") break