Release 2027 · Schema version 001.05 · Active
SIVI message 1 (0001a): Capital (VB-PUO)
With message 1 the PUO reports the total pension capital at the start of the period: per pension scheme and per cohort (age cohort or reserve cohort). The fiduciary manager uses it as the starting point for the collective investment policy; the investment administrator uses it to reconcile independently. Optionally the message carries the intended allocation over investment portfolios (absolute or as a percentage).
Message structure
Entities with cardinality [min..max] and number of attributes; click for the entity page.
- chunking.default[0..1] · 4 attr.
- commonFunctional.default[1..1] · 4 attr.
- commonTechnical.default[1..1] · 3 attr.
- party.receiver[1..1] · 3 attr.
- party.sender[1..1] · 4 attr.
- party.contact[0..9] · 2 attr.
- document.default[0..99] · 3 attr.
- party.pensionProvider[1..1] · 3 attr.
- pension.scheme[1..999] · 3 attr.
- financialInformation.reportingPeriod[1..1] · 1 attr.
- investment.portfolio[0..99] · 4 attr.
- pension.cohort[1..99999] · 9 attr.
- investment.portfolio[0..99] · 4 attr.
- pension.scheme[1..999] · 3 attr.
Attributes (47)
| Entity | Attribute | Type | V/O | Code list | Description |
|---|---|---|---|---|---|
| chunking.default | currentChunkId | string · max 70 | V | Unique reference (id) of the current chunk. | |
| chunking.default | chunkSequenceNumber | integer | V | Sequence number of the current chunk. | |
| chunking.default | totalNumberOfChunks | integer | V | Total number of chunks the message has been split into. | |
| chunking.default | chunkFragmentPaths | array[string] | V | Array of JMESPath references to the message fragments used within the current chunk. | |
| commonFunctional.default | afdDefinitionVersion | string · max 80 | V | 001.05 | Version of the AFD-definition. |
| commonFunctional.default | afdDefinitionName | string · max 80 | V | VBPUO-001.00-Bericht_1._Vermogen_(0001a) | Name of the AFD-definition. |
| commonFunctional.default | originalMessageId | string · max 70 | O | The messageId of the original message, which is replaced by this message. | |
| commonFunctional.default | function | string | V | ADNFUN | Message function |
| commonTechnical.default | creationDateTime | string · format date-time | V | Date and time (as timestamp) when the message was created. | |
| commonTechnical.default | testMessage | boolean | O | Indication whether the message is a test message. | |
| commonTechnical.default | messageId | string · max 70 | V | Unique identification of the message. (AFD 2.0 only) | |
| party.receiver | refKey | string · max 70 | V | Unique reference key assigned to an entity. | |
| party.receiver | organizationName | string · max 60 | V | Name of professional or branch organization. | |
| party.receiver | rsinNumber | string · max 9 | O | Governmental identification number for legal entities and associations. (AFD 2.0 only) | |
| party.sender | refKey | string · max 70 | V | Unique reference key assigned to an entity. | |
| party.sender | applicationSenderName | string · max 60 | O | Name of the application that sends the data. | |
| party.sender | organizationName | string · max 60 | V | Name of professional or branch organization. | |
| party.sender | rsinNumber | string · max 9 | O | Governmental identification number for legal entities and associations. (AFD 2.0 only) | |
| party.contact | emailWork | string · max 60 | V | Work email address. | |
| party.contact | workPhoneNumber | string · max 60 | V | Work telephone number. | |
| document.default | refKey | string · max 70 | V | Unique reference key assigned to an entity. | |
| document.default | fileName | string · max 60 | V | Name of the file under which the attachment can be saved. | |
| document.default | fileExtension | string | V | pdf | csv | txt | Extension of the file under which the attachment can be saved. For example "pdf", "doc", etc. |
| party.pensionProvider | organizationName | string · max 60 | V | Name of professional or branch organization. | |
| party.pensionProvider | rsinNumber | string · max 9 | O | Governmental identification number for legal entities and associations. (AFD 2.0 only) | |
| party.pensionProvider | puvCode | string | V | AFDIDP | Pension provider |
| pension.scheme | refKey | string · max 70 | V | Unique reference key assigned to an entity. | |
| pension.scheme | startAmount | number · multipleOf 0.01 | V | Amount (for example of accrued capital) at the start of a period. | |
| pension.scheme | pensionSchemeName | string · max 60 | V | Name of the pension scheme. | |
| financialInformation.reportingPeriod | startDate | string · format date | V | Start date (from date). | |
| investment.portfolio | refKey | string · max 70 | V | Unique reference key assigned to an entity. | |
| investment.portfolio | description | string · max 60 | V | Description. | |
| investment.portfolio | startExposurePercentage | number · multipleOf 0.01 | O | The relative share of the startExposureAmount compared to the total pension capital on that specific date. | |
| investment.portfolio | startExposureAmount | number · multipleOf 0.01 | O | The allocation of the pension capital per cohort to a specific investment portfolio, calculated based on the allocation rules as applied by the PUO. | |
| pension.cohort | refKey | string · max 70 | V | Unique reference key assigned to an entity. | |
| pension.cohort | startAmount | number · multipleOf 0.01 | V | Amount (for example of accrued capital) at the start of a period. | |
| pension.cohort | description | string · max 60 | V | Description. | |
| pension.cohort | reserveType | string | O | AFDRES | Reserve type |
| pension.cohort | reserveDescription | string · max 60 | O | Description of the reserve. | |
| pension.cohort | reserveIndicator | boolean | V | Indication whether a reserve is available / applies. | |
| pension.cohort | startAge | number · multipleOf 1 | O | Start age. | |
| pension.cohort | endAge | number · multipleOf 1 | O | End age. | |
| pension.cohort | participationStatus | string | O | ADNDNS | Participation type |
| investment.portfolio | refKey | string · max 70 | V | Unique reference key assigned to an entity. | |
| investment.portfolio | description | string · max 60 | V | Description. | |
| investment.portfolio | startExposurePercentage | number · multipleOf 0.01 | O | The relative share of the startExposureAmount compared to the total pension capital on that specific date. | |
| investment.portfolio | startExposureAmount | number · multipleOf 0.01 | O | The allocation of the pension capital per cohort to a specific investment portfolio, calculated based on the allocation rules as applied by the PUO. |
Sample message
Sample source: SIVI voorbeeldbericht (Voorbeeldbericht_1). Values are fictitious.
{
"commonTechnical": [
{
"entityType": "default",
"creationDateTime": "2023-10-27T10:00:00Z",
"messageId": "1234567890123456789012",
"testMessage": false,
"party": [
{
"entityType": "sender",
"refKey": "ABC123",
"rsinNumber": "123456789",
"organizationName": "VoorbeeldBedrijf B.V.",
"applicationSenderName": "ApplicatieNaam",
"party": [
{
"entityType": "contact",
"emailWork": "[email protected]",
"workPhoneNumber": "+31678717607"
}
]
},
{
"entityType": "receiver",
"refKey": "XYZ789",
"rsinNumber": "987654321",
"organizationName": "OntvangerCorp1"
}
]
}
],
"commonFunctional": [
{
"entityType": "default",
"afdDefinitionName": "VBPUO-001.00-Bericht_1._Vermogen_(0001a)",
"afdDefinitionVersion": "001.05",
"function": "01",
"originalMessageId": "987654321"
}
],
"party": [
{
"entityType": "pensionProvider",
"puvCode": "U0003",
"rsinNumber": "222333449",
"organizationName": "St. Pf. Openbare Bibliotheken",
"pension": [
{
"entityType": "scheme",
"refKey": "SCHEME456",
"pensionSchemeName": "BasisPensioen",
"startAmount": 100000,
"financialInformation": [
{
"entityType": "reportingPeriod",
"startDate": "2023-01-01"
}
],
"pension": [
{
"entityType": "cohort",
"refKey": "COHORT101",
"startAmount": 60000,
"description": "Beschrijving van cohort 101",
"reserveIndicator": false,
"startAge": 300,
"endAge": 780,
"participationStatus": "16"
},
{
"entityType": "cohort",
"refKey": "COHORT202",
"startAmount": 75000,
"description": "Beschrijving van cohort 202",
"reserveIndicator": false,
"startAge": 540,
"endAge": 780,
"participationStatus": "20"
}
]
},
{
"entityType": "scheme",
"refKey": "SCHEME457",
"pensionSchemeName": "PlusPensioen",
"startAmount": 200000,
"financialInformation": [
{
"entityType": "reportingPeriod",
"startDate": "2023-01-01"
}
],
"pension": [
{
"entityType": "cohort",
"refKey": "COHORTRES1",
"startAmount": 85000,
"description": "Solidariteitsreserve",
"reserveIndicator": true,
"reserveType": "1"
},
{
"entityType": "cohort",
"refKey": "COHORTRES2",
"startAmount": 85000,
"description": "Overige reserve",
"reserveIndicator": true,
"reserveType": "99",
"reserveDescription": "specifieke reserve voor slapers"
}
]
}
]
}
]
}Variant: Voorbeeldbericht_2
{
"commonTechnical": [
{
"entityType": "default",
"creationDateTime": "2023-10-27T10:00:00Z",
"messageId": "1234567890123456789012",
"testMessage": false,
"party": [
{
"entityType": "sender",
"refKey": "ABC123",
"rsinNumber": "123456789",
"organizationName": "VoorbeeldBedrijf B.V.",
"applicationSenderName": "ApplicatieNaam",
"party": [
{
"entityType": "contact",
"emailWork": "[email protected]",
"workPhoneNumber": "+31678717607"
}
]
},
{
"entityType": "receiver",
"refKey": "XYZ789",
"rsinNumber": "987654321",
"organizationName": "OntvangerCorp1"
}
]
}
],
"commonFunctional": [
{
"entityType": "default",
"afdDefinitionName": "VBPUO-001.00-Bericht_1._Vermogen_(0001a)",
"afdDefinitionVersion": "001.05",
"function": "01",
"originalMessageId": "987654321"
}
],
"party": [
{
"entityType": "pensionProvider",
"puvCode": "U0003",
"rsinNumber": "222333449",
"organizationName": "St. Pf. Openbare Bibliotheken",
"pension": [
{
"entityType": "scheme",
"refKey": "SCHEME456",
"pensionSchemeName": "BasisPensioen",
"startAmount": 100000,
"financialInformation": [
{
"entityType": "reportingPeriod",
"startDate": "2023-01-01"
}
],
"pension": [
{
"entityType": "cohort",
"refKey": "COHORT101",
"startAmount": 60000,
"description": "Beschrijving van cohort 101",
"reserveIndicator": false,
"startAge": 300,
"endAge": 780,
"participationStatus": "16",
"investment": [
{
"entityType": "portfolio",
"refKey": "PF_MIX_NEUTRAL_01",
"description": "Neutraal Mixfonds Beleggingen Standaard",
"startExposureAmount": 60000
}
]
},
{
"entityType": "cohort",
"refKey": "COHORT202",
"startAmount": 75000,
"description": "Beschrijving van cohort 202",
"reserveIndicator": false,
"startAge": 540,
"endAge": 780,
"participationStatus": "20",
"investment": [
{
"entityType": "portfolio",
"refKey": "PF_STOCK_GLOBAL_02",
"description": "Wereldwijde Aandelenportefeuille Dynamisch",
"startExposureAmount": 45000
},
{
"entityType": "portfolio",
"refKey": "PF_BOND_EURO_02",
"description": "Europese Obligatieportefeuille Defensief",
"startExposurePercentage": 0.4
}
]
}
]
},
{
"entityType": "scheme",
"refKey": "SCHEME457",
"pensionSchemeName": "PlusPensioen",
"startAmount": 200000,
"financialInformation": [
{
"entityType": "reportingPeriod",
"startDate": "2023-01-01"
}
],
"pension": [
{
"entityType": "cohort",
"refKey": "COHORTRES1",
"startAmount": 85000,
"description": "Beschrijving van cohort RES1",
"reserveIndicator": true,
"reserveType": "1",
"startAge": 45,
"endAge": 65,
"participationStatus": "16",
"investment": [
{
"entityType": "portfolio",
"refKey": "PF_RESERVE_LOWRISK_03",
"description": "Lage Risico Reserveportefeuille Solide",
"startExposurePercentage": 1
}
]
},
{
"entityType": "cohort",
"refKey": "COHORTRES2",
"startAmount": 85000,
"description": "Beschrijving van cohort RES2",
"reserveIndicator": true,
"reserveType": "99",
"reserveDescription": "specifieke reserve voor slapers",
"startAge": 45,
"endAge": 65,
"participationStatus": "40",
"investment": []
}
]
}
]
}
]
}Variant: Voorbeeldbericht_1-reserves
{
"commonTechnical": [
{
"entityType": "default",
"creationDateTime": "2027-03-01T09:00:00+01:00",
"messageId": "VB-0001A-RES-0001",
"testMessage": true,
"party": [
{
"entityType": "sender",
"refKey": "PUO01",
"organizationName": "Pensioenuitvoerder Voorbeeld",
"applicationSenderName": "VoorbeeldApplicatie"
},
{
"entityType": "receiver",
"refKey": "FM01",
"organizationName": "Fiduciair Manager Voorbeeld"
}
]
}
],
"commonFunctional": [
{
"entityType": "default",
"afdDefinitionName": "VBPUO-001.00-Bericht_1._Vermogen_(0001a)",
"afdDefinitionVersion": "001.05",
"function": "01"
}
],
"party": [
{
"entityType": "pensionProvider",
"puvCode": "U0536",
"organizationName": "Pensioenfonds Zorg en Welzijn",
"pension": [
{
"entityType": "scheme",
"refKey": "REG-01",
"pensionSchemeName": "Basisregeling Voorbeeld",
"startAmount": 34089489.28,
"financialInformation": [
{
"entityType": "reportingPeriod",
"startDate": "2027-02-01"
}
],
"pension": [
{
"entityType": "cohort",
"refKey": "C-16-300",
"startAmount": 2312498.83,
"description": "Actief 25 jaar",
"reserveIndicator": false,
"startAge": 300,
"endAge": 300,
"participationStatus": "16"
},
{
"entityType": "cohort",
"refKey": "C-80-300",
"startAmount": 1743136.62,
"description": "Slaper 25 jaar",
"reserveIndicator": false,
"startAge": 300,
"endAge": 300,
"participationStatus": "80"
},
{
"entityType": "cohort",
"refKey": "C-16-420",
"startAmount": 1601733.54,
"description": "Actief 35 jaar",
"reserveIndicator": false,
"startAge": 420,
"endAge": 420,
"participationStatus": "16"
},
{
"entityType": "cohort",
"refKey": "C-80-420",
"startAmount": 1371514.14,
"description": "Slaper 35 jaar",
"reserveIndicator": false,
"startAge": 420,
"endAge": 420,
"participationStatus": "80"
},
{
"entityType": "cohort",
"refKey": "C-16-540",
"startAmount": 4545636.64,
"description": "Actief 45 jaar",
"reserveIndicator": false,
"startAge": 540,
"endAge": 540,
"participationStatus": "16"
},
{
"entityType": "cohort",
"refKey": "C-80-540",
"startAmount": 2898917.9,
"description": "Slaper 45 jaar",
"reserveIndicator": false,
"startAge": 540,
"endAge": 540,
"participationStatus": "80"
},
{
"entityType": "cohort",
"refKey": "C-16-660",
"startAmount": 2876220.79,
"description": "Actief 55 jaar",
"reserveIndicator": false,
"startAge": 660,
"endAge": 660,
"participationStatus": "16"
},
{
"entityType": "cohort",
"refKey": "C-80-660",
"startAmount": 997670.06,
"description": "Slaper 55 jaar",
"reserveIndicator": false,
"startAge": 660,
"endAge": 660,
"participationStatus": "80"
},
{
"entityType": "cohort",
"refKey": "C-16-780",
"startAmount": 5965026.7,
"description": "Actief 65 jaar",
"reserveIndicator": false,
"startAge": 780,
"endAge": 780,
"participationStatus": "16"
},
{
"entityType": "cohort",
"refKey": "C-80-780",
"startAmount": 1251288.8,
"description": "Slaper 65 jaar",
"reserveIndicator": false,
"startAge": 780,
"endAge": 780,
"participationStatus": "80"
},
{
"entityType": "cohort",
"refKey": "R-01",
"startAmount": 2809748.75,
"description": "Solidariteitsreserve",
"reserveIndicator": true,
"reserveType": "1"
},
{
"entityType": "cohort",
"refKey": "R-02",
"startAmount": 491160.94,
"description": "Operationele reserve",
"reserveIndicator": true,
"reserveType": "3"
},
{
"entityType": "cohort",
"refKey": "R-03",
"startAmount": 2708836.85,
"description": "Compensatiedepot",
"reserveIndicator": true,
"reserveType": "4"
},
{
"entityType": "cohort",
"refKey": "R-04",
"startAmount": 1348217.95,
"description": "Overige reserve",
"reserveIndicator": true,
"reserveType": "99",
"reserveDescription": "Reserve premiekorting"
},
{
"entityType": "cohort",
"refKey": "R-05",
"startAmount": 1167880.77,
"description": "Overige reserve",
"reserveIndicator": true,
"reserveType": "99",
"reserveDescription": "Reserve uitvoeringskosten"
}
]
}
]
}
]
}Rules and consistency checks
- The scheme total (pension.scheme.startAmount) and the cohort amounts (pension.cohort.startAmount) are delivered side by side. The standard does not require the cohorts to add up to the scheme total: according to the manual the receiver can, if desired, make a total calculation and check the reconciliation, depending on what the parties agree. SIVI's own sample message has 100,000 next to a cohort sum of 135,000.
- Every cohort has a unique refKey and is described by startAge and endAge (integers since Release 2026) and a participation status from code list ADNDNS.
- Reserve cohorts (solidarity reserve, risk-sharing reserve, compensation deposit) are flagged with reserveIndicator and typed with reserveType from code list AFDRES. Since the final Release 2027 reserveType is mandatory as soon as reserveIndicator is true (manual section 6.3), although the schema keeps both fields optional; reserveDescription is desired with code 99 (Other).
- A cohort with value 0 may be sent with amount 0 or left out, also when it is a reserve; parties must be able to process both and record in their agreements what a missing cohort means. The standard has no field without a value (null) (manual section 6.3, issue #100).
- financialInformation.reportingPeriod.startDate is the valuation date of the capital; the receiver checks that it connects to the previous period.
- Amounts have at most two decimals (multipleOf 0.01); percentages at most twelve.
Pitfalls
- A cohort that appears in message 2 (cashflow) but not in message 1: the receiver cannot place the mutation. Keep the cohort structure identical across messages 1, 2 and 3.
- More than a few thousand cohorts or year cohorts make the message large: use the chunking protocol of Release 2026 instead of several separate messages.
- The investment.portfolio block is optional and new since Release 2026; a receiver on an older release ignores it or rejects the message.
Errors and fixes
- messageId missing, empty or longer than 70 charactersSchema error on commonTechnical/0/messageId: 'must have required property' or 'must NOT have more than 70 characters'.
- Duplicate messageId after acceptance (HTTP 400 with feedback)The receiver answers HTTP 400 with a feedback message (statusType 0) to a message that looks correct in content.
- afdDefinitionName incorrect (a fixed value since the final Release 2027)Schema error 'must be equal to constant' on afdDefinitionName; the WTP Data Lab validator names the expected value. Typical of a message built on the July 2026 pre-release: it states the right version 001.05 and still fails.
- afdDefinitionVersion incorrect (001.04 versus 001.05)Schema error 'must be equal to one of the allowed values' on afdDefinitionVersion, or the receiver validates against the wrong schema and reports unknown fields.
- Message function invalid (ADNFUN 01, 02, 09 or 54)Schema error on commonFunctional/0/function: value not allowed.
- testMessage = true in productionThe message is accepted but not processed, or ignored as a test while it was production.
- creationDateTime not a valid date-timeSchema error 'must match format date-time'.
- puvCode unknown in code list AFDIDPSchema error 'must match exactly one schema in oneOf' on party/0/puvCode.
- rsinNumber not 9 positionsSchema error on rsinNumber (length) at sender, receiver or pensionProvider.
- party.sender: refKey or organizationName missingSchema error 'must have required property' on the sending party.
- party.contact: emailWork or workPhoneNumber missingSchema error on the contact under the sender.
- pension.scheme: refKey missing or pensionSchemeName longer than 60Schema error on the scheme.
- startAmount not in two decimals (multipleOf 0.01)Schema error 'must be multiple of 0.01'.
- reportingPeriod: endDate before startDateThe schema accepts the message; the receiver rejects it functionally or books the flows in the wrong period.
- Cohort cardinality exceeded (minContains / maxContains)Schema error 'must contain at least 1 valid item' or 'must contain at most 99999 valid items' on pension.
- participationStatus invalid (ADNDNS)Schema error 'must match exactly one schema in oneOf' on pension.cohort.participationStatus.
- reserveType invalid (AFDRES)Schema error 'must match exactly one schema in oneOf' on reserveType.
- reserveIndicator without reserveType, or reserveType 99 without reserveDescriptionUnder Release 2027 an error of the consistency check at reserveType. Under Release 2026 schema-valid, but the receiver cannot type the reserve and books it as an ordinary cohort; with reserveType 99 without a description it cannot tell which reserve is meant.
- endAge smaller than startAge, or not an integerWith decimals a schema error 'must be integer'; with swapped bounds the schema accepts and the receiver rejects.
- Cohort sum deviates from the scheme totalSchema-valid, but the fiduciary or investment administrator reports a reconciliation difference at scheme level.
- Unknown field (additionalProperties = false)Schema error 'must NOT have additional properties' with the name of the extra field.
- entityType does not match the fixed valueSchema error 'must be equal to constant' on entityType, often followed by 'must contain at least 1 valid item' on the parent array.
- Chunking: chunkSequenceNumber or totalNumberOfChunks inconsistentThe receiver cannot close the series: sequence number higher than the total, duplicate sequence number or varying total within one currentChunkId.
- Attachment: fileExtension not pdf, csv or txt, or fileName longer than 60Schema error on document.
- Error discovered after acceptance: the correction protocolAn accepted and processed message turns out to be wrong in content (wrong amount, wrong cohort).
- Schema draft mismatch: definitions versus $defs, draft 2019-09 versus 2020-12The validator reports 'can't resolve reference', MissingRefError or 'no schema with key or ref' when loading the schema, before the message is tested.
Frequently asked questions
What is the difference between message 1 (Capital) and message 2 (Cashflow)?
Message 1 is a position: the capital at the start of the period. Message 2 is a flow: the in- and outflows during the period. Together with message 4 (return) the chain closes the period: opening position + cashflow + return = closing position.
Who receives message 1: the fiduciary manager or the investment administrator?
Both, directly from the PUO. A principle of the standard is that an independent asset service provider receives the same information as the fiduciary manager, so that it can report and reconcile independently.
Is message 1 also used in the flexible premium arrangement?
Yes. The FPR messages 5 to 15 only cover the unitised flows. Collective flows such as risk premiums, reserve contributions and withdrawals from collective pools use the SPR messages 1 to 4 (manual section 4.1).
Are startAge and endAge in years or in months?
The schema prescribes integers and does not fix the unit; the official sample message uses months (300 and 780). Fix the unit in the chain agreements and keep it identical in all messages.
Change history
- v0.2.0 (April 2024): puvCode added, refKey mandatory.
- v1.3.0 (Release 2026): investment.portfolio added, startAge and endAge integers, chunking.
- v1.4.0 (Release 2027): JSON Schema 2020-12, code lists via $defs.
- Final Release 2027 (12 October 2026): afdDefinitionName a fixed value again; refKey of the portfolio under the cohort at most 70 characters; SIVI's explanation per attribute; reserveType mandatory with reserveIndicator = true.
Schema file: VBPUO-001.00-Bericht_1._Vermogen_(0001a).json · JSON-schema (001.05) · GitHub
