Consolidated tape stream

Every print across every venue, normalized and monotonically sequenced.

RobinhoodRPC nativerhrpc.v1.Tape/StreamTape

What it carries

One ordered stream of every trade on Robinhood Chain — Uniswap, Rialto, Lighter, Arcus, Morpho liquidations and RFQ fills — normalized into a single record type. Each print carries price in both token and underlying-share terms, the multiplier that converts between them, the market session, and the premium against the underlying snapshotted at execution.

Key fields

FieldTypeDescription
tape_sequenceuint64Monotonic across the whole tape.Two consumers replaying the same range get identical order. This is what makes it a tape rather than a feed.
venueenumWhich venue printed it.
pricedecimal stringUSD per token, corporate-action adjusted.
price_per_sharedecimal stringUSD per underlying share.Both representations, always. Publishing one guarantees a class of errors.
premium_bps_at_printdecimal stringDivergence from the underlying at execution time.
sessionenumREGULAR, PRE_MARKET, POST_MARKET, OVERNIGHT, WEEKEND, HOLIDAY, HALTED.
confirmation_stateenumSEQUENCED, INCLUDED, FINALIZED, DROPPED, REORGED.
paired_leg_assetstring?The counter-leg when a stock leg and cash leg share a transaction.

Delivery semantics

Backfill and live through one stream: supply a from_block and omit to_block to replay history then tail indefinitely. Resumable by cursor — reconnect with the last cursor and delivery continues without a gap. At-least-once with an explicit dedup key.

Volume: Volume scales with chain activity; the chain produces a block roughly every 100 ms. Every record carries a dedup_key and a monotonic sequence, so at-least-once delivery is deterministic to deduplicate.

Server-side filters

  • token_symbols
  • venues
  • kinds (spot, perp, liquidation, mint, redeem, RFQ)
  • min_size_usd
  • block range (backfill then live)

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.tape.stream({  fromBlock: 4_200_000,})) {  handle(msg);}

Sample message

{  "tape_sequence": "88214417",  "token_symbol": "AAPL",  "venue": "VENUE_UNISWAP",  "kind": "TRADE_KIND_SPOT_SWAP",  "side": "SIDE_BUY",  "price": "231.4400",  "price_per_share": "231.4400",  "multiplier": "1.000000",  "size_tokens": "18.25",  "size_usd": "4223.78",  "session": "SESSION_REGULAR",  "underlying_market_open": true,  "premium_bps_at_print": "14.2",  "block_number": 4512889,  "confirmation_state": "CONFIRMATION_STATE_INCLUDED"}

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