BVN verification

Bank verification numbers, or BVNs, are often used as a means of verifying a customer within Nigeria, in order to perform proper KYC checks. Flutterwave provides the resolve BVN details endpoint for this—the customer supplies their BVN, you pass it to us, and we return the associated details to you.

Don't store customer BVNs

BVNs point to sensitive customer information, so you should not store them in your database or anywhere in your app. Discard them once you're done with verification.

To resolve a BVN, call the resolve BVN details endpoint with the customer's BVN. You can do this easily with our SDKs:

// Install with: npm i flutterwave-node-v3

const Flutterwave = require('flutterwave-node-v3');
const flw = new Flutterwave(process.env.FLW_PUBLIC_KEY, process.env.FLW_SECRET_KEY);
flw.Misc.bvn({bvn: "123456789010"})
  .then(response => console.log(response));
// Install with: composer require flutterwavedev/flutterwave-v3

$flw = new \Flutterwave\Rave(getenv('FLW_SECRET_KEY')); // Set `PUBLIC_KEY` as an environment variable
$bvnService = new \Flutterwave\Bvn();
$customerBvn = "123456789";
$response = $bvnService->verifyBVN($customerBvn);
# Install with: gem install flutterwave_sdk

require 'flutterwave_sdk'

misc =
bvn = "12345678901"
response = misc.resolve_bvn bvn
print response
# Install with: pip install rave_python

import os
from rave_python import Rave

rave = Rave(os.getenv("FLW_PUBLIC_KEY"), os.getenv("FLW_SECRET_KEY"))
bvn = "12345678901"
response = rave.Transfer.bvnResolve(bvn)
// Add the dependency com.flutterwave:Rave-Java:1.04 to your project

import ;

verificationServices verificationService = new verificationServices();
bvnload payload = new bvnload();

String response = verificationService.doBvnVerification(payload);
// Install with: go get

import (
var r = rave.Rave{
var bvn = rave.BVN{
err, response := bvn.Bvn("12345678901")
if err != nil {
curl --request GET '' \
    --header 'Authorization: Bearer YOUR_SECRET_KEY'

Each BVN resolution request costs ₦50. Requests with your test keys are free, but will always return the same dummy data.

If the BVN is valid, you'll get a response with a status of "success" and a data object containing the customer's details:

  "status": "success",
  "message": "BVN details fetched",
  "data": {
    "bvn": "123456789",
    "first_name": "Wendy",
    "middle_name": "Chucky",
    "last_name": "Rhoades",
    "date_of_birth": "01-01-1905",
    "phone_number": "08012345678",
    "registration_date": "01-01-1921",
    "enrollment_bank": "044",
    "enrollment_branch": "Idejo",
    "image_base_64": null,
    "address": null,
    "gender": "Male",
    "email": null,
    "watch_listed": null,
    "nationality": "Nigerian",
    "marital_status": null,
    "state_of_residence": null,
    "lga_of_residence": null,
    "image": null

If the BVN wasn't valid, you'll get an error response:

  "status": "error",
  "message": "Invalid BVN entered. Please check and try again",
  "data": null