Candles stream

Session-aware OHLCV from one second to one day, corporate-action adjusted.

RobinhoodRPC nativerhrpc.v1.Tape/StreamCandles

What it carries

Candles built from the consolidated tape rather than a single venue. Any candle spanning a market-session boundary is flagged, and candles containing a corporate action are restated onto the post-action multiplier with the responsible action id attached.

Key fields

FieldTypeDescription
intervalenum1s, 5s, 1m, 5m, 15m, 1h, 4h, 1d.
open / high / low / closedecimal stringCorporate-action adjusted.
vwapdecimal stringVolume-weighted average price.
crosses_session_boundaryboolTrue when this candle spans more than one session.Every OHLCV series published on this chain today silently mixes regimes. Filter on this.
corporate_action_adjustedboolOHLC restated; adjusting_action_id names why.

Delivery semantics

Aggregation happens within a session, not across it. VWAP computed across a session boundary is not a meaningful number and we do not produce one silently.

Volume: One message per interval per instrument. Every record carries a dedup_key and a monotonic sequence, so at-least-once delivery is deterministic to deduplicate.

Server-side filters

  • token_symbols
  • interval
  • block range
  • exclude_session_crossing

Filters are evaluated before bytes leave us, so a narrow subscription costs you nothing in bandwidth or parse time.

Subscribe

import { RobinhoodRPC } from "@robinhoodrpc/sdk"; const client = new RobinhoodRPC({ apiKey: process.env.RHRPC_KEY! }); // Backfill then live: omit toBlock to tail indefinitely.for await (const msg of client.candles.stream({  fromBlock: 4_200_000,})) {  handle(msg);}

Sample message

{  "token_symbol": "AAPL",  "interval": "INTERVAL_1M",  "open_time": "2026-08-27T14:22:00Z",  "open": "231.1900",  "high": "231.6200",  "low": "231.0400",  "close": "231.4400",  "volume_usd": "884120.55",  "vwap": "231.3812",  "session": "SESSION_REGULAR",  "crosses_session_boundary": false,  "corporate_action_adjusted": false}

Correctness notes

Prices in this stream are already multiplier-adjusted where the field says so. Robinhood’s own REST endpoint returns raw underlying values and Chainlink’s feed returns multiplier-adjusted ones; mixing them without applying the multiplier — or applying it twice — is the most common source of silent error on this chain.

The full set of rules is published at /docs/equities/correctness-rules.

Related streams