Release 2027 (pre-release) · Schema version001.05 · Active
SIVI message 4 (00002): Return on investment (VB-PUO)
Message 4 brings the investment result of the period back to pension administration: opening and closing value, net flows and return per investment portfolio, in portfolio currency and as a percentage. Optionally the return is already split per cohort into protection return and excess return. The PUO then allocates the return to the personal pension capitals according to the scheme's allocation rules.
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] · 2 attr.
- financialInformation.reportingPeriod[1..1] · 2 attr.
- investment.portfolio[1..99] · 7 attr.
- pension.cohort[0..99999] · 13 attr.
- pension.scheme[1..999] · 2 attr.
Attributes(50)
| 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 | pensionSchemeName | string · max 60 | V | Name of the pension scheme. | |
| financialInformation.reportingPeriod | endDate | string · format date | V | Expiration date (to date). | |
| 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 | startAmount | number · multipleOf 0.01 | V | Amount (for example of accrued capital) at the start of a period. | |
| investment.portfolio | netAmount | number · multipleOf 0.01 | O | Net sum of contributions and withdrawals per scheme. A negative amount is a (net) withdrawal. | |
| investment.portfolio | description | string · max 60 | V | Description. | |
| investment.portfolio | endAmount | number · multipleOf 0.01 | V | Value (for example accrued capital) at the end of a period. | |
| investment.portfolio | returnPercentage | number · multipleOf 1e-12 | O | The return achieved over a period as a percentage. | |
| investment.portfolio | returnAmount | number · multipleOf 0.01 | V | Amount of return achieved over a period. | |
| 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 | excessReturnPercentage | number · multipleOf 1e-12 | V | The excess return achieved in percentage over the data period per pension scheme and per cohort. | |
| 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 | excessReturnAmount | number · multipleOf 0.01 | V | The excess return achieved in the pension scheme currency over the data period per pension scheme and per cohort. | |
| pension.cohort | protectionReturnAmount | number · multipleOf 0.01 | V | The protection return achieved in the pension scheme currency over the data period per pension scheme and per cohort. | |
| pension.cohort | protectionReturnPercentage | number · multipleOf 1e-12 | V | The protection return achieved in percentage over the data period per pension scheme and per cohort. | |
| pension.cohort | participationStatus | string | O | ADNDNS | Participation type |
Sample message
Sample source: SIVI voorbeeldbericht (Voorbeeldbericht_4). Values are fictitious.
{
"commonTechnical": [
{
"entityType": "default",
"messageId": "1234567890123456789012",
"creationDateTime": "2023-10-28T10:00:00Z",
"testMessage": false,
"party": [
{
"entityType": "receiver",
"refKey": "recv001",
"rsinNumber": "123456789",
"organizationName": "Pension Fund A"
},
{
"entityType": "sender",
"rsinNumber": "987654321",
"organizationName": "Insurance Company B",
"refKey": "send001",
"applicationSenderName": "InsurAppV3"
}
]
}
],
"commonFunctional": [
{
"entityType": "default",
"function": "54",
"afdDefinitionName": "VBPUO-001.00-Bericht_4._Rendementsinformatie_(00002)",
"afdDefinitionVersion": "001.05",
"originalMessageId": "98765432109876543210"
}
],
"party": [
{
"entityType": "pensionProvider",
"puvCode": "U0003",
"organizationName": "PensioenFonds B.V.",
"pension": [
{
"entityType": "scheme",
"refKey": "SCHEME456",
"pensionSchemeName": "BasisPensioen",
"financialInformation": [
{
"entityType": "reportingPeriod",
"startDate": "2023-01-01",
"endDate": "2023-12-31"
}
],
"investment": [
{
"entityType": "portfolio",
"refKey": "PORT123",
"description": "Aandelenfonds",
"startAmount": 500000,
"netAmount": 50000,
"endAmount": 575000,
"returnPercentage": 5,
"returnAmount": 25000
}
],
"pension": [
{
"entityType": "cohort",
"refKey": "COHORT101",
"description": "Cohort 2024",
"startAmount": 300000,
"protectionReturnPercentage": 2,
"excessReturnPercentage": 3,
"protectionReturnAmount": 6000,
"excessReturnAmount": 9000,
"reserveIndicator": false,
"startAge": 300,
"endAge": 540
},
{
"entityType": "cohort",
"refKey": "COHORT102",
"description": "Cohort 2025",
"startAmount": 350000,
"protectionReturnPercentage": 2.5,
"excessReturnPercentage": 3.5,
"protectionReturnAmount": 8750,
"excessReturnAmount": 12250,
"reserveIndicator": false,
"startAge": 540,
"endAge": 780
}
]
}
]
}
]
}Variant: Voorbeeldbericht_4-uitgebreid
{
"commonTechnical": [
{
"entityType": "default",
"messageId": "1234567890123456789012",
"creationDateTime": "2023-10-28T10:00:00Z",
"testMessage": false,
"party": [
{
"entityType": "receiver",
"refKey": "recv001",
"rsinNumber": "123456789",
"organizationName": "Pension Fund A"
},
{
"entityType": "sender",
"rsinNumber": "987654321",
"organizationName": "Insurance Company B",
"refKey": "send001",
"applicationSenderName": "InsurAppV3"
}
]
}
],
"commonFunctional": [
{
"entityType": "default",
"function": "54",
"afdDefinitionName": "VBPUO-001.00-Bericht_4._Rendementsinformatie_(00002)",
"afdDefinitionVersion": "001.05",
"originalMessageId": "98765432109876543210"
}
],
"party": [
{
"entityType": "pensionProvider",
"puvCode": "U0003",
"organizationName": "PensioenFonds B.V.",
"pension": [
{
"entityType": "scheme",
"refKey": "SCHEME456",
"pensionSchemeName": "BasisPensioen",
"financialInformation": [
{
"entityType": "reportingPeriod",
"startDate": "2023-01-01",
"endDate": "2023-12-31"
}
],
"investment": [
{
"entityType": "portfolio",
"refKey": "PORT123",
"description": "Aandelenfonds",
"startAmount": 500000,
"netAmount": 50000,
"endAmount": 550000,
"returnPercentage": 5,
"returnAmount": 25000
}
],
"pension": [
{
"entityType": "cohort",
"refKey": "COHORT101",
"description": "Cohort 2024",
"startAmount": 300000,
"protectionReturnPercentage": 2,
"excessReturnPercentage": 3,
"protectionReturnAmount": 6000,
"excessReturnAmount": 9000,
"reserveIndicator": false,
"startAge": 300,
"endAge": 540
},
{
"entityType": "cohort",
"refKey": "COHORT102",
"description": "Cohort 2025",
"startAmount": 350000,
"protectionReturnPercentage": 2.5,
"excessReturnPercentage": 3.5,
"protectionReturnAmount": 8750,
"excessReturnAmount": 12250,
"reserveIndicator": false,
"startAge": 540,
"endAge": 780
}
]
},
{
"entityType": "scheme",
"refKey": "SCHEME789",
"pensionSchemeName": "PlusPensioen",
"financialInformation": [
{
"entityType": "reportingPeriod",
"startDate": "2024-01-01",
"endDate": "2024-12-31"
}
],
"investment": [
{
"entityType": "portfolio",
"refKey": "PORT225",
"description": "Vastgoedfonds",
"startAmount": 600000,
"netAmount": 75000,
"endAmount": 675000,
"returnPercentage": 6,
"returnAmount": 30000
},
{
"entityType": "portfolio",
"refKey": "PORT1225",
"description": "Liquiditeitsfonds",
"startAmount": 330000,
"netAmount": 6000,
"endAmount": 336000,
"returnPercentage": 6,
"returnAmount": 30000
}
]
}
]
}
]
}Variant: Voorbeeldbericht_4-uitgebreid-MinisforumNAB6
{
"commonTechnical": [
{
"entityType": "default",
"messageId": "1234567890123456789012",
"creationDateTime": "2023-10-28T10:00:00Z",
"testMessage": false,
"party": [
{
"entityType": "receiver",
"refKey": "recv001",
"rsinNumber": "123456789",
"organizationName": "Pension Fund A"
},
{
"entityType": "sender",
"rsinNumber": "987654321",
"organizationName": "Insurance Company B",
"refKey": "send001",
"applicationSenderName": "InsurAppV3"
}
]
}
],
"commonFunctional": [
{
"entityType": "default",
"function": "54",
"afdDefinitionName": "VBPUO-001.00-Bericht_4._Rendementsinformatie_(00002)",
"afdDefinitionVersion": "001.05",
"originalMessageId": "98765432109876543210"
}
],
"party": [
{
"entityType": "pensionProvider",
"puvCode": "U0003",
"organizationName": "PensioenFonds B.V.",
"pension": [
{
"entityType": "scheme",
"refKey": "SCHEME456",
"pensionSchemeName": "BasisPensioen",
"financialInformation": [
{
"entityType": "reportingPeriod",
"startDate": "2023-01-01",
"endDate": "2023-12-31"
}
],
"investment": [
{
"entityType": "portfolio",
"refKey": "PORT123",
"description": "Aandelenfonds",
"startAmount": 500000,
"netAmount": 50000,
"endAmount": 550000,
"returnPercentage": 5,
"returnAmount": 25000
}
],
"pension": [
{
"entityType": "cohort",
"refKey": "COHORT101",
"description": "Cohort 2024",
"startAmount": 300000,
"protectionReturnPercentage": 2,
"excessReturnPercentage": 3,
"protectionReturnAmount": 6000,
"excessReturnAmount": 9000,
"reserveIndicator": false,
"startAge": 300,
"endAge": 540
},
{
"entityType": "cohort",
"refKey": "COHORT102",
"description": "Cohort 2025",
"startAmount": 350000,
"protectionReturnPercentage": 2.5,
"excessReturnPercentage": 3.5,
"protectionReturnAmount": 8750,
"excessReturnAmount": 12250,
"reserveIndicator": false,
"startAge": 540,
"endAge": 780
}
]
},
{
"entityType": "scheme",
"refKey": "SCHEME789",
"pensionSchemeName": "PlusPensioen",
"financialInformation": [
{
"entityType": "reportingPeriod",
"startDate": "2024-01-01",
"endDate": "2024-12-31"
}
],
"investment": [
{
"entityType": "portfolio",
"refKey": "PORT225",
"description": "Vastgoedfonds",
"startAmount": 600000,
"netAmount": 75000,
"endAmount": 675000,
"returnPercentage": 6,
"returnAmount": 30000
},
{
"entityType": "portfolio",
"refKey": "PORT1225",
"description": "Liquiditeitsfonds",
"startAmount": 330000,
"netAmount": 6000,
"endAmount": 336000,
"returnPercentage": 6,
"returnAmount": 30000
}
]
}
]
}
]
}Rules and consistency checks
- Per portfolio startAmount, netAmount, returnAmount and endAmount apply; the receiver checks plausibility: opening value + net flows + return = closing value.
- returnPercentage and the other percentages have at most twelve decimals; amounts at most six (Release 2026).
- Protection return can be determined directly (actual return of one or more protection portfolios) or indirectly (via the interest-rate term structure); the message can carry both variants, the PUO remains responsible for allocation.
- Cohort level (protectionReturnAmount, excessReturnAmount and percentages) is optional; whoever delivers it, delivers it for all cohorts of the scheme.
Pitfalls
- Return in the wrong currency or without the exchange-rate effect: the PUO calculates in euros; fix at which level the currency conversion takes place.
- Several return types in one message (for example gross and net of costs) without a clear description per portfolio make the allocation unreliable.
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.
- 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.
- Percentages with more than twelve decimalsSchema error 'must be multiple of' on returnPercentage, protectionReturnPercentage or excessReturnPercentage.
- reportingPeriod: endDate before startDateThe schema accepts the message; the receiver rejects it functionally or books the flows in the wrong period.
- 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.
- currencyType not an ISO 4217 codeSchema error on currencyType (code list ISOVAL).
- Error discovered after acceptance: the correction protocolAn accepted and processed message turns out to be wrong in content (wrong amount, wrong cohort).
Frequently asked questions
Who sends message 4: the fiduciary manager or the investment administrator?
Preferably the independent investment administrator (leading investment administration); the standard allows the fiduciary manager to send it if the chain is set up that way.
How does message 4 relate to the protection return in the allocation rules?
Message 4 delivers the building blocks: the actual return per portfolio and optionally the split into protection and excess return per cohort. The allocation itself, including any theoretical (term-structure) method, is and remains the PUO's responsibility.
Change history
- v1.2.0 (November 2024): percentages from 2 to 12 decimals.
- v1.3.0 (Release 2026): numeric formats to 6 decimals.
- v1.4.0 (Release 2027): JSON Schema 2020-12.
Schema file: VBPUO-001.00-Bericht_4._Rendementsinformatie_(00002)_v5.json · JSON-schema (001.05) · GitHub
