Portfolio

ETF holdings lookthrough — aggregate sector/geo exposure

Aggregate sector + geo exposure with ETF lookthrough.

See services.portfolio_lookthrough for the computation. This handler validates input + calls compute + returns the envelope.

Status codes:

  • 200: Successful compute (possibly with empty exposure dicts if all positions were cash or all data missing).
  • 401: Unauthenticated.
  • 402: Below Plus tier.
  • 422: Invalid input (parse failure, length mismatch, weights sum to > 1.0 + tolerance, ticker count > MAX_POSITIONS, etc).
  • 500: Unexpected compute failure (Sentry-captured upstream).
get/api/portfolio/lookthrough

Request

  • Base URL: https://www.oxfordledge.com (the document declares no server; this is the origin it was published from)
  • URL: https://www.oxfordledge.com/api/portfolio/lookthrough
  • Auth: none declared

Query parameters

tickersstring

Comma-separated tickers, e.g. 'AAPL,VTI,QQQ'.

weightsstring

Comma-separated fractional weights aligned with tickers, e.g. '0.4,0.3,0.3'. Must sum to ≤ 1.0 (cash drag implied by remainder).

Response

Successful Response

sector_exposureobject

Sector → fractional weight; sums to 1.0 across risky positions. Key 'Unknown' bucket holds the weight whose sector lookup failed.

geo_exposureobject

Country → fractional weight; sums to 1.0 across risky positions. 'United States' canonicalized.

cash_weightnumber required

Fraction of portfolio in cash sentinels.

opaque_etfsstring[]

ETF tickers we couldn't lookthrough (no PG data).

levered_inverse_etfsstring[]

Levered / inverse ETFs flagged in input; not expanded (3× synthetic ≠ underlying for lookthrough).

coverage_pctnumber required

Fraction of non-cash weight expanded via lookthrough vs. treated as direct/opaque. 1.0 = every ETF had data; 0.0 = nothing expanded.

position_countinteger required

Distinct ticker count in the input portfolio.

etf_countinteger required

ETF position count (subset of position_count).

errorstring nullable

Changes

No recorded changes to this operation across all 1 revision of this API.