Corporate actions stream

The full action lifecycle, including scheduled contract pause windows.

RobinhoodRPC nativerhrpc.v1.EquitiesStream/StreamCorporateActions

What it carries

Merges Robinhood's corporate-actions endpoint, the pending-multiplier fields on /assets, and onchain UIMultiplierUpdated events into one ordered lifecycle per action. All 13 action types are typed, and the pause window that precedes a large multiplier change is emitted ahead of effect rather than discovered afterwards.

Key fields

FieldTypeDescription
action_idstringStable across the lifecycle. Dedupe on this.
typeenumFORWARD_SPLIT, REVERSE_SPLIT, CASH_DIVIDEND, STOCK_DIVIDEND, SPIN_OFF, three merger variants, REDEMPTION, NAME_CHANGE, WORTHLESS_REMOVAL, RIGHTS_DISTRIBUTION, UNIT_SPLIT.
stageenumACTION_ANNOUNCED, MULTIPLIER_PENDING, PAUSE_SCHEDULED, PAUSED, MULTIPLIER_APPLIED, UNPAUSED, ACTION_COMPLETED.PAUSE_SCHEDULED is the one that matters: a knowable, advance-warned price discontinuity.
seconds_until_effectiveint64Countdown; negative once applied.
old_multiplier / new_multiplierdecimal stringThe change.
detailsoneofExactly one variant, matching type.

Delivery semantics

Set replay_in_progress to receive actions already in flight on connect, so a new subscriber is never blind to a pause window that has already been scheduled.

Volume: Low volume, high value. Most instruments see a handful of events per quarter. Every record carries a dedup_key and a monotonic sequence, so at-least-once delivery is deterministic to deduplicate.

Server-side filters

  • token_symbols
  • stages
  • replay_in_progress

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

Sample message

{  "action_id": "0x9f2c…",  "token_symbol": "NVDA",  "type": "CORPORATE_ACTION_TYPE_FORWARD_SPLIT",  "stage": "LIFECYCLE_STAGE_PAUSE_SCHEDULED",  "effective_at": "2026-09-14T20:00:00Z",  "seconds_until_effective": 14400,  "old_multiplier": "1.004200",  "new_multiplier": "4.016800",  "details": {    "forward_split": {      "underlying_symbol": "NVDA",      "old_rate": "1",      "new_rate": "4"    }  }}

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