Migration guide
This guide is designed to help you transition from the current Payments API to the new Global Unified Payments API (Global API). Migrating to the Global API will help you to stay current with the latest enhancements and will also ensure long-term support and maintainability.
The current Payments API will be deprecated for payment creation with the hosted checkout. Volt plans to drop support of the Payments API by the end of 2025.
This guide relates to the hosted checkout integration for 🇪🇺 EU and 🇬🇧 UK.
Authenticating with the API
Before using any endpoint in Volt’s APIs, you’ll need to authenticate using the /oauth
endpoint. This is true for the (legacy) Payments API as well as the Global API. There is, however, a small difference between the two. The Payments API uses application/x-www-form-urlencoded
as a content type (set in the Content-Type
HTTP header), while the Global API uses application/json
as a content type. This results in a slightly different request.
curl --location 'http://api.volt.io/oauth' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'client_id=6b288347-5d6f-4596-b620-72dc7a88de86' \
--data-urlencode 'client_secret=caaf7b1b-1024-4212-a55f-041007917ba8' \
--data-urlencode 'username=d0d6a7bd-780a-498a-95e4-402ec1b89c44@volt.io' \
--data-urlencode 'password=secretpassword'
curl --location 'http://gateway.volt.io/oauth' \
--header 'Content-Type: application/json' \
--data-raw '{
"grant_type":"password",
"client_id": "6b288347-5d6f-4596-b620-72dc7a88de86",
"client_secret": "caaf7b1b-1024-4212-a55f-041007917ba8",
"username":"d0d6a7bd-780a-498a-95e4-402ec1b89c44@volt.io",
"password":"secretpassword"
}'
Create payment request HTTP headers
There are some changes between the (legacy) Payments API and the Global API in terms of HTTP headers while creating a new payment request. The below table shows the difference in HTTP headers between the two APIs.
Payments API (legacy) | Global API |
|
|
Create payment request payload mapping
$.paymentSystem
is a new property declaring which payment system should be used to make the transfer.
If the payment system is OPEN_BANKING_EU
, the corresponding $.openBankingEU
object is required.
If the payment system is OPEN_BANKING_UK
, the corresponding $.openBankingUK
object is required.
Payments API (legacy) | Global API |
$.currencyCode |
$.currency |
$.amount |
$.amount |
$.type |
Depends on the selected $.paymentSystem , however the path is similar: $.{paymentSystemObject}.type |
$.uniqueReference |
$.paymentReference (Note: this field is now optional.) |
$.merchantInternalReference |
$.internalReference |
$.payer.reference |
$.payer.reference |
$.payer.email |
$.payer.email |
$.payer.name |
Not used anymore. |
$.payer.ip |
$.device.ip (Note: this field is now required.) |
$.shopper.reference |
$.payer.reference |
$.shopper.email |
$.payer.email |
$.shopper.firstName |
$.payer.firstName |
$.shopper.lastName |
$.payer.lastName |
$.shopper.organisationName |
$.payer.organisationName |
$.shopper.ip |
$.device.ip (Note: this field is now required.) |
$.bank |
Depends on the selected $.paymentSystem , however the path is similar: $.{paymentSystemObject}.institutionId |
$.callback |
$.communication.return.queryString |
$.notificationUrl |
$.communication.notifications.url |
$.paymentSuccessUrl |
$.communication.return.urls.success |
$.paymentFailureUrl |
$.communication.return.urls.failure |
$.paymentPendingUrl |
$.communication.return.urls.pending |
$.paymentCancelUrl |
$.communication.return.urls.cancel |
$.checkoutCountries |
Not used anymore. |
$.bankEditable |
Not used anymore
|
$.summaryDetails |
$.displayInfo |
$.summaryDetails.[].label |
$.displayInfo.[].key |
$.summaryDetails.[].value |
$.displayInfo.[].value |
$.beneficiary.name |
$.beneficiary.name |
$.beneficiary.iban |
$.beneficiary.accountIdentifiers.iban |
$.beneficiary.swiftBic |
$.beneficiary.accountIdentifiers.swiftBic |
$.beneficiary.sortCode |
$.beneficiary.accountIdentifiers.sortCode |
$.beneficiary.accountNumber |
$.beneficiary.accountIdentifiers.accountNumber |
- 🇪🇺 EU
- 🇬🇧 UK
{
"currencyCode": "EUR",
"amount": 12345,
"type": "OTHER",
"uniqueReference": "sale123456",
"merchantInternalReference": "1d73dd8a-4aef-4c83-80aa-f06c4f615a75",
"shopper": {
"reference": "user-13489",
"documentId": "90971226008",
"email": "john.smith@example.com",
"firstName": "John",
"lastName": "Smith",
"organisationName": "Company",
"ip": "122.118.64.13"
},
"bank": "662384a0-9734-4556-a8bd-3f1e774e2a3c",
"bankEditable": "true",
"callback": "order_id=662384a0&sample=parameter",
"notificationUrl": "https://client.app.example/notify",
"paymentSuccessUrl": "https://example.com/redirect/success",
"paymentFailureUrl": "https://example.com/redirect/failure",
"paymentPendingUrl": "https://example.com/redirect/pending",
"paymentCancelUrl": "https://example.com/redirect/cancel",
"checkoutCountries": [
"PL",
"DE"
],
"summaryDetails": [
{
"label": "Category",
"value": "Car Rental"
},
{
"label": "Pickup",
"value": "Heathrow T1"
}
]
}
{
"currency": "EUR",
"amount": 12345,
"paymentReference": "sale123456",
"internalReference": "1d73dd8a-4aef-4c83-80aa-f06c4f615a75",
"payer": {
"reference": "user-13489",
"firstName": "John",
"lastName": "Smith",
"organisationName": "Company",
"email": "john.smith@example.com"
},
"device": {
"ip": "122.118.64.13"
},
"paymentSystem": "OPEN_BANKING_EU",
"openBankingEU": {
"type": "OTHER",
"institutionId": "662384a0-9734-4556-a8bd-3f1e774e2a3c"
},
"communication": {
"notification": {
"url": "https://client.app.example/notify"
},
"return": {
"urls": {
"success": {
"url": "https://example.com/redirect/success"
},
"failure": {
"url": "https://example.com/redirect/failure"
},
"pending": {
"url": "https://example.com/redirect/pending"
},
"cancel": {
"url": "https://example.com/redirect/cancel"
}
},
"queryString": "order_id=662384a0&sample=parameter"
}
},
"displayInfo": [
{
"key": "Category",
"value": "Car Rental"
},
{
"key": "Pickup",
"value": "Heathrow T1"
}
]
}
{
"currencyCode": "GBP",
"amount": 12345,
"type": "OTHER",
"uniqueReference": "sale123456",
"merchantInternalReference": "1d73dd8a-4aef-4c83-80aa-f06c4f615a75",
"shopper": {
"reference": "user-13489",
"documentId": "90971226008",
"email": "john.smith@example.com",
"firstName": "John",
"lastName": "Smith",
"organisationName": "Company",
"ip": "122.118.64.13"
},
"bank": "662384a0-9734-4556-a8bd-3f1e774e2a3c",
"callback": "order_id=662384a0&sample=parameter",
"notificationUrl": "https://client.app.example/notify",
"paymentSuccessUrl": "https://example.com/redirect/success",
"paymentFailureUrl": "https://example.com/redirect/failure",
"paymentPendingUrl": "https://example.com/redirect/pending",
"paymentCancelUrl": "https://example.com/redirect/cancel",
"checkoutCountries": [
"PL",
"DE"
],
"summaryDetails": [
{
"label": "Category",
"value": "Car Rental"
},
{
"label": "Pickup",
"value": "Heathrow T1"
}
]
}
{
"currency": "GBP",
"amount": 12345,
"paymentReference": "sale123456",
"internalReference": "1d73dd8a-4aef-4c83-80aa-f06c4f615a75",
"payer": {
"reference": "user-13489",
"firstName": "John",
"lastName": "Smith",
"organisationName": "Company",
"email": "john.smith@example.com"
},
"device": {
"ip": "122.118.64.13"
},
"paymentSystem": "OPEN_BANKING_UK",
"openBankingUK": {
"type": "OTHER",
"institutionId": "662384a0-9734-4556-a8bd-3f1e774e2a3c"
},
"communication": {
"notification": {
"url": "https://client.app.example/notify"
},
"return": {
"urls": {
"success": {
"url": "https://example.com/redirect/success"
},
"failure": {
"url": "https://example.com/redirect/failure"
},
"pending": {
"url": "https://example.com/redirect/pending"
},
"cancel": {
"url": "https://example.com/redirect/cancel"
}
},
"queryString": "order_id=662384a0&sample=parameter"
}
},
"displayInfo": [
{
"key": "Category",
"value": "Car Rental"
},
{
"key": "Pickup",
"value": "Heathrow T1"
}
]
}
Create payment request response
After the payment request is created, you should redirect the payer to Volt’s hosted checkout. The below table shows where the redirect URL appears differently in the response between the (legacy) Payments API and the Global API.
Payments API (legacy) | Global API |
$.checkoutUrl |
$.paymentInitiationFlow.details.redirect.url (QR code friendly), alternatively $.paymentInitiationFlow.details.redirect.directUrl |
{
"id": "93b85f3c-76eb-4316-b1ae-f3370ddc59bc",
"checkoutUrl": "https://checkout.volt.io/93b85f3c-76eb-4316-b1ae-f3370ddc59bc?auth=jwtToken"
}
{
"id": "93b85f3c-76eb-4316-b1ae-f3370ddc59bc",
//...
"paymentInitiationFlow": {
"status": "PROCESSING",
"details": {
"reason": "AWAITING_USER_REDIRECT",
"redirect": {
"url": "https://vo.lt/asqIs",
"directUrl": "https://checkout.volt.io/93b85f3c-76eb-4316-b1ae-f3370ddc59bc?auth=jwtToken"
}
}
}
}
Get payment's match score (Matchmeter)
Volt’s Matchmeter API has also been changed, both in available query parameters as well as response content.
The below comparison shows the difference in request and response, between the (legacy) Payments API endpoint for Matchmeter and the Global API endpoint.
{
"invocationId": "e9725468-0858-4dbb-af72-1e49c8254d68",
"nameMatchScore": 0.89
}
{
"invocationId": "e9725468-0858-4dbb-af72-1e49c8254d68",
"score": 0.89
}
To get started with the Global Payments API, please visit
For detailed reference, please visit