SpareSpare Docs
GuidesAPI Reference

Account Verification Pro

Verify a bank account and retrieve beneficiary information for retail or corporate accounts in one call.

Integration guide

Goal: Confirm a bank account (IBAN) and its beneficiary for either a retail identity or a corporate entity.

Estimated time: 20 minutes

Prerequisites

  • Sandbox credentials and an access token
  • An IBAN plus a retail identity or corporate registration to match

When to use

Account Verification Pro checks the account, identity, and beneficiary name in one request. It supports both individuals and businesses.

Use it when you need to confirm two things together:

  1. The IBAN belongs to the person or business you provided.
  2. The beneficiary name matches the name held by the bank.

How it differs from basic AV

Basic Account Verification checks whether an IBAN belongs to a person or business. It has separate ID Match and Corporate endpoints.

Account Verification Pro combines Account Verification and Beneficiary Verification. It performs the account and identity check, then also checks the beneficiary name in the same request.

EndpointForRequired inputsOptional inputs
Match (Retail)Individualsiban, idValueidType, beneficiaryName
CorporateBusinessesiban, plus at least one of companyRegistrationNumber or unnbeneficiaryName

For the retail endpoint, idType is NATIONAL_ID, IQAMA, COMPANY_REGISTRATION_NUMBER, or UNN.

For the Corporate endpoint, provide at least one company identifier: companyRegistrationNumber or unn. You can provide both. beneficiaryName is optional and accepts up to 255 characters.

What you get back

Both endpoints use the same response structure. On success, the verification result comes in the data property of the response:

FieldDescription
data.requestIdA unique reference for this verification. Keep it for reconciliation and support
data.resultMATCH, NO_MATCH, or ERROR
data.beneficiaryNameThe account holder as registered with the bank
data.inputBeneficiaryNameThe beneficiary name you sent in the request
data.accountStatusThe current account status returned by the bank
data.accountIdentifierThe verified account identifier. Returned by the retail Match endpoint
data.bankBank details, including the English and Arabic names, bank code, and SWIFT code
data.errorDescriptionThe reason for a no-match or error. Empty when the result is a match
data.idType / data.idValueThe identity that was checked
data.executionDateThe date and time when the check was performed, in ISO 8601 format

A successful response returns HTTP 200. To determine whether the result is MATCH, NO_MATCH, or ERROR, use data.result rather than the HTTP status code. If the result is NO_MATCH or ERROR, read data.errorDescription for more information.

The possible descriptions are listed in the Basic AV guide under Match and No-Match Results and Error Results.

Integration summary

Authenticate

Exchange your API credentials for a Bearer access token. See Quick Start Setup.

Choose the right endpoint

Use Match for an individual. Use Corporate for a business.

Match (Retail)

curl -X POST https://sandbox.sparefinancial.sa/api/v2.1/av/AccountVerificationPro/Match \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
        "iban": "SA0230825947458020058295",
        "idType": "NATIONAL_ID",
        "idValue": "1083886659",
        "beneficiaryName": "HAITHAM AL AYED"
      }'
const res = await fetch(
  "https://sandbox.sparefinancial.sa/api/v2.1/av/AccountVerificationPro/Match",
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${accessToken}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      iban: "SA0230825947458020058295",
      idType: "NATIONAL_ID",
      idValue: "1083886659",
      beneficiaryName: "HAITHAM AL AYED",
    }),
  },
);

const { data } = await res.json();
// data.result is "MATCH", "NO_MATCH", or "ERROR"
import requests

res = requests.post(
    "https://sandbox.sparefinancial.sa/api/v2.1/av/AccountVerificationPro/Match",
    headers={
        "Authorization": f"Bearer {access_token}",
        "Content-Type": "application/json",
    },
    json={
        "iban": "SA0230825947458020058295",
        "idType": "NATIONAL_ID",
        "idValue": "1083886659",
        "beneficiaryName": "HAITHAM AL AYED",
    },
)

data = res.json()["data"]
result = data["result"]
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

HttpClient client = HttpClient.newHttpClient();

String body = """
    {
      "iban": "SA0230825947458020058295",
      "idType": "NATIONAL_ID",
      "idValue": "1083886659",
      "beneficiaryName": "HAITHAM AL AYED"
    }
    """;

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://sandbox.sparefinancial.sa/api/v2.1/av/AccountVerificationPro/Match"))
    .header("Authorization", "Bearer " + accessToken)
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(body))
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

JsonNode data = new ObjectMapper().readTree(response.body()).get("data");
String result = data.get("result").asText();
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

using var client = new HttpClient();

var request = new HttpRequestMessage(
    HttpMethod.Post,
    "https://sandbox.sparefinancial.sa/api/v2.1/av/AccountVerificationPro/Match");
request.Headers.Add("Authorization", $"Bearer {accessToken}");
request.Content = new StringContent(
    "{ \"iban\": \"SA0230825947458020058295\", \"idType\": \"NATIONAL_ID\", \"idValue\": \"1083886659\", \"beneficiaryName\": \"HAITHAM AL AYED\" }",
    Encoding.UTF8,
    "application/json");

var response = await client.SendAsync(request);
var body = await response.Content.ReadAsStringAsync();

using var doc = JsonDocument.Parse(body);
var data = doc.RootElement.GetProperty("data");
var result = data.GetProperty("result").GetString();
package main

import (
	"bytes"
	"encoding/json"
	"net/http"
)

payload := []byte(`{
	"iban": "SA0230825947458020058295",
	"idType": "NATIONAL_ID",
	"idValue": "1083886659",
	"beneficiaryName": "HAITHAM AL AYED"
}`)

req, err := http.NewRequest(
	http.MethodPost,
	"https://sandbox.sparefinancial.sa/api/v2.1/av/AccountVerificationPro/Match",
	bytes.NewReader(payload),
)
if err != nil {
	panic(err)
}

req.Header.Set("Authorization", "Bearer "+accessToken)
req.Header.Set("Content-Type", "application/json")

res, err := http.DefaultClient.Do(req)
if err != nil {
	panic(err)
}
defer res.Body.Close()

var body struct {
	Data struct {
		RequestID       string `json:"requestId"`
		Result          string `json:"result"`
		BeneficiaryName string `json:"beneficiaryName"`
	} `json:"data"`
}
json.NewDecoder(res.Body).Decode(&body)

result := body.Data.Result

Corporate

curl -X POST https://sandbox.sparefinancial.sa/api/v2.1/av/AccountVerificationPro/Corporate \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
        "iban": "SA0255794102713415121120",
        "companyRegistrationNumber": "1083886658",
        "beneficiaryName": "SAUDI A.PAK.INDUSTRY"
      }'
const res = await fetch(
  "https://sandbox.sparefinancial.sa/api/v2.1/av/AccountVerificationPro/Corporate",
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${accessToken}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      iban: "SA0255794102713415121120",
      companyRegistrationNumber: "1083886658",
      beneficiaryName: "SAUDI A.PAK.INDUSTRY",
    }),
  },
);

const { data } = await res.json();
// data.result is "MATCH", "NO_MATCH", or "ERROR"
import requests

res = requests.post(
    "https://sandbox.sparefinancial.sa/api/v2.1/av/AccountVerificationPro/Corporate",
    headers={
        "Authorization": f"Bearer {access_token}",
        "Content-Type": "application/json",
    },
    json={
        "iban": "SA0255794102713415121120",
        "companyRegistrationNumber": "1083886658",
        "beneficiaryName": "SAUDI A.PAK.INDUSTRY",
    },
)

data = res.json()["data"]
result = data["result"]
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

HttpClient client = HttpClient.newHttpClient();

String body = """
    {
      "iban": "SA0255794102713415121120",
      "companyRegistrationNumber": "1083886658",
      "beneficiaryName": "SAUDI A.PAK.INDUSTRY"
    }
    """;

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://sandbox.sparefinancial.sa/api/v2.1/av/AccountVerificationPro/Corporate"))
    .header("Authorization", "Bearer " + accessToken)
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(body))
    .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

JsonNode data = new ObjectMapper().readTree(response.body()).get("data");
String result = data.get("result").asText();
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

using var client = new HttpClient();

var request = new HttpRequestMessage(
    HttpMethod.Post,
    "https://sandbox.sparefinancial.sa/api/v2.1/av/AccountVerificationPro/Corporate");
request.Headers.Add("Authorization", $"Bearer {accessToken}");
request.Content = new StringContent(
    "{ \"iban\": \"SA0255794102713415121120\", \"companyRegistrationNumber\": \"1083886658\", \"beneficiaryName\": \"SAUDI A.PAK.INDUSTRY\" }",
    Encoding.UTF8,
    "application/json");

var response = await client.SendAsync(request);
var body = await response.Content.ReadAsStringAsync();

using var doc = JsonDocument.Parse(body);
var data = doc.RootElement.GetProperty("data");
var result = data.GetProperty("result").GetString();
package main

import (
	"bytes"
	"encoding/json"
	"net/http"
)

payload := []byte(`{
	"iban": "SA0255794102713415121120",
	"companyRegistrationNumber": "1083886658",
	"beneficiaryName": "SAUDI A.PAK.INDUSTRY"
}`)

req, err := http.NewRequest(
	http.MethodPost,
	"https://sandbox.sparefinancial.sa/api/v2.1/av/AccountVerificationPro/Corporate",
	bytes.NewReader(payload),
)
if err != nil {
	panic(err)
}

req.Header.Set("Authorization", "Bearer "+accessToken)
req.Header.Set("Content-Type", "application/json")

res, err := http.DefaultClient.Do(req)
if err != nil {
	panic(err)
}
defer res.Body.Close()

var body struct {
	Data struct {
		RequestID       string `json:"requestId"`
		Result          string `json:"result"`
		BeneficiaryName string `json:"beneficiaryName"`
	} `json:"data"`
}
json.NewDecoder(res.Body).Decode(&body)

result := body.Data.Result

Handle the result

Use data.result to determine the outcome:

  • MATCH: the account and identity match. If you sent a beneficiary name, it also matches the bank's record.
  • NO_MATCH: one or more details do not match. Do not continue with the payout until you review data.errorDescription.
  • ERROR: the check could not be completed. Read data.errorDescription, then retry later or review the request manually.

Store data.requestId for reconciliation and support. Handle request-level failures (400 invalid input, 401 authentication failure, 403 forbidden, 429 too many requests) separately from a successful response with data.result set to NO_MATCH.

Sandbox testing

The sandbox provides match and no-match combinations for individuals and businesses. AV Pro also checks the beneficiary name, so each row includes the expected name.

Match (retail)

IdentityIDIBANName
National ID1083886659SA02 3082 5947 4580 2005 8295HAITHAM AL AYED
Iqama ID2526303150SA02 0548 2877 1759 4474 3614MAHMOUD AL-MASAA

Match (corporate)

UNNCRNIBANName
70075999831083886658SA02 5579 4102 7134 1512 1120SAUDI A.PAK.INDUSTRY
70013937997007599983SA02 1021 7220 3012 9444 5123Ψ§Ω„Ψ³ΨΉΩˆΨ―ΩŠΨ© Ψ£.Ψ¨Ψ§Ωƒ.Ψ΅Ω†Ψ§ΨΉΨ©

No-match (retail)

IdentityIDIBANName
National ID1009590330SA02 1012 0407 6563 5517 3154KHAMIS AL-JAFALI
Iqama ID2210802912SA02 1090 1704 8587 4890 0789RAED AL MUHAIDIB

No-match (corporate)

UNNCRNIBANName
70013937997007599883SA02 1021 7220 3012 9444 5123Ψ΄Ψ±ΩƒΨ© Ψ§Ω„Ψ±ΩŠΨ§ΨΆ Ω„Ω„Ψ΅Ω†Ψ§ΨΉΨ§Ψͺ Ψ§Ω„ΨΊΨ°Ψ§Ψ¦ΩŠ
70330510197007599983SA02 6003 2360 6513 2733 6863ZAIN KSA

Run the KSA API in Postman

Import the latest KSA collection and call both AV Pro endpoints without writing code.

Open in Postman

Key takeaways

  • AV Pro combines Account Verification and Beneficiary Verification in one request.
  • Use Match for individuals. Use Corporate for businesses, and provide at least one of companyRegistrationNumber or unn.
  • A successful response returns HTTP 200. Use data.result to determine whether the outcome is MATCH, NO_MATCH, or ERROR.

On this page