Release 2027 (pre-release) · Schema version001.05 · Active
SIVI message 2 (0001b): Cashflow (VB-PUO)
Message 2 reports the cash flows of the period: contributions and incoming value transfers (inflow), benefit payments and outgoing transfers (outflow) and shifts between cohorts. The flows are delivered per scheme and per cohort, or netted as a net cashflow. Contributions to and withdrawals from reserves (solidarity reserve, compensation deposit) also use this message.
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.
- financialTransaction.cashflow[0..1] · 6 attr.
- investment.portfolio[0..99] · 2 attr.
- financialTransaction.cashflow[1..1] · 2 attr.
- pension.cohort[0..99999] · 12 attr.
- pension.scheme[1..999] · 2 attr.
Attributes(52)
| 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). | |
| financialTransaction.cashflow | netAmount | number · multipleOf 0.01 | O | Net sum of contributions and withdrawals per scheme. A negative amount is a (net) withdrawal. | |
| financialTransaction.cashflow | withdrawalDate | string · format date | O | Date on which (at the latest) the liquidity for the withdrawal has been released. | |
| financialTransaction.cashflow | withdrawalAmount | number · multipleOf 0.01 | O | Withdrawal amount. | |
| financialTransaction.cashflow | contributionDate | string · format date | O | Date of (receipt of) the contribution. | |
| financialTransaction.cashflow | contributionAmount | number · multipleOf 0.01 | O | Amount of contribution. | |
| financialTransaction.cashflow | netDate | string · format date | O | Date on which netted inflow and outflow is facilitated. | |
| investment.portfolio | refKey | string · max 70 | V | Unique reference key assigned to an entity. | |
| investment.portfolio | description | string · max 60 | V | Description. | |
| financialTransaction.cashflow | netAmount | number · multipleOf 0.01 | V | Net sum of contributions and withdrawals per scheme. A negative amount is a (net) withdrawal. | |
| financialTransaction.cashflow | netDate | string · format date | V | Date on which netted inflow and outflow is facilitated. | |
| pension.cohort | refKey | string · max 70 | V | Unique reference key assigned to an entity. | |
| pension.cohort | netAmount | number · multipleOf 0.01 | O | Net sum of contributions and withdrawals per scheme. A negative amount is a (net) withdrawal. | |
| pension.cohort | withdrawalAmount | number · multipleOf 0.01 | O | Withdrawal amount. | |
| pension.cohort | contributionAmount | number · multipleOf 0.01 | O | Amount of contribution. | |
| pension.cohort | netDate | string · format date | O | Date on which netted inflow and outflow is facilitated. | |
| 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 |
Sample message
Sample source: SIVI voorbeeldbericht (Voorbeeldbericht_2). Values are fictitious.
{
"commonTechnical": [
{
"entityType": "default",
"creationDateTime": "2023-12-28T12:00:00Z",
"messageId": "msg123456",
"testMessage": false,
"party": [
{
"entityType": "sender",
"refKey": "SEND123",
"organizationName": "Zender Organisatie",
"applicationSenderName": "ApplicatieNaam",
"party": [
{
"entityType": "contact",
"emailWork": "[email protected]",
"workPhoneNumber": "+31678717607"
}
]
},
{
"entityType": "receiver",
"refKey": "REC123",
"rsinNumber": "987654321",
"organizationName": "Ontvanger Organisatie"
}
]
}
],
"commonFunctional": [
{
"entityType": "default",
"afdDefinitionName": "VBPUO-001.00-Bericht_2._Cashflow_(0001b)",
"afdDefinitionVersion": "001.05",
"function": "01",
"originalMessageId": "987654321"
}
],
"party": [
{
"entityType": "pensionProvider",
"rsinNumber": "123456789",
"organizationName": "Pensioenverstrekker",
"puvCode": "U0003",
"pension": [
{
"entityType": "scheme",
"refKey": "SCH456",
"pensionSchemeName": "Standaard Pensioen",
"financialInformation": [
{
"entityType": "reportingPeriod",
"startDate": "2023-01-01",
"endDate": "2023-12-31"
}
],
"financialTransaction": [
{
"entityType": "cashflow",
"contributionAmount": 15000,
"contributionDate": "2023-01-01",
"withdrawalAmount": 4000,
"withdrawalDate": "2023-01-15",
"netAmount": 11000,
"netDate": "2023-01-31"
}
],
"pension": [
{
"entityType": "cohort",
"refKey": "COH789",
"description": "Cohort 2023",
"netAmount": 5000,
"contributionAmount": 7000,
"withdrawalAmount": 2000,
"participationStatus": "16",
"reserveIndicator": false,
"startAge": 300,
"endAge": 540
},
{
"entityType": "cohort",
"refKey": "COH790",
"description": "Cohort 2024",
"netAmount": 6000,
"contributionAmount": 8000,
"withdrawalAmount": 2000,
"participationStatus": "16",
"reserveIndicator": false,
"startAge": 540,
"endAge": 780
}
]
},
{
"entityType": "scheme",
"refKey": "SCH457",
"pensionSchemeName": "Geavanceerd Pensioen",
"financialInformation": [
{
"entityType": "reportingPeriod",
"startDate": "2023-03-01",
"endDate": "2023-12-31"
}
],
"financialTransaction": [
{
"entityType": "cashflow",
"contributionAmount": 16000,
"contributionDate": "2023-03-01",
"withdrawalAmount": 4000,
"withdrawalDate": "2023-03-15",
"netAmount": 12000,
"netDate": "2023-03-31"
}
],
"pension": [
{
"entityType": "cohort",
"refKey": "COH791",
"description": "Cohort 2025",
"netAmount": 5500,
"contributionAmount": 7500,
"withdrawalAmount": 2000,
"participationStatus": "16",
"reserveIndicator": false,
"startAge": 400,
"endAge": 520
},
{
"entityType": "cohort",
"refKey": "COH792",
"description": "Cohort 2026",
"netAmount": 6500,
"contributionAmount": 8500,
"withdrawalAmount": 2000,
"participationStatus": "16",
"reserveIndicator": false,
"startAge": 520,
"endAge": 900
}
]
}
]
}
],
"document": []
}Rules and consistency checks
- Inflow and outflow are delivered either separately (contributionAmount and withdrawalAmount with their dates) or netted (netAmount with netDate). Both forms in one cohort is not intended.
- The SPR route (per cohort) and the FPR route (per investment portfolio) are mutually exclusive: choose one pattern per message.
- Cohort totals reconcile to scheme level; the cohort structure is identical to that of message 1.
- All dates fall within the reporting period (financialInformation.reportingPeriod.startDate to endDate).
Pitfalls
- A prospective message (expected flows) that is not followed later by the realised flows leaves the investment administration with an estimate; agree which variant is leading.
- netDate is often missing with netted delivery; since the documentation update of October 2025 (issue #82) it is clear that the date belongs with the net amount.
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.
- 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.
- contributionAmount/withdrawalAmount and netAmount filled togetherSchema-valid; the receiver double-counts the flows or does not know which is leading.
- Error discovered after acceptance: the correction protocolAn accepted and processed message turns out to be wrong in content (wrong amount, wrong cohort).
Difference from Release 2026(001.04 → 001.05)
Entitiesadded:investment.portfolio
Attributesadded:investment.portfolio.refKey, investment.portfolio.description, pension.cohort.netDate
Obligation changed:financialTransaction.cashflow.netAmount (O → V), financialTransaction.cashflow.netDate (O → V)
Frequently asked questions
Do I have to deliver inflow and outflow separately?
You may, but you do not have to: the standard also allows a netted cashflow (netAmount). Fiduciary managers often prefer separate flows because they support liquidity planning.
How do I report a shift between cohorts?
As an outflow at one cohort and an inflow at the other, in the same period. The scheme total does not change.
Where do reserve contributions belong?
With the reserve cohort (reserveIndicator = true, reserveType from AFDRES) as inflow or outflow, just like an ordinary cohort.
Change history
- v1.3.0 (Release 2026): netDate documentation (issue #82); chunking.
- v1.4.0 (Release 2027): SPR route and FPR route described as fill-in patterns; JSON Schema 2020-12.
Schema file: VBPUO-001.00-Bericht_2._Cashflow_(0001b)_v5.json · JSON-schema (001.05) · GitHub
