curl -X POST https://verification.didit.me/v3/bank/account-check/ \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"country": "GBR",
"account": {"sort_code": "20-45-67", "account_number": "31926819"},
"holder": {"full_name": "Maria Oliveira"},
"vendor_data": "payout_20481"
}'import os, requests
resp = requests.post(
"https://verification.didit.me/v3/bank/account-check/",
headers={"x-api-key": os.environ["DIDIT_API_KEY"]},
json={
"country": "GBR",
"account": {"sort_code": "20-45-67", "account_number": "31926819"},
"holder": {"full_name": "Maria Oliveira"},
"vendor_data": "payout_20481",
},
timeout=30,
)
resp.raise_for_status()
check = resp.json()
if check["result"] == "match":
pass # send the payout
elif check["result"] == "close_match":
print(check["holder_name"]) # the name the bank holds, when it returned oneconst res = await fetch('https://verification.didit.me/v3/bank/account-check/', {
method: 'POST',
headers: {
'x-api-key': process.env.DIDIT_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
country: 'GBR',
account: { sort_code: '20-45-67', account_number: '31926819' },
holder: { full_name: 'Maria Oliveira' },
vendor_data: 'payout_20481',
}),
});
const check = await res.json();
// check.result: match, close_match, no_match or cannot_verify<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/bank/account-check/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'country' => 'GBR',
'account' => [
'sort_code' => '20-45-67',
'account_number' => '31926819'
],
'holder' => [
'full_name' => 'Maria Oliveira'
],
'vendor_data' => 'payout_20481'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v3/bank/account-check/"
payload := strings.NewReader("{\n \"country\": \"GBR\",\n \"account\": {\n \"sort_code\": \"20-45-67\",\n \"account_number\": \"31926819\"\n },\n \"holder\": {\n \"full_name\": \"Maria Oliveira\"\n },\n \"vendor_data\": \"payout_20481\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://verification.didit.me/v3/bank/account-check/")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"country\": \"GBR\",\n \"account\": {\n \"sort_code\": \"20-45-67\",\n \"account_number\": \"31926819\"\n },\n \"holder\": {\n \"full_name\": \"Maria Oliveira\"\n },\n \"vendor_data\": \"payout_20481\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/bank/account-check/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"country\": \"GBR\",\n \"account\": {\n \"sort_code\": \"20-45-67\",\n \"account_number\": \"31926819\"\n },\n \"holder\": {\n \"full_name\": \"Maria Oliveira\"\n },\n \"vendor_data\": \"payout_20481\"\n}"
response = http.request(request)
puts response.read_body{
"request_id": "c2f4a9e0-7b1d-4c3a-9e55-1d0a6b8f2a47",
"result": "close_match",
"holder_name": "MARIA R OLIVEIRA",
"account": "****6819",
"vendor_data": "payout_20481",
"created_at": "2026-10-21T14:32:08Z"
}Account Check API
Check that a bank account belongs to the person or company you name, before you send money to it. No session and no sign-in.
curl -X POST https://verification.didit.me/v3/bank/account-check/ \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"country": "GBR",
"account": {"sort_code": "20-45-67", "account_number": "31926819"},
"holder": {"full_name": "Maria Oliveira"},
"vendor_data": "payout_20481"
}'import os, requests
resp = requests.post(
"https://verification.didit.me/v3/bank/account-check/",
headers={"x-api-key": os.environ["DIDIT_API_KEY"]},
json={
"country": "GBR",
"account": {"sort_code": "20-45-67", "account_number": "31926819"},
"holder": {"full_name": "Maria Oliveira"},
"vendor_data": "payout_20481",
},
timeout=30,
)
resp.raise_for_status()
check = resp.json()
if check["result"] == "match":
pass # send the payout
elif check["result"] == "close_match":
print(check["holder_name"]) # the name the bank holds, when it returned oneconst res = await fetch('https://verification.didit.me/v3/bank/account-check/', {
method: 'POST',
headers: {
'x-api-key': process.env.DIDIT_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
country: 'GBR',
account: { sort_code: '20-45-67', account_number: '31926819' },
holder: { full_name: 'Maria Oliveira' },
vendor_data: 'payout_20481',
}),
});
const check = await res.json();
// check.result: match, close_match, no_match or cannot_verify<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://verification.didit.me/v3/bank/account-check/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'country' => 'GBR',
'account' => [
'sort_code' => '20-45-67',
'account_number' => '31926819'
],
'holder' => [
'full_name' => 'Maria Oliveira'
],
'vendor_data' => 'payout_20481'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://verification.didit.me/v3/bank/account-check/"
payload := strings.NewReader("{\n \"country\": \"GBR\",\n \"account\": {\n \"sort_code\": \"20-45-67\",\n \"account_number\": \"31926819\"\n },\n \"holder\": {\n \"full_name\": \"Maria Oliveira\"\n },\n \"vendor_data\": \"payout_20481\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://verification.didit.me/v3/bank/account-check/")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"country\": \"GBR\",\n \"account\": {\n \"sort_code\": \"20-45-67\",\n \"account_number\": \"31926819\"\n },\n \"holder\": {\n \"full_name\": \"Maria Oliveira\"\n },\n \"vendor_data\": \"payout_20481\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://verification.didit.me/v3/bank/account-check/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"country\": \"GBR\",\n \"account\": {\n \"sort_code\": \"20-45-67\",\n \"account_number\": \"31926819\"\n },\n \"holder\": {\n \"full_name\": \"Maria Oliveira\"\n },\n \"vendor_data\": \"payout_20481\"\n}"
response = http.request(request)
puts response.read_body{
"request_id": "c2f4a9e0-7b1d-4c3a-9e55-1d0a6b8f2a47",
"result": "close_match",
"holder_name": "MARIA R OLIVEIRA",
"account": "****6819",
"vendor_data": "payout_20481",
"created_at": "2026-10-21T14:32:08Z"
}Send the account the way its country writes it
| Country | account |
|---|---|
| IBAN countries | {"iban": "..."} |
| United Kingdom | {"sort_code": "...", "account_number": "..."} |
| United States | {"routing_number": "...", "account_number": "..."} |
| Canada | {"transit_institution": "...", "account_number": "..."} |
| Australia | {"bsb": "...", "account_number": "..."} |
| India | {"ifsc": "...", "account_number": "..."} |
| Nigeria | {"bank_code": "...", "account_number": "..."} |
| Mexico | {"clabe": "..."} |
| Argentina | {"cbu_cvu": "..."} |
bic, and for a business account a registration_id. Spaces, dashes and dots are ignored. A key the country’s check needs and does not get is a 400 naming it, for example "field": "account.sort_code", "reason": "required".
Send holder.full_name to check a person’s account, or holder.business_name to check a company’s.
Read the result
result | What it means | Typical next step |
|---|---|---|
match | The bank holds the account under the name you sent. | Send the money. |
close_match | The bank holds it under a close name. holder_name is that name, when the bank returned it. | Compare holder_name, or ask the person to confirm. |
no_match | The bank holds it under another name, or there is no such account. | Do not send the money. |
cannot_verify | The bank answered without comparing the name, for example for a blocked or closed account. | Apply your own policy, for example ask for another account. |
Billing and retries
Each check the bank answers is billed once at the Account check price of the account’s country, whatever the result. A request answered with an error is never billed: a refused body (400), no credit (402), an account no check serves yet (404) or a bank that could not answer (503).
There is no idempotency key and no endpoint to read a check back. A retried request runs a new check, with a new request_id, and is billed again, so store the response. Didit stores only the charge, with the request ID, the country, the result and the masked account, never the name or the full account number.
Test it in sandbox
A sandbox API key calls no bank and is charged nothing. The last 4 characters of the IBAN, else of the account number, choose the answer:| Ends in | Answer |
|---|---|
0001 | close_match, with a holder_name |
0002 | close_match, holder_name: null |
0003, 0006 | no_match |
0004 | cannot_verify |
0005 | 503, account_check_unavailable |
0009 | 400, reason: rejected |
| Anything else | match |
Access
Authenticate with your application’sx-api-key, or with its client-credentials bearer token. A scoped API key needs write access to sessions. The endpoint shares the write limit of 300 requests per minute per API key.Authorizations
Your application's API key, from Developers -> API keys in the Business Console. The primary key has full access. A named key can be scoped: none, read or write per resource, limited to some workflows or to approved sessions, to a list of IP addresses, and to an expiry date. 401 means the key is missing, wrong, revoked or expired; 403 means the key has no access to this resource or action, or the request came from an address outside its IP list; 404 on a session route means the session is outside the key's workflows or statuses. A key without media access receives image, video and PDF URLs as null, and a key without sessions write receives session links and tokens as null. See https://docs.didit.me/console/api-keys.
Body
The account's country, as an ISO 3166-1 alpha-3 code, for example GBR. Lowercase is accepted.
3"GBR"
The account the way its country writes it: an iban, or an account_number with the bank or branch code the country needs (sort_code, routing_number, transit_institution, bsb, ifsc, bank_code or bic). Mexico takes a clabe and Argentina a cbu_cvu, which already name the bank. A business account adds a registration_id where the country asks for one. Spaces, dashes and dots are ignored. Keys the country's check does not use are ignored; a key it needs and does not get is a 400 that names it.
Show child attributes
Show child attributes
{
"sort_code": "20-45-67",
"account_number": "31926819"
}
The name the account is checked against. Send exactly one of full_name and business_name.
- Option 1
- Option 2
Show child attributes
Show child attributes
Your own reference for this check, returned unchanged.
"payout_20481"
Response
The bank answered. The check is billed, whatever the result.
The ID of this check.
match: the bank holds the account under the name you sent. close_match: under a close name, for example a missing middle name or a typo. no_match: under another name, or there is no such account. cannot_verify: the bank answered without comparing the name, for example for a blocked or closed account.
match, close_match, no_match, cannot_verify Only on a close_match, and only when the bank returned it: the name on the account, as the bank holds it. null otherwise.
The account, masked to its last 4 characters.
Your own reference, as you sent it.
When the check ran, in UTC.