Release 2027 (pre-release) · Schema version001.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 | 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 | 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 | messageId | string · max 70 | V | Unique identification of the message. (AFD 2.0 only) | |
| commonTechnical.default | testMessage | boolean | O | Indication whether the message is a test message. | |
| 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 | workPhoneNumber | string · max 60 | V | Work telephone number. | |
| party.contact | emailWork | string · max 60 | V | Work email address. | |
| document.default | refKey | string · max 70 | V | Unique reference key assigned to an entity. | |
| document.default | fileExtension | string | V | pdf | csv | txt | Extension of the file under which the attachment can be saved. For example "pdf", "doc", etc. |
| document.default | fileName | string · max 60 | V | Name of the file under which the attachment can be saved. | |
| 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 | 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. | |
| investment.portfolio | startExposurePercentage | number · multipleOf 0.01 | O | The relative share of the startExposureAmount compared to the total pension capital on that specific date. | |
| 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 | reserveDescription | string · max 60 | O | Description of the reserve. | |
| pension.cohort | reserveType | string | O | AFDRES | Reserve type |
| 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 | V | Unique reference key assigned to an entity. | |
| investment.portfolio | description | string | V | Description. | |
| 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. | |
| investment.portfolio | startExposurePercentage | number · multipleOf 0.01 | O | The relative share of the startExposureAmount compared to the total pension capital on that specific date. |
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": "PensioenFonds B.V.",
"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": "Beschrijving van cohort 202",
"reserveIndicator": true,
"reserveType": "1",
"startAge": 45,
"endAge": 65,
"participationStatus": "16"
},
{
"entityType": "cohort",
"refKey": "COHORTRES2",
"startAmount": 85000,
"description": "Beschrijving van cohort 202",
"reserveIndicator": true,
"reserveType": "99",
"reserveDescription": "specifieke reserve voor slapers",
"startAge": 45,
"endAge": 65,
"participationStatus": "40"
}
]
}
]
}
]
}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": "PensioenFonds B.V.",
"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": []
}
]
}
]
}
]
}Rules and consistency checks
- The scheme total (pension.scheme.startAmount) equals the sum of the cohort amounts (pension.cohort.startAmount); differences are reconciled at aggregate level according to fund policy.
- 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.
- Empty cohorts are either delivered explicitly with amount 0 or omitted; agree one convention per chain and record it.
- 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 incorrectThe receiver routes the message incorrectly or rejects it; in the feedback message afdDefinitionName is a fixed value (const) and a deviation yields a schema error.
- 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 reserveDescriptionSchema-valid, but the receiver cannot type the reserve and books it as an ordinary cohort.
- 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 total (consistency check)Schema-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' 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.6).
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.
Schema file: VBPUO-001.00-Bericht_1._Vermogen_(0001a)_v5.json · JSON-schema (001.05) · GitHub
