Skip to main content
POST
Portfolio Theme Exposure
Decomposes a portfolio across the telemetry-radar theme baskets. Async — returns a job_id immediately.
  1. Submit: POST your holdings to /v1/portfolio/theme-exposure.
  2. Receive: a job_id and polling URL.
  3. Poll: GET /v1/jobs/{job_id} until status is completed.
Symbols are taken as RICs, as sent, with no ticker resolution: a bare ticker like AGG can mean a different stock on a different exchange than the one you intend. Resolve tickers to RICs first: for stocks, use Stock Search or Validate Symbol; for ETFs, use ETF Search or Validate ETF Symbol. Do not use POST /v1/portfolio/resolve for this. It is a Portfolio Tracker function that requires a date per holding and renormalizes weights to 1.0, a different contract from this endpoint’s. A request where none of the symbols is a known RIC is rejected with 400 before a job is created, and nothing is charged.

Request Body

Holding object:

Response (job created)

Completed Job Result

Documented directly from the endpoint’s own contract. result carries: ETFs are unpacked to their constituents at reported weights, nested funds included. Weight the holdings data does not cover is reported as lookthrough_residual and never spread over known constituents. A symbol that is not a known RIC is reported as unresolved weight, not guessed. Exact field types and nullability depend on the book’s composition — see a live job result for the authoritative shape.

Errors

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Body

application/json
holdings
Holdings · object[]
required

Up to 100 positions.

Required array length: 1 - 100 elements
themes
string[]

Optional theme questions ('how exposed am I to X?'). Each entry is a basket_id or a theme-name substring; the result gains a theme_queries[] block with the member-inclusive exposure (every held member of the theme, overlap disclosed) next to the assigned view. An ambiguous name returns candidates, never a guess.

Maximum array length: 10

Response

Job created

Last modified on November 6, 2026