Integration guide
Step-by-step guide to integrating Volt Verify
This guide walks you through integrating Volt Verify into your application. By the end, you'll be able to verify bank account ownership in real-time.
Available Markets
Verify is currently available in Austria and Germany only. More countries coming soon.
Prerequisites
Before you begin, ensure you have:
Fuzebox account with Verify access enabled
Customer credentials (Username/Password)
Application credentials (Client ID/Client Secret)
Sandbox environment access for testing
→
Step 1: Authenticate
Obtain an access token using your credentials:
curl -X POST https://api.sandbox.volt.io/oauth \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "username=YOUR_USERNAME" \
-d "password=YOUR_PASSWORD"→
Step 2: Request account access
Initiate an account access request to start the verification flow. This is a minimal request example:
curl --request POST \
--url https://api.volt.io/gateway/account-access \
--header 'authorization: Bearer <your access token>' \
--header 'content-type: application/json' \
--header 'idempotency-key: <your idempotency key>' \
--header 'x-volt-api-version: 1' \
--header 'x-volt-initiation-channel: hosted' \
--data ' {
"informationSystem": "OPEN_BANKING",
"internalReference": "f57e39ae-4670-4403-93b4-cb6beea73bd1", # your internal reference
},
"subject": {
"reference": "JDOE-101",
"email": "johndoe@example.com"
},
"scopes": [
"ACCOUNTS",
"BALANCES",
"IDENTIFICATION"
],
"device": {
"ip": "68.253.37.36",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:42.0) Gecko/20100101 Firefox/42.0",
"fingerprint": "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
},
"communication": {
"notification": {
"url": "https://mywebsite.com/acocunt-access"" # Place your webhook URL here
},
"return": {
"urls": {
"unified": {
"url": "https://mywebsite.com/payment" # Redirect URL for unified return
},
"success": {
"url": "https://mywebsite.com/payment/success" # Redirect URL for success
},
"failure": {
"url": "https://mywebsite.com/payment/failure" # Redirect URL for failure
},
"cancel": {
"url": "https://mywebsite.com/payment/cancel" # Redirect URL for cancel
}
},
"queryString": "id=xyz" # Optional query string to append to return URLs
}
},
"termsAndConditionsAccepted": true
}'→
Request parameters
Prop
Type
Response
{
"id": "fbd0a297-9c96-48c9-a85e-ef5d3d986e96",
"internalReference": "37b95756-0a35-4653-8e8b-4110af18e113",
"informationSystem": "OPEN_BANKING",
"openBanking": {
"institutionId": null,
"accountIdentifiers": {}
},
"subject": {
"reference": "JDOE-101",
"email": "johndoe@example.com",
"accountIdentifiers": {}
},
"scopes": [
"ACCOUNTS",
"BALANCES",
"IDENTIFICATION"
],
"device": {
"ip": "68.253.37.36",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:42.0) Gecko/20100101 Firefox/42.0",
"fingerprint": "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
},
"status": {
"status": "NEW",
"reason": null
},
"createdAt": "2026-03-20T13:36:40+00:00",
"updatedAt": null,
"accountAccessFlow": {
"status": "PROCESSING",
"details": {
"reason": "AWAITING_USER_REDIRECT",
"redirect": {
"url": "https://vo.lt/xyz123",
"directUrl": "<full url here>"
}
}
}
}Step 3: Redirect user to bank
Redirect the user to the URL provided in the response. The user will:
- Select their bank
- Authenticate with their bank credentials
- Consent to sharing account information
- Be redirected back to your
callbackURL
// Redirect user to Volt's hosted bank selection
window.location.href = response.accountAccessFlow.details.redirect.url;Step 4: Handle the callback
After bank authorisation, the user is redirected to your callback URL with query parameters:
https://your-app.com/verify/callbackStep 5: Recipient account access status
Once the whole process is finished, the data will be sent to your communication.notification.url URL in below format:
Response
{
"id": "0aff92e4-0427-4482-b3d5-8b963984202a", // Globally Unique ID
"internalReference": "9a90a43a-68ad-4563-8fcc-9d5da92f9eb2", // Internal Reference - Your internal reference to identify this request
"status": {
"status": "DATA_RETRIEVED", // Status
"details": null // Additional details. In [null, CANCELLED_BY_SUBJECT, ABANDONED_BY_SUBJECT, REFUSED_AT_INSTITUTION, ERROR_AT_INSTITUTION]
},
"accountData": {
"accounts": [ // Requires scope "ACCOUNTS"
{
"owner": "JANE DOE", // Account holder's name
"balances": [ // Requires scope "BALANCES"
{
"type": "AVAILABLE",
"amount": {
"value": 20,
"currency": "EUR"
}
}
],
"identifiers": { // Requires scope "IDENTIFICATION"
"iban": "DE69500105176334166465"
}
}
]
}
}Callback parameters
Prop
Type
Step 6: Verify the account holder
Compare the returned accountData.accounts[].owner with your customer's name.
Note: Bank account names may differ from customer-provided names (e.g., "Max" vs "Maximilian"). Implement appropriate name matching logic for your use case.
→
Testing in Sandbox
Use the Sandbox environment to test your integration:
- Set environment to Sandbox in Fuzebox
- Use Sandbox API URLs
- Test with simulated banks that return mock data
In Sandbox, you can simulate different scenarios (success, failure, cancelled) using test credentials provided in Fuzebox.
Going live
Once testing is complete:
Switch to Production in Fuzebox (toggle top-right)
Generate Production credentials
Update API URLs to Production endpoints
Test with real bank accounts
Next steps
How is this guide?
Last updated on