ParallaxMessages subscription
The primary Parallax read path. The app opens one ParallaxMessages subscription per vehicle and passes a list of RVM topic strings.
wss://api.rivian.com/gql-consumer-subscriptions/graphql
Protocol: GraphQL over WebSocket (graphql-transport-ws).
Wire format
Each next frame:
{
"rvm": "energy.high_voltage.battery_state",
"payload": "<base64 protobuf>",
"timestamp": 1700000000000
}
Headers
a-sess: <app session token>
u-sess: <user session token>
csrf-token: <csrf token>
apollographql-client-name: com.rivian.android.consumer
Connection flow
- WebSocket connect with headers above.
- Send
{"type":"connection_init"}→ wait forconnection_ack. - Send
subscribe(below). - Read
nextframes; optionally sendcomplete.
GraphQL variable: vehicleId (not vehicleID).
Subscribe message
{
"type": "subscribe",
"id": "<uuid>",
"payload": {
"operationName": "ParallaxMessages",
"variables": {
"vehicleId": "<your-vehicle-id>",
"rvms": ["energy.high_voltage.battery_state", "body.locks.states"]
},
"query": "subscription ParallaxMessages($vehicleId: String!, $rvms: [String!]) { parallaxMessages(vehicleId: $vehicleId, rvms: $rvms) { payload timestamp rvm } }"
}
}
Example response
{
"id": "<uuid>",
"type": "next",
"payload": {
"data": {
"parallaxMessages": {
"payload": "CkIKBAAAADMzT0ARAAAAQOESYEASDw00MytCFWdmOkIdzcwUQhoAIAEwCQ==",
"timestamp": 1700000000000,
"rvm": "energy.high_voltage.battery_state"
}
}
}
}
Empty payload ("") is valid — keepalive or cleared state.
How the app picks RVMs
From enum cm/c:
- Always —
subscriptionScope = AppandisVehicleState = false(domain list). - +
PARALLAX_VEHICLE_STATE— RVMs withisVehicleState = true(locks, gear, range, session status, …). - + tire feature —
dynamics.tires.state(subscriptionScope = Feature).
You may subscribe to any subset; the app uses the union for enabled features.
Example script
examples/parallax-subscribe.py — prints { rvm, timestamp, payload_b64 } as JSON lines.
See also
- Domains — all RVMs by area
- Decoding — protobuf notes
- Legacy WebSocket subscriptions — non-Parallax subs on the same URL