NL-R-003: Dutch supplier company ID
A Dutch supplier CompanyID must use KVK scheme 0106 or OIN scheme 0190. A VAT identifier does not satisfy this rule.
422 instead of letting this fail later on the network.What NL-R-003 actually checks
When a supplier CompanyID is present for a Dutch supplier, its value must be non-empty and use schemeID 0106 or 0190. Scheme 0106 is a KVK number (Dutch Chamber of Commerce, NL:KVK); scheme 0190 is an OIN (NL:OINO).
CompanyID. It does not, by itself, assert that the element must exist. getpeppr applies a separate pre-send product gate: a Dutch legal entity needs a registered KVK or OIN so the generated document carries a compliant identifier.A VAT number uses a different identifier scheme. Even when the VAT registration is valid, it cannot stand in for KVK or OIN under NL-R-003.
Source: Peppol BIS Billing 3.0, NL-R-003 (v3.0.20) and the Peppol eDEC identifier schemes v9.7.
Fix it on getpeppr
- 1Open the Peppol identity page for the Dutch legal entity.
- 2Register the KVK under scheme
0106, or the OIN under0190. - 3Retry the send. The gateway injects the registered identifier into the outgoing supplier party.
from.companyId and from.companyIdScheme does not replace the registered identity. The provider renders the supplier party from the legal entity, so getpeppr always resolves and injects the registered KVK or OIN.Recognise the response
getpeppr returns 422 with error: "country_rule_violation" and the official rule code before calling the provider. Treat this as a non-retryable identity configuration error: register the right identifier, then retry.
{
"error": "country_rule_violation",
"code": "NL-R-003",
"message": "Dutch suppliers must include a KVK or OIN number...",
"docs": "https://docs.peppol.eu/poacc/billing/3.0/rules/ubl-peppol/NL-R-003/"
}If you build UBL yourself
Put the legal identifier on the supplier's PartyLegalEntity/CompanyID. Use 0190 and a 20-digit value for an OIN instead.
0106 must be 8 digits; OIN values under 0190 must be 20 digits. These warnings are expected to become fatal in a later release.<cac:AccountingSupplierParty>
<cac:Party>
<cac:PartyLegalEntity>
<cbc:CompanyID schemeID="0106">12345678</cbc:CompanyID>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>Keep downstream failures visible
NL-R-003 is blocked synchronously by getpeppr, but other network failures can still arrive asynchronously. Subscribe to invoice.error and acknowledge webhook event types you do not recognise with a 2xx. That prevents a future additive event type from creating an avoidable retry loop.
The Netherlands profile contains nine fatal rules, from NL-R-001 through NL-R-009. For example, NL-R-007 requires payment means when an Invoice has a positive PayableAmount, or a Credit Note has a negative PayableAmount.
Test the fix
Send a compliant document in sandbox
A sandbox account is free and needs no card. Register a test identity, send one document, and inspect the response before touching production.
Create a free sandbox account