Loading...
Verify (AIS)

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:

  1. Select their bank
  2. Authenticate with their bank credentials
  3. Consent to sharing account information
  4. Be redirected back to your callback URL
// 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/callback

Step 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:

  1. Set environment to Sandbox in Fuzebox
  2. Use Sandbox API URLs
  3. 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

On this page