Sandbox: Initiating a cVRP consent
Testing your integration within the sandbox environment
The sandbox environment is preloaded with specific mock data to allow you to simulate defined outcomes, and behaves in a production-like environments.
Responses are driven by the inputs you provide, remember to structure your requests as shown below to trigger each scenario.
Submit a request with a future validFromDate and validToDate, and all mandatory fields populated.
Creating a cVRP consent
Before submitting, make sure your request adheres to the validation and field requirements set out in Creating a cVRP Consent.
-
Select the initiating bank
Unlike production, the sandbox does not require you to call the ASPSPs endpoint to retrieve a live list of banks. Sandbox requests are pre-configured to route to a single test institution, "Modulr Bank" with ASPSP id
H210000043, which skips the redirect/authorisation step so you can test end-to-end without a real bank connection.Use this ASPSP id as the aspspId in your consent request. This is the ASPSP you are initiating the consent from.
-
To create a consent – use
POST /vrp-consentsand await a return ofvrpConsentInitiationIdwith noredirectUrl. The consent is automatically set toAUTHORISED, so there's no separate authorisation step to complete.The destination in a sandbox request is illustrative and you are able to use your existing sort code, account number, and account ID as the
destinationin these requests.
{
"type": "CVRP1",
"aspspId": "H210000043",
"destination": {
"type": "ACCOUNT",
"accountNumber": "12345678",
"sortCode": "000000",
"name": "GreenWave Energy Ltd"
},
"paymentConstraints": {
"maximumIndividualAmount": {
"currency": "GBP",
"amount": 100
},
"periodicLimits": [
{
"currency": "GBP",
"amount": 200,
"periodAlignment": "CONSENT",
"periodType": "WEEK"
}
]
},
"interactionTypes": ["IN_SESSION", "OFF_SESSION"],
"validFromDate": "2026-07-29T00:15:13Z",
"validToDate": "2027-10-05T15:15:13Z",
"reference": "GWE-VRP-001",
"ultimateCreditor": {
"name": "GreenWave Energy Ltd",
"identification": "12345678",
"lei": "213800GWENERGY0001AB",
"postalAddress": {
"addressType": "BIZZ",
"department": "Finance",
"subDepartment": "Accounts Receivable",
"streetName": "Riverside Way",
"buildingNumber": "45",
"buildingName": "GreenWave House",
"floor": "3",
"unitNumber": "301",
"room": "A",
"postBox": "PO Box 210",
"townLocationName": "Riverside District",
"districtName": "Central",
"careOf": "Accounts Team",
"postCode": "M1 4WE",
"townName": "Manchester",
"countrySubDivision": "Greater Manchester",
"country": "GB",
"addressLine": ["45 Riverside Way", "Riverside District"]
}
},
"risk": {
"merchantCategoryCode": "4900",
"merchantCustomerIdentification": "CUST-001",
"contractPresentIndicator": true,
"beneficiaryPrepopulatedIndicator": true,
"beneficiaryAccountType": "Business",
"deliveryAddress": {
"addressType": "BIZZ",
"department": "Logistics",
"subDepartment": "Dispatch",
"streetName": "Harbour Road",
"buildingNumber": "12",
"buildingName": "Harbour Point",
"floor": "1",
"unitNumber": "1",
"room": "Goods In",
"postBox": "PO Box 118",
"townLocationName": "Docklands",
"districtName": "East",
"careOf": "Warehouse Team",
"postCode": "M2 5AK",
"townName": "Manchester",
"countrySubDivision": "Greater Manchester",
"country": "GB",
"addressLine": ["12 Harbour Road", "Docklands"]
}
}
}{
"vrpConsentInitiationId": "E210000BUJ"
}- You can also check the consent's status –
GET /vrp-consents/{id}returns the consent status.
{
"aspspId": "H210000043",
"destination": {
"type": "ACCOUNT",
"accountNumber": "12345678",
"sortCode": "000000",
"name": "GreenWave Energy Ltd"
},
"paymentConstraints": {
"maximumIndividualAmount": {
"currency": "GBP",
"amount": 100
},
"periodicLimits": [
{
"currency": "GBP",
"amount": 200,
"periodAlignment": "CONSENT",
"periodType": "WEEK"
}
]
},
"validFromDate": "2026-07-29T00:15:13Z",
"validToDate": "2027-10-05T15:15:13Z",
"type": "CVRP1",
"reference": "GWE-VRP-001",
"status": "AUTHORISED",
"interactionTypes": ["OFF_SESSION", "IN_SESSION"]
}Error scenarios
If you wish to test error states, the sandbox retains the same logic as our production environment when validating an invalid consent scenarios.
Below are some example scenarios you can test with, but note that there may other scenarios you may wish to run through yourself.
Scenario 1: Validity dates in the past
To simulate a validation failure caused by expired dates, submit a consent where validFromDate or validToDate fall in the past.
{
"type": "CVRP1",
"aspspId": "H210000043",
"destination": {
"type": "SCAN",
"accountNumber": "12345678",
"sortCode": "000000",
"name": "GreenWave Energy Ltd"
},
"paymentConstraints": {
"maximumIndividualAmount": {
"currency": "GBP",
"amount": 250
},
"periodicLimits": [
{
"currency": "GBP",
"amount": 1000,
"periodAlignment": "CALENDAR",
"periodType": "MONTH"
}
]
},
"interactionTypes": ["InSession", "OffSession"],
"risk": {
"merchantCategoryCode": "4900",
"merchantCustomerIdentification": "CUST-001",
"contractPresentIndicator": true,
"beneficiaryPrepopulatedIndicator": true,
"paymentPurposeCode": "BKDF",
"categoryPurposeCode": "BONU"
},
"validFromDate": "2023-01-01T00:00:00Z",
"validToDate": "2026-12-01T00:00:00Z",
"reference": "GWE-VRP-001"
}{
"field": "validToDate",
"code": "INVALID",
"message": "validToDate must be a future date"
}Scenario 2: Individual amount exceeds periodic limit
To simulate a constraint validation failure, submit a consent where maximumIndividualAmount is greater than the periodicLimits amount. A single payment cannot be permitted to exceed the total period cap.
{
"type": "CVRP1",
"aspspId": "H210000043",
"destination": {
"type": "SCAN",
"accountNumber": "12345678",
"sortCode": "000000",
"name": "GreenWave Energy Ltd"
},
"paymentConstraints": {
"maximumIndividualAmount": {
"currency": "GBP",
"amount": 2000
},
"periodicLimits": [
{
"currency": "GBP",
"amount": 1000,
"periodAlignment": "CALENDAR",
"periodType": "MONTH"
}
]
},
"interactionTypes": ["InSession", "OffSession"],
"risk": {
"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": "GWE-VRP-001"
}{
"field": "paymentConstraints.maximumIndividualAmount",
"code": "INVALID",
"message": "maximumIndividualAmount must not exceed the periodicLimits amount"
}Updated 1 day ago

