Release 2027 · Schema version 001.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. Every cashflow carries the balance (netAmount with netDate), optionally supplemented by inflow and outflow separately. The total sits directly under the scheme; the breakdown is per cohort (SPR route) or per investment portfolio (FPR route). 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] · 6 attr.
- pension.cohort[0..99999] · 12 attr.
- pension.scheme[1..999] · 2 attr.
Attributes (56)
| 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_2._Cashflow_(0001b) | 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 | 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 | V | 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 | V | 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 | Gesaldeerd netto kasstroombedrag per beleggingsportefeuille binnen een regeling. Een negatief bedrag is een netto onttrekking. | |
| financialTransaction.cashflow | withdrawalDate | string · format date | O | Datum waarop (uiterlijk) de liquiditeiten ten behoeve van de onttrekking zijn vrijgemaakt | |
| financialTransaction.cashflow | withdrawalAmount | number · multipleOf 0.01 | O | Som van de uitstroom | |
| financialTransaction.cashflow | contributionDate | string · format date | O | Datum van ontvangst van de inleg | |
| financialTransaction.cashflow | contributionAmount | number · multipleOf 0.01 | O | Som van inleg | |
| financialTransaction.cashflow | netDate | string · format date | V | De valutadatum waarop het netto kasstroombedrag per beleggingsportefeuille daadwerkelijk door de PUO wordt betaald aan, of ontvangen van, de Vermogensbeheerder | |
| pension.cohort | refKey | string · max 70 | V | Unique reference key assigned to an entity. | |
| pension.cohort | netAmount | number · multipleOf 0.01 | V | 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 | V | De valutadatum waarop het gesaldeerde netto kasstroombedrag voor het cohort daadwerkelijk door de PUO wordt betaald aan, of ontvangen van, de Vermogensbeheerder | |
| 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 |
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": "St. Pf. Openbare Bibliotheken",
"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,
"netDate": "2023-01-31"
},
{
"entityType": "cohort",
"refKey": "COH790",
"description": "Cohort 2024",
"netAmount": 6000,
"contributionAmount": 8000,
"withdrawalAmount": 2000,
"participationStatus": "16",
"reserveIndicator": false,
"startAge": 540,
"endAge": 780,
"netDate": "2023-01-31"
}
]
},
{
"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,
"netDate": "2023-03-31"
},
{
"entityType": "cohort",
"refKey": "COH792",
"description": "Cohort 2026",
"netAmount": 6500,
"contributionAmount": 8500,
"withdrawalAmount": 2000,
"participationStatus": "16",
"reserveIndicator": false,
"startAge": 520,
"endAge": 900,
"netDate": "2023-03-31"
}
]
}
]
}
],
"document": []
}Variant: Voorbeeldbericht_2-fpr
{
"commonTechnical": [
{
"entityType": "default",
"creationDateTime": "2027-03-01T09:00:00+01:00",
"messageId": "VB-0001B-FPR-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_2._Cashflow_(0001b)",
"afdDefinitionVersion": "001.05",
"function": "01"
}
],
"party": [
{
"entityType": "pensionProvider",
"puvCode": "U0393",
"organizationName": "Pensioenfonds Metaal en Techniek",
"pension": [
{
"entityType": "scheme",
"refKey": "REG-01",
"pensionSchemeName": "Flexibele regeling Voorbeeld",
"financialInformation": [
{
"entityType": "reportingPeriod",
"startDate": "2027-02-01",
"endDate": "2027-02-28"
}
],
"financialTransaction": [
{
"entityType": "cashflow",
"netAmount": 2453092.12,
"netDate": "2027-03-05"
}
],
"investment": [
{
"entityType": "portfolio",
"refKey": "PF-01",
"description": "Matchingportefeuille",
"financialTransaction": [
{
"entityType": "cashflow",
"contributionAmount": 1977728.18,
"contributionDate": "2027-02-28",
"withdrawalAmount": 1129773.18,
"withdrawalDate": "2027-03-01",
"netAmount": 847955,
"netDate": "2027-03-05"
}
]
},
{
"entityType": "portfolio",
"refKey": "PF-02",
"description": "Rendementsportefeuille",
"financialTransaction": [
{
"entityType": "cashflow",
"contributionAmount": 2200605.01,
"contributionDate": "2027-02-28",
"withdrawalAmount": 567819.01,
"withdrawalDate": "2027-03-01",
"netAmount": 1632786,
"netDate": "2027-03-05"
}
]
},
{
"entityType": "portfolio",
"refKey": "PF-03",
"description": "Liquiditeitenportefeuille",
"financialTransaction": [
{
"entityType": "cashflow",
"contributionAmount": 879827.97,
"contributionDate": "2027-02-28",
"withdrawalAmount": 907476.85,
"withdrawalDate": "2027-03-01",
"netAmount": -27648.88,
"netDate": "2027-03-04"
}
]
}
]
}
]
}
]
}Rules and consistency checks
- Since the final Release 2027 every cashflow block carries netAmount and netDate: directly under the scheme, per cohort and per investment portfolio. contributionAmount and withdrawalAmount are an optional addition, under the scheme and per portfolio with contributionDate and withdrawalDate; SIVI's own sample message fills all three. netAmount is the balance of contribution and withdrawal, so three amounts that do not match contradict each other. In Release 2026 the balance, the separate flows or both are allowed.
- In both routes the total sits directly under the scheme (financialTransaction.cashflow). What excludes each other per scheme is the breakdown: per cohort (SPR route; the amounts sit on the cohort itself) or per investment portfolio (FPR route; every portfolio used has exactly one cashflow). A message that uses both breakdowns within one scheme is "niet geldig" (not valid). The breakdown itself is optional in message 2, but every scheme carries at least one cashflow (manual sections 6.3.1 and 3.2.5).
- When the cashflow is broken down per cohort, the cohort amounts add up to the amount at scheme level. Release 2027 makes that a consistency check (manual sections 6.3.1 and 3.2.5: scheme.netAmount is the sum of cohort.netAmount, and the same for contributionAmount and withdrawalAmount); in Release 2026 it is a reconciliation the receiver can check. In the FPR route the total carries, as a rule, the sum of the portfolios, but whether it must add up is "niet vastgelegd" (not laid down). Mind contributionAmount and withdrawalAmount: the inflow and outflow of a cohort also hold the shifts between cohorts (section 3.2.2); those cancel out in netAmount, not in inflow and outflow separately. Keep the cohort structure the same as in 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, especially per cohort. Since the final Release 2027 that is a schema error: netAmount and netDate are mandatory in every cashflow block. The published schema only counts the valid cohorts (issue #63), so a generic validator lets it pass; a receiver that checks every cohort does not. SIVI's own pre-release sample had this defect.
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.
- 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.
- netAmount is not the balance of contributionAmount and withdrawalAmountSchema-valid; the receiver does not know which amount is leading, or double-counts the flows.
- netAmount or netDate missing in a cashflow block (message 2)Schema error 'must have required property' on netDate or netAmount, at a cohort, at the cashflow under the scheme or at an investment portfolio. A generic JSON Schema validator often misses the error at a cohort.
- Scheme with both cohorts and portfolios, or without a breakdown or cashflow (messages 2 and 3)Schema-valid, but the receiver cannot assign the flows or the projection to the right route. The WTP Data Lab validator reports an error at the scheme.
- 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)
Entities added: investment.portfolio
Attributes added: investment.portfolio.refKey, investment.portfolio.description, pension.cohort.netDate
Obligation changed: financialTransaction.cashflow.netAmount (O → V), financialTransaction.cashflow.netDate (O → V), pension.cohort.netAmount (O → V)
Frequently asked questions
Do I have to deliver inflow and outflow separately?
You may, but you do not have to. In Release 2027 netAmount and netDate are always mandatory; separate inflow and outflow are an addition to them. Fiduciary managers often prefer separate flows because they support liquidity planning.
May an investment portfolio sit next to the cashflow directly under the scheme?
Yes. In the FPR route the total sits directly under the scheme and the breakdown follows per portfolio; SIVI's sample Voorbeeldbericht_2-fpr does exactly that. Only cohorts and portfolios in one scheme is not valid. The July pre-release also forbade the combination with the cashflow under the scheme.
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; JSON Schema 2020-12.
- Final Release 2027 (12 October 2026): netAmount and netDate mandatory in every cashflow block, also per cohort; the cashflow per portfolio may also carry inflow and outflow; the routes in section 6.3.1 and the new section 3.2.5.
Schema file: VBPUO-001.00-Bericht_2._Cashflow_(0001b).json · JSON-schema (001.05) · GitHub
