Creating a cVRP Consent

Creating a cVRP Consent

Purpose of cVRP consent

📘

The cVRP consent defines the parameters within which cVRP payments can be made.

Setting up the consent means a user does not need to authenticate individual payments with their bank, as long as each payment stays within the agreed limits.

The consent process generates a Consent ID which is then used to initiate subsequent cVRP payments.

Consent must be in place before any cVRP payment can be made.

Consent parameters

There are 5 core parameters contained in the consent, plus additional fields that are mandatory for cVRP:

  1. Time period -- period during which the maximum amount per period is applied. Must be one of: Day, Week, Fortnight, Month, Half-Year, Year
  2. Maximum amount per period -- limit on the cumulative value of payments within the time period. Mandatory.
  3. Maximum amount per payment -- limit on the value of any individual payment. Mandatory.
  4. Period start date -- date the consent starts from. Optional; if left blank, the value provided by the bank is used.
  5. Expiry date -- date the consent ends. Optional; if left blank, the value provided by the bank is used.

The following fields are additionally mandatory for cVRP:

  • Type -- must be CVRP1 for Wave 1 use cases.
  • Interaction types -- whether payments will be made while the user is actively present (IN_SESSION) or in the background without user interaction (OFF_SESSION). At least one must be provided. We recommend providing both IN_SESSION and OFF_SESSION if you will be supporting both payment modes, which will allow you to pass either one in the cVRP payment itself.
  • Risk -- a block of fields describing the payment context. Most fields are mandatory for cVRP; see the field definitions table below for detail.
  • Ultimate Creditor / Ultimate Debtor -- mandatory to capture the ultimate beneficiary or payer where they differ from the named account holder.

Creating a cVRP consent

The diagram below provides a high-level overview of the cVRP consent creation process.

Step 1: List the banks that support cVRP

As part of the consent authentication process the user will need to select their bank so they can be directed to the relevant authentication URL.

Use the GET ASPSPs API to fetch the latest list of banks and their supported capabilities. Only institutions that have COMMERCIAL_VRP status ENABLED should be offered to the user.

This list may change over time as banks are added or their capabilities updated, so your application must handle changes dynamically.

[
  {
    "type": "SINGLE_IMMEDIATE",
    "status": "ENABLED"
  },
  {
    "type": "SWEEPING_VRP",
    "status": "ENABLED"
  },
  {
    "type": "COMMERCIAL_VRP",
    "status": "ENABLED"
  }
]

Step 2: Create a cVRP consent

Request

This request creates a cVRP consent for authorisation by the user. Once authorised, the consent can be used to initiate one or more payments within its parameters.

{
  "type": "CVRP1",
  "aspspId": "H100000001",
  "destination": {
    "type": "SCAN",
    "accountNumber": "12345678",
    "sortCode": "000000",
    "name": "Example Merchant Ltd"
  },
  "paymentConstraints": {
    "maximumIndividualAmount": {
      "currency": "GBP",
      "amount": 250
    },
    "periodicLimits": [
      {
        "currency": "GBP",
        "amount": 1000,
        "periodAlignment": "CALENDAR",
        "periodType": "MONTH"
      }
    ]
  },
  "interactionTypes": [
    "IN_SESSION",
    "OFF_SESSION"
  ],
  "risk": {
    "paymentContextCode": "BillingGoodsAndServicesInAdvance",
    "merchantCategoryCode": "4900",
    "merchantCustomerIdentification": "CUST-001",
    "contractPresentIndicator": true,
    "beneficiaryPrepopulatedIndicator": true,
    "paymentPurposeCode": "BKDF",
    "categoryPurposeCode": "BONU"
  },
  "validFromDate": "2025-01-01T00:00:00Z",
  "validToDate": "2026-01-01T00:00:00Z",
  "reference": "Invoice ABC123"
}

Response - created

{
  "vrpConsentInitiationId": "I000000001",
  "redirectUrl": "https://www.bankofmoney.com/authorize"
}

Response - bad request

{
  "field": "string",
  "code": "GENERAL",
  "errorCode": "string",
  "message": "string",
  "sourceService": "string"
}

Consent parameter definitions

📘

M = Mandatory | O = Optional | C = Conditional

  • For Payment Purpose Code and Category Purpose Code, refer to the list here for the most appropriate one for your consent: OB ISO External Codeset
    • For Payment Purpose Code - use ExternalPurpose1Code from link above
    • For Category Purpose Code - use ExternalCategoryPurpose1Code from link above

FieldDescriptionTypeM/O/CValidation
typeThe cVRP consent type. Must be CVRP1 for Wave 1 integrations.EnumMMust be CVRP1.
aspspIdIdentifier of the user's bank where the consent will be created. The bank must have COMMERCIAL_VRP capability enabled.StringMBank must have COMMERCIAL_VRP enabled, otherwise the request is rejected.
destinationDestination account that will receive payments initiated under this consent.ObjectM-
destination.typeType of destination account. Use ACCOUNT for a Modulr account or SCAN for an external account with sort code and account number.EnumMACCOUNT or SCAN.
destination.idModulr account identifier. Required when destination.type is ACCOUNT.StringCRequired if destination.type is ACCOUNT.
destination.accountNumberAccount number of the destination. Required when destination.type is SCAN.StringCRequired if destination.type is SCAN.
destination.sortCodeSort code of the destination. Required when destination.type is SCAN.StringCRequired if destination.type is SCAN.
destination.nameName of the destination account. Required when destination.type is SCAN.StringCRequired if destination.type is SCAN.
paymentConstraintsLimits that apply to payments made under this consent.ObjectM-
paymentConstraints.maximumIndividualAmountMaximum value of any single payment made under this consent.ObjectM-
paymentConstraints.maximumIndividualAmount.amountMaximum individual payment amount.StringMPositive value, max two decimal places.
paymentConstraints.maximumIndividualAmount.currencyCurrency. Must be in ISO 4217 format.StringMOnly GBP is supported.
paymentConstraints.periodicLimitsMaximum cumulative value of all payments in a given period. At least one periodic limit is required.ArrayMAt least one limit must be supplied. No duplicate period types.
paymentConstraints.periodicLimits.amountMaximum cumulative amount for the period.StringM-
paymentConstraints.periodicLimits.currencyCurrency. Must be in ISO 4217 format.StringMOnly GBP is supported.
paymentConstraints.periodicLimits.periodAlignmentWhether the period starts from the date of consent creation (CONSENT) or aligns to the calendar (CALENDAR).EnumMCONSENT or CALENDAR. Only one type per consent.
paymentConstraints.periodicLimits.periodTypeThe period length.EnumMDAY, WEEK, FORTNIGHT, MONTH, HALF_YEAR, or YEAR. No duplicates.
interactionTypesWhether payments will be made while the user is present or in the background. Mandatory for cVRP.ArrayMOne or both of InSession, OffSession.
risk.paymentContextCodeDescribes the payment context.StringMSee Open Banking specification for valid values.
risk.merchantCategoryCodeFour-digit MCC code identifying the merchant's business type.StringM-
risk.merchantCustomerIdentificationThe merchant's identifier for the customer.StringM-
risk.contractPresentIndicatorIndicates whether a contract is in place between the merchant and the customer.BooleanM-
risk.beneficiaryPrepopulatedIndicatorIndicates whether the beneficiary details were pre-populated.BooleanM-
risk.paymentPurposeCodeISO 20022 purpose code describing the reason for the payment.StringM-
risk.categoryPurposeCodeISO 20022 category purpose code.StringM-
risk.deliveryAddressDelivery address associated with the payment.ObjectOOptional for cVRP.
risk.beneficiaryAccountTypeType of beneficiary account (e.g. Business, Personal).StringOOptional for cVRP.
ultimateCreditorThe ultimate recipient of the payment, where different from the destination account holder.ObjectOFull structure including name, identification, and postal address. cVRP only.
ultimateDebtorThe ultimate payer, where different from the account holder authorising the consent.ObjectOFull structure including name, identification, and postal address. cVRP only.
validFromDateDate and time from which payments can be initiated. Format: YYYY-MM-DDTHH:mm:ssZ. If not provided, the bank's value is used.ISODateTimeOMust be before or equal to validToDate.
validToDateDate and time after which no further payments can be initiated. Format: YYYY-MM-DDTHH:mm:ssZ. If not provided, the bank's value is used.ISODateTimeOMust be after or equal to validFromDate.
referenceA reference for the consent. Min 6, max 18 characters. Alphanumeric plus -, ., &, /, and space.StringMMin 6, max 18 characters.

Regarding paymentConstraints.periodicLimits.periodAlignment, the definitions for CONSENT and CALENDAR are as follows:

Period AlignmentDefinition
CONSENTThe maximum amount resets from the moment the user authorises the consent.
CALENDARThe maximum amount is based on calendar dates. If the user authorises the consent partway through a period, the limit is pro-rated for the remainder of that period. For example, a £1,000 monthly limit authorised halfway through the month allows £500 for the rest of that month, then resets to £1,000 at the start of the next.

Retrieve a cVRP consent (optional)

Use the Consent ID to retrieve the full details of a cVRP consent. The response includes all fields submitted at creation, plus the current consent status. Only the customer or partner that created the consent can retrieve it.

{
  "type": "CVRP1",
  "aspspId": "H100000001",
  "destination": {
    "type": "SCAN",
    "accountNumber": "12345678",
    "sortCode": "000000",
    "name": "Example Merchant Ltd"
  },
  "paymentConstraints": {
    "maximumIndividualAmount": {
      "currency": "GBP",
      "amount": 250
    },
    "periodicLimits": [
      {
        "currency": "GBP",
        "amount": 1000,
        "periodAlignment": "CALENDAR",
        "periodType": "MONTH"
      }
    ]
  },
  "interactionTypes": ["OffSession"],
  "risk": {
    "paymentContextCode": "BillingGoodsAndServicesInAdvance",
    "merchantCategoryCode": "4900",
    "merchantCustomerIdentification": "CUST-001",
    "contractPresentIndicator": true,
    "beneficiaryPrepopulatedIndicator": true,
    "paymentPurposeCode": "BKDF",
    "categoryPurposeCode": "BONU"
  },
  "validFromDate": "2025-01-01T00:00:00Z",
  "validToDate": "2026-01-01T00:00:00Z",
  "reference": "Invoice ABC123",
  "status": "AUTHORISED"
}

Consent status model

Consent StateDescription
AWAITING_AUTHORISATIONThe consent is awaiting authorisation by the user.
AUTHORISEDThe consent has been successfully authorised.
REJECTEDThe consent was rejected by the user.
REVOKEDThe consent has been revoked.
EXPIREDThe consent has expired. Only applicable if an expiry date was set.
ER_GENERALA generic error occurred when processing the consent.
ER_EXTSYSThe consent failed because of a problem communicating with the bank's systems.

Revoke a cVRP consent

Use the Consent ID to revoke a cVRP consent. This immediately prevents any further payments being initiated under that consent. The consent details remain retrievable after revocation.

DELETE https://api.modulrfinance.com/vrp-consents/I000000001
202 Accepted
🚧

Warning

Revoked consents cannot be reinstated. If the user wishes to continue making payments, a new consent must be created and authorised.