Variable Recurring Payments (VRP)
Variable Recurring Payments (VRP) enable a user to grant long-held consents to Payment Initiation Service Providers (PISP) to initiate future payments from users' bank accounts without users needing to authenticate each payment with the bank.
VRP facilitates innovation in payment experiences, the creation of new types of financial services, and greater levels of consumer transparency and control. VRP should not be seen as a use case but rather as the underlying technical functionality upon which use cases can be developed. For more details on the experiences that can be enabled by VRP, see our blog post, Bringing the benefits of Variable Recurring Payments to life.
Token.io's VRP functionality consists of two main parts:
-
Consent set up - establishment of the long-held consent to allow a TPP to initiate payments on behalf of the user with a set of control parameters.
-
Payment initiation - initiation of a variable recurring payment adhering to the control parameters of the approved consent.
Token.io's API supports capabilities covering the end-to-end management, execution and monitoring of variable recurring payments. In addition, Token.io offers an out-of-the-box user experience to TPPs to help setup and initiate VRP payments.
The Token.io API supports the VRP OBIE 3.1.10 specification.
Sweeping and commercial VRP
Token.io supports both sweeping and commercial (also known as non-sweeping) VRP. As it stands today, there is no technical distinction between sweeping and commercial VRP; the distinction therefore relates not to what the service is, but rather what it is used for.
Sweeping
Sweeping VRP is defined as the movement of a user's own funds between the user's own accounts.
The OBIE VRP Proposition defines VRP transactions as 'sweeping', on a high level, when they meet the following criteria:
-
The source account needs to be a current account
-
The destination account is an account into which a domestic payment can be made by the payer’s bank’s direct channel, e.g., savings account, another current account, credit card repayment
-
The transaction is between two accounts belonging to the same person or legal entity (“me-to-me”).
Further clarifications on what constitutes a sweeping use case can be sought in the OBIE VRP Proposition, the CMA’s March 2022 letter to the OBIE and the Q&As document published in July 2022. Please engage with your Token.io point of contact should you need any support in understanding whether your use case is sweeping or commercial VRP.
Examples of key sweeping VRP use cases include:
-
Automated (regular and scheduled) top-ups to savings and current accounts.
-
One-click top-ups to savings and current accounts.
-
Automated (regular and scheduled) repayments for credit cards.
-
One-click repayments for credit cards.
Commercial
Commercial VRP refers to any use of VRP functionality that lies outside the definition of sweeping. This can manifest itself in two ways:
Examples of commercial VRP use cases include:
-
One-click ecommerce purchases.
-
Recurring payments (e.g., utility bill payments, subscription payments, government payments).
-
Account top-ups (e.g., transfer of funds to an investment account, transfer of funds to any other account that can have a balance, like a mobile phone pay-as-you-go account).
VRP consent set up
VRP requires a one-time bank authentication and authorization that defines the parameters within which future transactions can be initiated without authentication. These parameters can include end date, maximum aggregate amount per period (e.g., month) and maximum amount per individual transaction.
This consent may be set up using either:
The user may revoke consent with the bank at any time via the TPP.
Hosted Pages (HP) integration
|
This section describes the integration where the TPP uses Token.io's HP for all or some of the steps in the user journey for setting up VRP consent.
Click the image on the right to view a simplified swim lane diagram of the integration flow.
Details of the steps within the integration flow are shown below.
|
|
- User initiates VRP consent set up
The user initiates the VRP consent set up with the TPP.
-
User -> TPP - The user initiates a request to the TPP to grant consent for VRP. The initiation of consent uses the TPP's interface.
- User sets VRP consent limits
The user sets the limits of the VRP consent with the TPP.
-
User -> TPP - The user sets the limits of the VRP consent with the TPP. This is usually a maximum amount per transaction and a maximum amount per day.
- TPP sends VRP consent request to Token.io
The TPP initiates the consent request with Token.io using the POST /vrp-consents call.
-
TPP -> Token.io - The TPP initiates the consent request with Token.io, including the instruction details, using the POST /vrp-consents call.
-
Token.io -> TPP - Token.io confirms receipt of the request from the TPP, which includes a VRP consent id in the response.
- TPP redirects user to Token.io HP
The TPP redirects the user to Token.io's HP for payment consent confirmation.
-
TPP -> Token.io - The TPP redirects the user to the Token.io HP at https://{{base-url}}/app/initiation?vrp-consent-id={vrp-consent-id}.
See Hosted Pages for details on how to construct the redirect URL.
- User selects bank
The user selects the bank from the Token.io HP.
-
Token.io -> User - Token.io displays the bank selection screen.
We recommend using the countries parameter in the request here, which can be used to pre-populate the Country field.
-
User -> Token.io - The user selects the bank.
- Token.io collects VRP consent from user
Token.io collects VRP consent from the user.
-
Token.io -> User - Token.io displays the VRP consent confirmation page to the user.
-
TPP -> Token.io - The TPP confirms consent with Token.io.
- User completes authorization with bank
The user completes authorization with the bank using the appropriate method; redirect, embedded or decoupled.
-
Bank -> User - The bank displays the authorization page to the user.
-
User -> Bank - The user authorizes the VRP consent creation with the bank.
- Bank confirms VRP consent set up request
The bank confirms that the VRP consent has been created.
-
Bank -> Token.io - The bank confirms with Token.io that the VRP consent has been created.
- TPP receives VRP consent set up status
The TPP receives the confirmation that the VRP consent has been set up successfully and displays this to the user.
-
Token.io -> TPP - Token.io sends the VRP consent status to the TPP in a webhook.
If you're subscribed to webhooks, Token.io sends the consent status in a webhook every time a VRP consent is created or updated.
See Webhooks for an example webhook notification.
-
Token.io -> TPP - Token.io redirects the user to the TPP.
-
TPP -> User - The TPP displays the VRP consent set up status to the user.
If the consent set up request is successful, the status will be AUTHORIZED.
See HTTP errors for information on HTTP error status codes.
API-only integration
This section describes setting up VRP consent parameters using Token.io's API.
See Bank selection for information on selecting banks, mandatory fields, authentication models and supported payment rails for API-only integration.
|
See the Token.io API reference for details of the following endpoints:
Then use our Launchpad to test them.
Click the image on the right to view a simplified swim lane diagram of the integration flow.
Details of the steps within the integration flow are shown below.
|
|
- User initiates VRP consent set up
The user initiates the VRP consent set up with the TPP.
-
User -> TPP - The user initiates a request to the TPP to grant consent for VRP.
- TPP retrieves list of banks
TPPs retrieve the list of available banks using the GET v2/banks call.
We recommend that this step is performed once daily, outside any VRP initiation, e.g., at 11pm UTC, and that the result is cached.
In the GET v2/banks request, there are numerous filtering criteria you can add as parameters to narrow your query. As a minimum, you should filter by your member ID.
See Mandatory fields for information on which fields must be provided for a given bank to accept a VRP initiation request.
-
TPP -> Token.io - The TPP requests the list of banks from Token.io.
-
Token.io -> TPP - Token.io supplies the list of banks to the TPP.
- User selects bank
The user selects the bank.
-
TPP -> User - The TPP displays the bank selection screen.
-
User -> TPP - The user selects the bank.
- TPP collects VRP consent from user
TPP collects VRP consent from the user.
-
TPP -> User - TPP displays the VRP consent confirmation page to the user.
-
User -> TPP - The user confirms the set up of the VRP consent with the TPP.
- User sets VRP consent limits
The user sets the limits of the VRP consent with the TPP.
-
User -> TPP - The user sets the limits of the VRP consent with the TPP. This is usually a maximum amount per transaction and a maximum amount per day.
- TPP sends VRP consent request to Token.io
The TPP initiates the consent request with Token.io using the POST /vrp-consents call.
-
TPP -> Token.io - The TPP initiates the consent request with Token.io, including the instruction details, using the POST /vrp-consents call.
-
Token.io -> TPP - Token.io confirms receipt of the request from the TPP.
- Token.io requests VRP consent with bank
Token.io requests the creation of the VRP consent with the bank.
-
Token.io -> Bank - Token.io requests permission to set up the VRP consent with the user's bank.
-
Bank -> Token.io - The bank returns the consent with a PENDING status and a redirect URL.
- TPP redirects user to bank
The TPP redirects the user to the bank for payment consent confirmation.
-
TPP -> Bank - The TPP redirects the user to the bank to confirm the payment consent, using the redirectUrl.
- User completes authorization with bank
The user completes authorization with the bank using the appropriate method; redirect, embedded or decoupled.
-
Bank -> User - The bank displays the authorization page to the user.
-
User -> Bank - The user authorizes the VRP consent creation with the bank.
- Bank confirms VRP consent set up request
The bank confirms that the VRP consent has been created.
-
Bank -> Token.io - The bank confirms with Token.io that the VRP consent has been created.
- TPP receives VRP consent set up status
The TPP receives the confirmation that the VRP consent has been set up successfully and displays this to the user.
-
Token.io -> TPP - Token.io sends the VRP consent status to the TPP in a webhook.
If you're subscribed to webhooks, Token.io sends the consent status in a webhook every time a VRP consent is created or updated.
See Webhooks for an example webhook notification.
-
Token.io -> TPP - Token.io redirects the user to the TPP.
-
TPP -> User - The TPP displays the VRP consent set up status to the user.
If the consent set up request is successful, the status will be AUTHORIZED.
See HTTP errors for information on HTTP error status codes.
VRP consent status
The following table describes the possible statuses that can be returned in the status field of the POST /vrp-consents, GET /vrp-consents and GET /vrp-consents/{id} endpoints.
VRP consent statuses
| AUTHORIZED |
The VRP consent setup request has been authorized by the bank. |
| PENDING |
The VRP consent setup request has passed Token.io's validation. If you are using HP and the VRP confirmation page is turned on, the VRP setup success page will be shown with status set as PENDING. |
| PENDING_MORE_INFO |
The VRP consent setup request lacks mandatory fields (e.g., bankId) that have to be collected before connecting to the bank. If you are using HP, Token.io may be waiting for the user to enter the required information. If you are not using HP, this is a non-recoverable state and you must populate the required information in a new POST /vrp-consents call. |
| PENDING_REDIRECT_AUTH |
The VRP consent setup request has been acknowledged by the bank and Token.io is awaiting user confirmation at the bank's page. If HP is in use and the VRP confirmation page is turned on, the VRP setup success page will be shown with status set as PENDING. |
| PENDING_REDIRECT_AUTH_VERIFICATION |
Token.io has received the bank callback information and is currently verifying it with the bank. If you are using HP and the VRP confirmation page is turned on, the VRP setup success page will be shown with status set as PENDING. |
| REJECTED |
The VRP consent setup request has been rejected. More details are shared in the corresponding status reason information. This status will be set whenever an unrecoverable error happens during the flow. |
| FAILED |
Token.io failed to proceed with the VRP consent setup request due to problems reaching the bank or the user abandoning the flow (all PENDING statuses are turned into FAILED 30 minutes after VRP consent setup request). |
| REVOKED |
The status indicates the VRP consent has been revoked. The user has potentially revoked consent through a different channel. |
VRP initiation
Once a user has consented to the VRP parameter setup, multiple payment types are possible:
For merchant-initiated and user-initiated transactions (one-click use cases), VRP provides a confirmation of funds feature using the GET /vrps/{id}/confirm-funds endpoint, which enables you to check whether funds are available before initiating a payment. This feature is useful when the user is not in session and has authorized you to initiate VRP. You can confirm if the funds are available in the user’s account before initiating the VRP, thereby avoiding unnecessary charges on the user’s account should the funds not be available. Ideally, you should carry out the confirmation a few days before the VRP is due to be initiated so that the user can be notified if there are insufficient funds in their account.
|
This section describes a merchant-initiated VRP API redirect integration.
See the Token.io API reference for details of the following endpoints:
Then use our Launchpad to test them.
Click the image on the right to view a simplified swim lane diagram of the integration flow.
Details of the steps within the integration flow are shown below.
|
|
- TPP determines need for VRP initiation
The TPP determines the need to initiate a payment under a given VRP consent.
-
TPP -> TPP - The TPP determines whether a payment should be made under a given VRP consent, based on the limits provided.
- TPP confirms availability of funds
The TPP confirms that there are sufficient funds for the payment using the GET /vrps/{id}/confirm-funds call.
-
TPP -> Token.io - The TPP sends the id of the VRP consent and the amount to Token.io to confirm availability of funds.
-
Token.io -> Bank - Token.io sends the id of the VRP consent and the amount to the bank to confirm availability of funds.
-
Bank -> Token.io - The bank confirms the availability of the funds to Token.io.
-
Token.io -> TPP - Token.io confirms the availability of the funds to the TPP.
If there are insufficient funds, Token.io returns a status of fundsAvailable = False and the TPP notifies the user.
- TPP initiates VRP request
The TPP initiates the VRP request with Token.io using the POST /vrps call. Token.io responds by acknowledging the details of the request, and providing the details for the next step, e.g., where initiation moves directly to a processing, success or reject state.
-
TPP -> Token.io - The TPP creates the VRP request using the POST /vrps call.
-
Token.io -> TPP - Token.io generates a response to the payment initiation request.
If you're subscribed to webhooks, Token.io sends the VRP status in a webhook every time an initiation is created or updated.
See Webhooks for an example webhook notification.
- Token.io validates VRP request
The VRP consent id is checked to ensure it's valid.
-
Token.io -> Token.io - Token.io checks the VRP consent id to make sure it's valid.
An error is displayed if the VRP consent id is invalid.
- Token.io initiates payment with bank
If funds are available with the bank, Token.io initiates the VRP with the bank.
-
Token.io -> Bank - Token.io initiates the VRP with the bank.
-
Bank -> Token.io - The bank returns the VRP initiation status to Token.io.
- TPP receives VRP initiation status
The TPP receives the VRP initiation status from Token.io and notifies the user.
-
Token.io -> TPP - Token.io sends the VRP initiation status to the TPP in a webhook.
If you're subscribed to webhooks, Token.io sends the VRP initiation status in a webhook every time a VRP initiation is created or updated.
See Webhooks for an example webhook notification.
-
TPP -> User - The TPP displays the VRP initiation status to the user.
If the VRP initiation request is successful, the status will be INITIATION_COMPLETED.
See HTTP errors for information on HTTP error status codes.
VRP initiation status
The following table describes the possible statuses that can be returned in the status field of the POST /vrps, GET /vrps/{id}, and GET /vrp-consents/{id}/payments endpoints.
VRP initiation statuses
| INITIATION_COMPLETED |
The payment initiation under VRP has been completed successfully |
| INITIATION_PENDING |
The payment initiation under VRP has been received by Token.io and has passed validation |
| INITIATION_PROCESSING |
The payment initiation under VRP has been acknowledged by the bank and is processing |
| INITIATION_ REJECTED |
The payment initiation under VRP has been rejected. More details are shared in the corresponding status reason information. |
| INITIATION_REJECTED_INSUFFICIENT_FUNDS |
The payment initiation under VRP has been rejected because the funds check returned a negative result. |
| INITIATION_NO_FINAL_STATUS_AVAILABLE |
The status of the payment initiation under VRP has not been updated for some time and Token.io has stopped polling. This is a final status, but it does not indicate success or failure. Contact the bank to check actual payment initiation status. |
| INITIATION_FAILED |
Token.io failed to proceed with the payment initiation under VRP due to problems reaching the bank. |
VRP consent revocation
Token.io provides the ability to revoke a VRP consent once it has been given.
|
This section describes the API integration for revoking a VRP consent.
See the Token.io API reference for details of the following endpoint:
Then use our Launchpad to test it.
Click the image on the right to view a simplified swim lane diagram of the integration flow.
Details of the steps within the integration flow are shown below.
|
|
- User requests revocation of VRP consent
- User -> TPP - The user requests revocation of the VRP consent with the TPP.
- TPP -> Token.io - The TPP requests revocation of the VRP consent with Token.io, and passes in the VRP consent identifier using the
DELETE /vrp-consents/{id}
- Token.io -> Bank - Token.io requests consent revocation with the bank using the VRP consent identifier.
- Bank revokes VRP consent
- Bank -> Token.io - the bank returns the VRP consent revocation result to Token.io.
- Token.io -> TPP - Token.io returns the VRP consent with the current status. The status is set to
REVOKED on successful completion of the request with the bank.
- TPP -> User - The TPP informs the user of the VRP revocation result.
|