---
title: "How do I do a look-through of a portfolio of funds (real sector, country and fee exposure)?"
description: "POST /api/v1/portfolio with positions and weights returns the weighted TER, weighted risk indicator, aggregated sector, country, region, asset and credit-quality exposure and the combined top holdings, with coverage per breakdown. Code and formula."
canonical: https://fundfactsapi.com/answers/how-to-do-portfolio-look-through-of-funds
published: 2026-09-12
updated: 2026-10-13
publisher: FundFacts API
---

# How do I do a look-through of a portfolio of funds (real sector, country and fee exposure)?

**Short answer:** Send the positions to POST https://fundfactsapi.com/api/v1/portfolio as { positions: [{ isin, weight }, …] } (weights are normalised to 100). The response contains fees.weightedTer, risk.weightedSrri, and aggregated assetAllocation, sector, geography, region, creditQuality, currency and topHoldings, each with a coverage figure stating what share of the portfolio disclosed that breakdown. Starter and above, one request per position; the free portfolio look-through tool on this site runs it in the browser.

## The call

```bash
curl -s --max-time 300 -X POST https://fundfactsapi.com/api/v1/portfolio \
  -H "Authorization: Bearer $FUNDFACTS_API_KEY" -H "Content-Type: application/json" \
  -d '{"positions":[{"isin":"IE00B4L5Y983","weight":60},{"isin":"IE00B3RBWM25","weight":25},{"isin":"LU1681043599","weight":15}]}'
```

```json
{
  "positions": [ { "isin": "IE00B4L5Y983", "name": "iShares Core MSCI World UCITS ETF", "weight": 60, "covered": true, "ter": 0.2, "riskRating": 6, "category": "Global Equity", "kind": "equity" } ],
  "coverage": 100,
  "fees": { "weightedTer": 0.19, "coverage": 100, "annualCostPer10k": 19 },
  "risk": { "weightedSrri": 5.6, "band": "high", "coverage": 100 },
  "kinds": [ { "label": "equity", "weight": 85 }, { "label": "fixedIncome", "weight": 15 } ],
  "assetAllocation": { "items": [ { "label": "Equity", "weight": 84.8 } ], "coverage": 100 },
  "sector": { "items": [ { "label": "Information Technology", "weight": 24.9 } ], "coverage": 85 },
  "geography": { "items": [ { "label": "United States", "weight": 58.3 } ], "coverage": 100 },
  "topHoldings": { "items": [ { "label": "NVIDIA", "weight": 4.4 } ], "coverage": 85, "note": "…" },
  "pending": [],
  "rules": "fundfacts-portfolio/3"
}
```

## The arithmetic

For each breakdown, every fund's weights are multiplied by the fund's portfolio weight and summed by label; `coverage` is the sum of the portfolio weights of the funds that disclosed that breakdown, so you can tell "58% US of a fully disclosed portfolio" from "58% US of the 70% that disclosed geography". Weighted TER and weighted SRRI are plain weighted averages over disclosed values, each with its own coverage; `risk.band` maps the weighted SRRI to low / medium / high and `fees.annualCostPer10k` restates the TER in currency per 10,000 invested. Labels are normalised across fund houses before summing.

Doing it yourself from `GET /funds/{isin}` is the same loop; the endpoint saves the label normalisation and the coverage bookkeeping. [Aggregating sector and country exposure](https://fundfactsapi.com/blog/aggregate-sector-and-country-exposure-across-a-portfolio) shows the hand-rolled version.

## Practical notes

- Bond funds contribute `creditQuality` and `maturity`, equity funds `sector`; `kinds` shows the asset split of the whole portfolio.
- Cold ISINs come back in `pending` and are warmed; re-send the call a minute later for a complete picture.
- One request per position; up to 10 positions on Starter, 50 on Pro, 200 on Scale. Cache by the sorted list of (isin, weight) until the earliest `expiresAt`.

The [portfolio look-through use case](https://fundfactsapi.com/use-cases/portfolio-look-through) and the [robo-advisor use case](https://fundfactsapi.com/use-cases/robo-advisor) cover product design; the MCP tool is `analyze_portfolio`.

## FAQ

### Do I need a credit card to try it?

No. The Free plan is 5 lookups per month with no card; sign up with an e-mail address or Google and the key is shown in the dashboard.

## About FundFacts API

FundFacts turns any fund or ETF ISIN into one dated factsheet (fees and KID costs, the 1–7 risk indicator, holdings, sector and country exposure, returns) read from the fund house's own documents: as a client-ready PDF under your firm's name for advisers and wealth managers, as JSON through its API for developers, or inside ChatGPT and Claude through its MCP server.

FundFacts works inside ChatGPT and Claude as a connector (a remote MCP server): ask about any fund or ETF by ISIN, ticker or name and the assistant answers from FundFacts' dated figures, fees, risk, holdings, exposure and returns, with fund cards, side-by-side comparisons, holdings overlap and portfolio look-through.

- Free API key, no card: https://fundfactsapi.com/signup
- Documentation: https://fundfactsapi.com/docs (OpenAPI: https://fundfactsapi.com/openapi.json)
- MCP server: https://fundfactsapi.com/api/mcp (set-up for every client: https://fundfactsapi.com/mcp-server)
- Pricing: https://fundfactsapi.com/pricing
- Site index for AI assistants: https://fundfactsapi.com/llms.txt
- Informational data, not investment advice.
