How to read a Solvency II XBRL instance file, and how to check it before you submit
Read a Solvency II XBRL instance line by line: contexts, units, filing indicators, dimensional facts, the trace back to a QRT cell, and pre-submission checks.
In this article
At some point a Solvency II filing lands on your desk as a file with an .xbrl extension, and someone asks whether it is right. This article is for that moment. It walks through a short instance excerpt line by line, shows how to read the file in a text editor and in a free viewer, traces one fact back to its template cell through the EIOPA Data Point Model, and ends with the checks worth running before submission and what a rejection looks like. The closing section shows where each step lands in the XBRL tools from SolvencyTool.
It assumes you know what a taxonomy, an instance and a filing indicator are; if not, read what XBRL is in insurance reporting first. The excerpt follows EIOPA’s Solvency II taxonomy 2.8.2 and the syntax of its sample instance documents.
A short instance, annotated
A cut down annual solo filing with the balance sheet and its ring fenced fund variant. The LEI is made up but structurally valid.
<?xml version="1.0" encoding="UTF-8"?>
<?instance-generator id="example" version="1.0" creationdate="2026-04-02T10:15:00+02:00"?>
<xbrli:xbrl xmlns:xbrli="http://www.xbrl.org/2003/instance"
xmlns:link="http://www.xbrl.org/2003/linkbase"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xbrldi="http://xbrl.org/2006/xbrldi"
xmlns:iso4217="http://www.xbrl.org/2003/iso4217"
xmlns:find="http://www.eurofiling.info/xbrl/ext/filing-indicators"
xmlns:s2md_met="http://eiopa.europa.eu/xbrl/s2md/dict/met"
xmlns:s2c_dim="http://eiopa.europa.eu/xbrl/s2c/dict/dim"
xmlns:s2c_typ="http://eiopa.europa.eu/xbrl/s2c/dict/typ"
xmlns:s2c_AM="http://eiopa.europa.eu/xbrl/s2c/dict/dom/AM"
xmlns:s2c_PU="http://eiopa.europa.eu/xbrl/s2c/dict/dom/PU"
xmlns:s2c_CU="http://eiopa.europa.eu/xbrl/s2c/dict/dom/CU">
<link:schemaRef xlink:type="simple"
xlink:href="http://eiopa.europa.eu/eu/xbrl/s2md/fws/solvency/solvency2/2024-10-15/mod/ars.xsd"/>
<xbrli:unit id="u1">
<xbrli:measure>iso4217:EUR</xbrli:measure>
</xbrli:unit>
<xbrli:context id="c1">
<xbrli:entity>
<xbrli:identifier scheme="http://standards.iso.org/iso/17442">529900XBRLEXAMPLE004</xbrli:identifier>
</xbrli:entity>
<xbrli:period>
<xbrli:instant>2025-12-31</xbrli:instant>
</xbrli:period>
</xbrli:context>
<xbrli:context id="c2">
<xbrli:entity>
<xbrli:identifier scheme="http://standards.iso.org/iso/17442">529900XBRLEXAMPLE004</xbrli:identifier>
</xbrli:entity>
<xbrli:period>
<xbrli:instant>2025-12-31</xbrli:instant>
</xbrli:period>
<xbrli:scenario>
<xbrldi:explicitMember dimension="s2c_dim:VG">s2c_AM:x80</xbrldi:explicitMember>
</xbrli:scenario>
</xbrli:context>
<xbrli:context id="c3">
<xbrli:entity>
<xbrli:identifier scheme="http://standards.iso.org/iso/17442">529900XBRLEXAMPLE004</xbrli:identifier>
</xbrli:entity>
<xbrli:period>
<xbrli:instant>2025-12-31</xbrli:instant>
</xbrli:period>
<xbrli:scenario>
<xbrldi:typedMember dimension="s2c_dim:NF">
<s2c_typ:ID>RFF01</s2c_typ:ID>
</xbrldi:typedMember>
<xbrldi:explicitMember dimension="s2c_dim:PO">s2c_PU:x40</xbrldi:explicitMember>
<xbrldi:explicitMember dimension="s2c_dim:VG">s2c_AM:x80</xbrldi:explicitMember>
</xbrli:scenario>
</xbrli:context>
<find:fIndicators>
<find:filingIndicator contextRef="c1">S.01.02</find:filingIndicator>
<find:filingIndicator contextRef="c1">S.02.01</find:filingIndicator>
<find:filingIndicator contextRef="c1">SR.02.01</find:filingIndicator>
<find:filingIndicator contextRef="c1" find:filed="false">S.30.01</find:filingIndicator>
</find:fIndicators>
<s2md_met:ei1930 contextRef="c1">s2c_CU:EUR</s2md_met:ei1930>
<s2md_met:mi201 contextRef="c2" unitRef="u1" decimals="0">1254300000</s2md_met:mi201>
<s2md_met:mi201 contextRef="c3" unitRef="u1" decimals="0">86400000</s2md_met:mi201>
</xbrli:xbrl>
Reading from the top. The instance-generator processing instruction names the software that wrote the file; filing rule S.2.23 asks for it. The root element xbrli:xbrl declares every namespace the file uses: s2md_met for EIOPA’s metrics, s2c_dim for its dimensions, s2c_typ for typed domains, and s2c_AM, s2c_PU, s2c_CU for the explicit domains whose members appear below.
The link:schemaRef is the line a validator reads first. It points at the entry point, here ars.xsd, annual Solvency II reporting for a solo undertaking, in the 2.8.2 release folder dated 2024-10-15. Filing rule S.1.5.(a) allows exactly one schema reference, with the full absolute URL, and it must be the entry point that applies to the reference date.
The unit u1 says euro; a file normally has one currency unit, plus xbrli:pure if it carries ratios.
The three contexts share an entity (the LEI, with the scheme http://standards.iso.org/iso/17442) and a period (a single instant, the reference date, no time zone). They differ only in the scenario. c1 has none and serves the filing indicators and the basic information facts. c2 carries one explicit dimension member: s2c_dim:VG, which the DPM dictionary names Valuation general, set to s2c_AM:x80, Solvency II. c3 adds two more. s2c_dim:NF, Number of fund, is a typed dimension: instead of choosing from a closed list, the filer supplies a value inside s2c_typ:ID, here the fund code RFF01. s2c_dim:PO, Portfolio, is set to s2c_PU:x40, Material Ring Fenced Funds.
The filing indicators sit in one find:fIndicators tuple before the facts. Three templates are declared as filed; S.30.01 is declared as not filed with find:filed="false", which rule 1.6.(b) permits. Indicators use template codes without the variant suffix: S.02.01, never S.02.01.01.01.
Then the facts. s2md_met:ei1930 in c1 is the reporting currency from S.01.02, and rule 3.1 requires it because every monetary fact in the file must use that currency. The two s2md_met:mi201 facts share a metric and a unit and differ only in context: the first is total assets in the balance sheet at Solvency II value, the second is total assets of ring fenced fund RFF01. Nothing in the element name tells you that. The context does.
Reading it in a text editor and in a free viewer
A text editor answers three questions quickly: which taxonomy release the file references (search for schemaRef), which templates it claims to report (search for fIndicators) and whether a value you expect is present (search for the number). It cannot resolve element names against the taxonomy, so you will see mi201 and never the words Total assets.
For real reading use an XBRL processor. Arelle is open source under the Apache 2.0 licence, runs on Windows, macOS and Linux, and comes as a desktop application from arelle.org or as a Python package (pip install arelle-release, then arelleGUI). Open the instance and Arelle follows the schema reference, reads the taxonomy from a package you point it at, and shows the facts with their labels, the contexts with their dimension members and, for tables with a rendering linkbase, the template as a grid with the values in their cells. The command line does the same without the interface:
arelleCmdLine --file annual-2025.xbrl --packages EIOPA_SolvencyII_XBRL_Taxonomy_2.8.2_Final.zip --validate --logFile check.txt
--validate runs XBRL 2.1, dimensions and the assertions found through the entry point. The validate/EBA plugin adds a check against an older revision of the EIOPA filing rules, so treat it as a first pass rather than the supervisor’s verdict. --factTable exports the facts to CSV or HTML.
Mapping a fact back to a template cell
A fact is a metric plus a set of dimension members; a template cell is a row plus a column plus a z axis. The DPM is the translation between the two. EIOPA publishes it with every release as the DPM dictionary, the annotated templates and the table linkbases inside the taxonomy.
Take the first mi201 fact. Look up mi201 in the Metrics sheet of the DPM dictionary and you get “Metric: Monetary|BC/Assets”, a monetary item with instant period type. Look up VG in the Dimensions sheet and you get Valuation general, with its members in the s2c_AM sheet: x80 is Solvency II, x84 is Statutory accounts. So the fact is the assets metric at Solvency II valuation, with no further split.
Now open the taxonomy folder for table s.02.01.01.01 (annual solo balance sheet; the quarterly solo variant is s.02.01.02.01). Its rendering linkbase defines rows and columns as rule nodes. Row R0500, Total assets, is the rule node whose concept is s2md_met:mi201. Column C0010, Solvency II value, sets s2c_dim:VG to s2c_AM:x80; column C0020 would set it to x84. The intersection is the cell, and it matches the fact’s context exactly. That is how a viewer draws the grid, and the lookup you do by hand when a message names a metric rather than a cell.
The second mi201 fact resolves the same way, but the extra members send it to a different table. SR.02.01.01.01 has the same rows and columns and two open z axes on top: s2c_dim:PO for Z0020, the ring fenced fund or remaining part choice, and s2c_dim:NF for Z0030, the fund number. The S.02.01 balance sheet reporting explanation describes Z0020 and Z0030 in the words of the ITS; the typed member and the portfolio member are what those two items look like in XML. Why a fund gets its own balance sheet at all is covered in ring fenced funds under Solvency II.
The checks to run before submission
The numbering follows the EIOPA XBRL Filing Rules, last updated 3 January 2025 and shipped in the Common folder of the 2.8.2 package.
Taxonomy version and entry point. The schemaRef must point at the release that applies to the reference date, and at the right module within it: qrs for quarterly solo, ars for annual solo, qrg and arg for groups. Taxonomy 2.8.2 covers reference dates through Q4 and annual 2026; 2.10.0 takes over from Q1 2027. Which templates each module expects is in the Solvency II QRT list.
Valid XML and XBRL. Rule S.1.9 requires validity against XBRL 2.1, XBRL Dimensions 1.0 and Extensible Enumerations 1.0; rule 1.4 requires UTF-8; rule S.1.1.(a) requires the lowercase .xbrl extension.
Filing indicators against content. Rule 1.6.(a) requires a positive indicator for every template you report. Rule 1.7.1 forbids facts that belong to no positively indicated template, rule 1.7.(b) forbids a positive indicator for a template with nothing in it, and rule 1.6.1 allows only one indicator per template. The entry point’s own check refuses a code that does not belong to the module; its messages are as short as “Mandatory filing indicator missing”.
Entity and period. Rule S.2.8.(c) fixes the scheme to http://standards.iso.org/iso/17442 (or the string LEI), with a national code only where no LEI exists; rule 2.9 requires the same identifier on every context; rules 2.13 and 2.10 require every instant to be the same reference date, as a plain date without a time zone. An LEI is 20 characters, the last two being check digits under ISO 7064 MOD 97-10, so a typo is caught before any register lookup.
Units, decimals and rounding. Rule 3.1 requires one reporting currency, declared through ei1930; rule 3.2.(a) requires xbrli:pure for non monetary numbers; rule 3.2.(b) requires ratios as decimal fractions, so 9.31 percent is 0.0931, and rule S.2.18.(e) wants at least four decimals on them. Rule 2.18.(a) forbids the precision attribute in favour of decimals; rule 2.18.(b) asks for values as known, without rounding or scaling; rule S.2.18.(c) sets a minimum decimals per size band, with at least 2 in the asset lists S.06.02, S.08.01 and S.11.01. Rule S.2.19 forbids nil facts.
Duplicates and leftovers. Rule S.2.16 forbids duplicate and inconsistent facts, the usual result of merging two data sources. Rules 2.7 and 2.22 say unused contexts and units should not be present.
Business validations. Rule S.1.10.(a) requires the file to satisfy the assertions discoverable from the entry point, and rule S.20 adds the list of validations and the known issues list, because EIOPA deactivates rules between releases and a processor will still fire them. Each business validation carries a severity per module. For the quarterly solo balance sheet, BV320_1 (total assets equal the sum of the asset rows) and BV330_1 (excess of assets over liabilities equals assets minus liabilities) are errors, while BV714 (total assets should be positive) is a warning. Warnings do not block; errors do.
Completeness. Rule 1.12 says the instance is the full report. A resubmission after a correction is the whole file again, never a delta.
What a rejection looks like
A rejected filing comes back as a list. Each line has an identifier, a severity and a message that names the data points involved. For a filing rule the identifier is the rule’s name, for instance missingPositiveFilingIndicator. For a business validation it is the BV code, and the message is generated from the rule expression. A BV330_1 failure on the quarterly solo module reads roughly as [BV330_1-3];[(t: S.02.01.02.01, r: R1000) reported as 148,200,000 = (t: S.02.01.02.01, r: R0500) reported as 1,254,300,000 - (t: S.02.01.02.01, r: R0900) reported as 1,106,000,000], where the 100,000 gap between R1000 and the difference is the failure. A message that names S.02.01.02.01, R0500 and C0010 is only useful if you can get from the cell to the fact and from the fact to the source figure, which is what the mapping section was for.
The fix is almost never in the XML. A filing indicator problem means the scope was wrong; a decimals problem means a rounding step in the mapping; a BV320 failure means one of the asset rows came from a different cut of the ledger than the total. Correct the source or the mapping, regenerate, submit again.
Where this lands in the software
QRT Tool generates the instance from the mapped templates, so the schema reference, contexts, units, decimals and filing indicators are written from the reference date and the scope you set, not typed by hand. Validation runs inside the tool against the taxonomy assertions, the EIOPA filing rules and the national specific checks that several supervisors add, and the resolvers correct whole classes of error in one step rather than one fact at a time. SmartData fills gaps in the asset templates from a repository of more than 13 million securities and the GLEIF register, which is where most identifier errors originate. Currency conversion at the ECB rate for the reference date, multi entity accounts for groups, and a planning tool with per template deadlines and a four eyes review before a template is locked are part of the same XBRL tools.
Sources
- Extensible Business Reporting Language (XBRL) 2.1XBRL International
- XBRL Dimensions 1.0XBRL International
- Filing IndicatorsXBRL International
- Supervisory reporting - DPM and XBRLEIOPA
- EIOPA XBRL Filing Rules, taxonomy 2.8.2EIOPA
- Solvency II XBRL taxonomy 2.8.2 (ZIP)EIOPA
- Solvency II sample XBRL instance documents, taxonomy 2.8.2 (ZIP)EIOPA
- DPM Dictionary 2.8.2 (XLSX)EIOPA
- Solvency II validations, taxonomy 2.8.2 (XLSX)EIOPA
- ArelleArelle
- Install - ArelleArelle
- Command Line Operation - ArelleArelle
- Validation Plugins - ArelleArelle
- The Legal Entity Identifier (LEI) - LEI & vLEI - Organizational Identity: GLEIFGLEIF