The REST API is in beta. This endpoint’s response shape may change.
Request
Headers
Trialing subscriptions on any plan receive full brokerage access, so you can evaluate
/holdings and /trades during a trial. Outside a trial, brokerage access requires an active (or past_due) subscription on a Professional price.
Query parameters
connectionId must refer to a brokerage connection. Passing a banking connection ID returns a 400 error. Use the List Connections endpoint to find your brokerage connection IDs.Response
Responses are not cached; every request fetches live from the brokerage provider.Holding object
If the provider reports several rows for one instrument, top-level
quantity is their sum and averagePrice is quantity-weighted. marketValue and unrealizedPnl are summed, while currentPrice comes from the largest position. If any row omits an average price, market value, or unrealised P&L, the corresponding aggregate is null rather than a partial total. A holding reported as one row still has one entry in positions.
Error responses
Errors use the standard envelope{ "error": { "message": string, "code"?: string, "details"?: string[] } }. The optional code field is set for the structured cases below — clients should branch on code rather than parsing message.
Example error body:

