The UCITS KID / PRIIPs KID explained for developers: every field you can extract
What the PRIIPs KID is, how it replaced the UCITS KIID, every section it contains (SRI, scenarios, costs, holding period) and which fields map to API paths.Published 4 September 2026 · 6 min read · by FundFacts APIEvery UCITS fund sold to retail investors in the EU must publish a Key Information Document, and it is the most standardised document a fund house produces: fixed sections, fixed order, a three-page limit and regulated wording. This guide walks through it section by section, explains what changed when the PRIIPs KID replaced the UCITS KIID, and shows which fields you can extract and where they land in a FundFacts API response.
KIID, KID and PRIIPs: which one are we talking about?
Two documents share almost the same name.
- The UCITS KIID (Key Investor Information Document) was introduced by the UCITS IV directive. Two pages, a seven-step SRRI risk scale and past-performance bar charts.
- The PRIIPs KID (Key Information Document) comes from the PRIIPs Regulation and covers every "packaged" retail product: structured products, insurance wrappers and, since 1 January 2023, UCITS funds sold to EU retail investors. Three pages, a seven-step SRI risk scale and forward-looking performance scenarios.
Until the end of 2022 UCITS funds were exempt from PRIIPs and kept producing the KIID. That exemption ended, so an EU UCITS fund you look up today should have a PRIIPs KID. The United Kingdom is the important exception. After leaving the EU, the UK retained the PRIIPs rules but extended the UCITS exemption, so UK UCITS funds have continued to publish a UCITS KIID while the UK designs its own retail disclosure regime. If your product covers both markets, expect to parse both documents and treat the UK position as something to re-check, not a fixed fact. The glossary has short definitions of KID and PRIIPs.
The sections of a PRIIPs KID
The regulation prescribes the headings and their order. That consistency is exactly what a parser wants.
| Section | What it contains | Structured value you can extract |
|---|---|---|
| Product | Name, ISIN, manufacturer, regulator, date of the document | isin, name, manufacturer, document date |
| Comprehension alert | Optional warning for complex products | Boolean flag |
| What is this product? | Type, term, objectives, intended retail investor | Objective text, legal structure, target investor |
| What are the risks and what could I get in return? | SRI on a 1–7 scale plus performance scenarios | riskRating, scenario table |
| What happens if the manufacturer is unable to pay out? | Depositary and compensation-scheme wording | Rarely structured |
| What are the costs? | Costs over time and composition of costs | Entry, exit, ongoing, transaction and performance fees |
| How long should I hold it and can I take money out early? | Recommended holding period | Integer number of years |
| Other relevant information | Links to past performance and previous scenarios | URLs |
"Purpose" and "How can I complain?" are fixed wording and contact details; skip them. The rest deserve a closer look.
Objectives
The "What is this product?" section states the investment objective in plain language, the benchmark if there is one, whether the fund is active or tracks an index, the replication method for ETFs, and the distribution policy. In a FundFacts API response this arrives as investmentObjective, with the benchmark in benchmarkName and the policy in keyFacts.distribution.
Summary Risk Indicator (SRI)
The SRI is a single integer from 1 (lowest risk) to 7 (highest). It is printed as a row of seven boxes with one highlighted, and the document must say which recommended holding period it assumes. The API exposes it as riskRating.
Performance scenarios
The KIID showed a bar chart of up to ten calendar years of realised returns. The PRIIPs KID replaced that with a table of four scenarios — stress, unfavourable, moderate and favourable — each showing what a fixed investment (commonly 10,000 in the fund currency) might be worth after one year and after the recommended holding period, plus the annualised percentage. These are not forecasts; they are computed from historical data using a prescribed method, and can change materially between annual updates. Past performance moved out of the KID into a separate document that the KID links to. FundFacts API reads realised performance from the factsheet and performance pages instead, and returns it as calendarReturns, cumulativePerformance and annualisedReturns — see fund performance data explained.
Costs over time and reduction in yield
The cost section has two tables. Costs over time shows total costs in currency and as an annual percentage impact if you exit after one year and after the recommended holding period. In the original 2018 PRIIPs templates this percentage was labelled reduction in yield (RIY); the revised templates that arrived with the UCITS switch call it the annual cost impact, but it is the same idea: how much lower your yearly return is because of costs. Composition of costs then breaks the total down into one-off entry and exit costs, ongoing management and administrative costs, transaction costs and incidental costs such as performance fees.
The ongoing-cost line is the closest cousin of the TER or ongoing charges figure on the factsheet, but not always identical, because PRIIPs includes transaction costs that the UCITS ongoing charges figure excludes. When you store headlineMetrics.ter from the API next to a KID cost line, label each with its source. See TER vs ongoing charges.
Recommended holding period
A single number of years, chosen by the manufacturer. It drives the scenario horizon and the cost projection, so two funds' KID costs are only comparable if they share the same holding period.
Comprehension alert
If a product is considered complex the KID must carry the sentence "You are about to purchase a product that is not simple and may be difficult to understand." Most plain UCITS index funds do not carry it. Treat it as a boolean.
SRI vs SRRI: not the same scale
Both indicators run from 1 to 7; the similarity ends there.
| Aspect | SRRI (UCITS KIID) | SRI (PRIIPs KID) |
|---|---|---|
| Input | Five years of historical return volatility | A market-risk measure derived from a VaR-equivalent volatility over the holding period, combined with a credit-risk measure |
| Credit risk | Not included | Included |
| Horizon | Fixed look-back | Depends on the recommended holding period |
| Typical result for a broad equity index fund | Often 6 | Often 4 |
| Liquidity | Not covered | Can trigger an additional liquidity warning |
The practical consequence: a 6 from a UK KIID and a 4 from an EU KID can describe the same portfolio. Never mix the two in one column without a scale indicator. The API's riskRating is the indicator published in the fund's current document, so store the document type alongside it if you serve both regimes. The older scale is covered in SRRI explained.
Mapping KID fields to API paths
| KID field | API path |
|---|---|
| ISIN and fund name | isin, name |
| Objectives text | data.investmentObjective |
| Benchmark | data.benchmarkName |
| Distribution policy | data.keyFacts.distribution |
| Fund currency | data.keyFacts.currency |
| Legal structure / type | data.structure, data.securityType |
| Summary Risk Indicator | data.riskRating (1–7) |
| Ongoing costs | data.headlineMetrics.ter |
| Document date | data.dataAsOf |
A short TypeScript helper that fetches a fund and returns a KID-shaped summary:
typescripttype KidSummary = {isin: string;name: string;objective: string;sri: number;ongoingCostPct: number | null;distribution: string | null;asOf: string;};export async function kidSummary(isin: string): Promise<KidSummary> {const res = await fetch(`https://fundfactsapi.com/api/v1/funds/${isin}`, {headers: { Authorization: `Bearer ${process.env.FUNDFACTS_API_KEY}` },});if (!res.ok) throw new Error(`FundFacts API ${res.status}`);const { data, name } = await res.json();return {isin,name,objective: data.investmentObjective,sri: data.riskRating,ongoingCostPct: data.headlineMetrics?.ter ?? null,distribution: data.keyFacts?.distribution ?? null,asOf: data.dataAsOf,};}
Example output for IE00B4L5Y983 (example values, shape only):
json{"isin": "IE00B4L5Y983","name": "iShares Core MSCI World UCITS ETF USD (Acc)","objective": "The Fund aims to achieve a return on your investment, through a combination of capital growth and income, which reflects the return of the MSCI World Index.","sri": 4,"ongoingCostPct": 0.2,"distribution": "Accumulating","asOf": "2026-08-31"}
Things that trip up parsers
- Language versions. A fund distributed in ten countries has ten KIDs with identical numbers and translated text. Pick one language for text fields and record which.
- Annual refresh. KIDs are reviewed at least yearly and re-issued when scenarios or the SRI change materially. Keep the document date.
- One KID per share class. Costs, and sometimes the SRI, differ between classes of the same fund, so key everything by ISIN.
- UK vs EU. A GB-domiciled fund and its Irish sibling may carry different indicators for the same strategy purely because of the SRRI/SRI difference.
FundFacts API handles the reading, the refresh and the share-class keying and returns the structured result in one call, refreshed every 24 hours. Create a free key to try it on a KID you have in front of you.