Bank account details

Comprehensive capture and extraction of Bank account details.

Extraction of bank account details is essential for a smooth transaction process. The automatic extraction and control of bank account details increases the speed of operations.

Introduction

Datakeen's OCR service automatically extracts information from bank account details.

  • Information is captured as structured data and can be extracted as a .json through our API.
  • Authenticity checks generate a compliance score to determine whether the bank account details are authentic.
Extracted informationControls
- Name of owner
- Address
- Detailed address
- City
- Gender
- Postal code
- IBAN
- BIC
- Bank name
- Bank country code
- Compliance control of the IBAN

Setting up the API

The synchronous API model extracts data from bank account details in real time. The synchronous API model also performs verification checks in order to control Document Validity, and Data consistency.

📘

API token is required

In order to perform any call, you will need an API token that can be retrieved thanks your API credentials. To learn about authentification, please refer to this page

curl --request POST \
     --url https://api.datakeen.co/api/v1/reco/bankdetails \
     --header 'accept: application/json' \
     --header 'content-type: application/json'
npm install api --save

const sdk = require('api')('@datakeen/v1.4.0#ax268r1ilnd0liqe');

sdk.postRecoBankdetails()
  .then(({ data }) => console.log(data))
  .catch(err => console.error(err));
require 'uri'
require 'net/http'

url = URI("https://api.datakeen.co/api/v1/reco/bankdetails")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["accept"] = 'application/json'
request["content-type"] = 'application/json'

response = http.request(request)
puts response.read_body
composer require guzzlehttp/guzzle

<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.datakeen.co/api/v1/reco/bankdetails', [
  'headers' => [
    'accept' => 'application/json',
    'content-type' => 'application/json',
  ],
]);

echo $response->getBody();
python -m pip install requests

import requests

url = "https://api.datakeen.co/api/v1/reco/bankdetails"

headers = {
    "accept": "application/json",
    "content-type": "application/json"
}

response = requests.post(url, headers=headers)

print(response.text)
CURL *hnd = curl_easy_init();

curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, stdout);
curl_easy_setopt(hnd, CURLOPT_URL, "https://api.datakeen.co/api/v1/reco/bankdetails");

struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "accept: application/json");
headers = curl_slist_append(headers, "content-type: application/json");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, headers);

CURLcode ret = curl_easy_perform(hnd);
dotnet add package RestSharp

using RestSharp;


var options = new RestClientOptions("https://api.datakeen.co/api/v1/reco/bankdetails");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("content-type", "application/json");
var response = await client.PostAsync(request);

Console.WriteLine("{0}", response.Content);

CURL *hnd = curl_easy_init();

curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(hnd, CURLOPT_WRITEDATA, stdout);
curl_easy_setopt(hnd, CURLOPT_URL, "https://api.datakeen.co/api/v1/reco/bankdetails");

struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "accept: application/json");
headers = curl_slist_append(headers, "content-type: application/json");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, headers);

CURLcode ret = curl_easy_perform(hnd);
(require '[clj-http.client :as client])

(client/post "https://api.datakeen.co/api/v1/reco/bankdetails" {:content-type :json
                                                       :accept :json})
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.datakeen.co/api/v1/reco/bankdetails"

	req, _ := http.NewRequest("POST", url, nil)

	req.Header.Add("accept", "application/json")
	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))

}
POST /api/v1/reco/bankdetails HTTP/1.1
Accept: application/json
Content-Type: application/json
Host: api.datakeen.co
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://api.datakeen.co/api/v1/reco/bankdetails")
  .post(null)
  .addHeader("accept", "application/json")
  .addHeader("content-type", "application/json")
  .build();

Response response = client.newCall(request).execute();
const options = {
  method: 'POST',
  headers: {accept: 'application/json', 'content-type': 'application/json'}
};

fetch('https://api.datakeen.co/api/v1/reco/bankdetails', options)
  .then(response => response.json())
  .then(response => console.log(response))
  .catch(err => console.error(err));
val client = OkHttpClient()

val request = Request.Builder()
  .url("https://api.datakeen.co/api/v1/reco/bankdetails")
  .post(null)
  .addHeader("accept", "application/json")
  .addHeader("content-type", "application/json")
  .build()

val response = client.newCall(request).execute()
#import <Foundation/Foundation.h>

NSDictionary *headers = @{ @"accept": @"application/json",
                           @"content-type": @"application/json" };

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://api.datakeen.co/api/v1/reco/bankdetails"]
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:10.0];
[request setHTTPMethod:@"POST"];
[request setAllHTTPHeaderFields:headers];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                if (error) {
                                                    NSLog(@"%@", error);
                                                } else {
                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
                                                    NSLog(@"%@", httpResponse);
                                                }
                                            }];
[dataTask resume];
open Cohttp_lwt_unix
open Cohttp
open Lwt

let uri = Uri.of_string "https://api.datakeen.co/api/v1/reco/bankdetails" in
let headers = Header.add_list (Header.init ()) [
  ("accept", "application/json");
  ("content-type", "application/json");
] in

Client.call ~headers `POST uri
>>= fun (res, body_stream) ->
  (* Do stuff with the result *)
$headers=@{}
$headers.Add("accept", "application/json")
$headers.Add("content-type", "application/json")
$response = Invoke-WebRequest -Uri 'https://api.datakeen.co/api/v1/reco/bankdetails' -Method POST -Headers $headers
library(httr)

url <- "https://api.datakeen.co/api/v1/reco/bankdetails"

response <- VERB("POST", url, content_type("application/json"), accept("application/json"))

content(response, "text")
import Foundation

let headers = [
  "accept": "application/json",
  "content-type": "application/json"
]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.datakeen.co/api/v1/reco/bankdetails")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()

🚧

Sending multiple documents

Scans, pictures and documents should be sent one by one. If you want to send multiple scans at the same time, please refer to the multi-docs API.

API Response

An instance of the usual response is displayed in the following JSON. You will find the complete information, including extraction and checks. More detailed examples of each extracted field are given below.

{
    "controls": {
        "ibanConformity": {
            "confidence": 5,
            "errors": [],
            "value": true
        }
    },
    "extractedInformation": {
        "accountOwner": {
            "confidence": 0,
            "value": "MARTIAL BANQ"
        },
        "address": {
            "confidence": 0,
            "value": "32 rue maurice berteaux"
        },
        "bic": {
            "confidence": 0,
            "value": "CRLYFRPP"
        },
        "city": {
            "confidence": 0,
            "value": "LE BLANC MESNIL"
        },
        "civility": {
            "confidence": 0,
            "value": "M"
        },
        "iban": {
            "confidence": 0,
            "value": "FR6130002011390000033459W90"
        },
        "zipCode": {
            "confidence": 0,
            "value": "93150"
        },
        "bankName": {
            "confidence": 0,
            "value": "Crédit mutuel"
        },
        "bankCountryCode": {
            "confidence": 0,
            "value": "FR"
        },
    },
    "message": "",
    "status": 200
}

Extracted information format

For each field, the confidence value indicates the degree of certainty of the extraction with regard to the data on the bank account details.

Name of owner

The accountOwner (key) on the given bank account details is returned as a string (value).

accountOwnerValue
valuestring
confidencenumber
"accountOwner": {
  "confidence": 0,
  "value": "MAREE"
}

Address

The address (key) on the given bank account details is returned as a string (value).

addressValue
valuestring
confidencenumber
"address": {
  "confidence": 0,
  "value": ""
}

IBAN

The iban (key) on the given bank account details is returned as a string (value).

ibanValue
valuestring
confidencenumber
"iban": {
  "confidence": 0,
  "value": "FR7610206080009838005094566"
}

Postal Code

The zipCode (key) on the given bank account details is returned as a string (value).

zipCodeValue
valuestring
confidencenumber
"zipCode": {
  "confidence": 0,
  "value": "93150"
}

Gender

The civility (key) on the given bank account details is returned as a string (value).

civilityValue
valuestring
confidencenumber
"civility": {
  "confidence": 0,
  "value": "M"
}

City

The city (key) on the given bank account details is returned as a string (value).

cityValue
valuestring
confidencenumber
"city": {
  "confidence": 0,
  "value": "LE BLANC MESNIL"
},

BIC

The bic (key) on the given bank account details is returned as a string (value).

bicValue
valuestring
confidencenumber
"bic": {
  "confidence": 0,
  "value": "CRLYFRPP"
}

Bank name

The bankName (key) on the given bank account details is returned as a string (value).

bankNameValue
valuestring
confidencenumber
"bankName": {
  "confidence": 0,
  "value": "Crédit mutuel"
}

Bank country code

The bankCountryCode (key) on the given bank account details is returned as a string (value).

bankCountryCodeValue
valuestring
confidencenumber
"bankCountryCode": {
  "confidence": 0,
  "value": "FR"
}

Control results format

The controls applied to each document can be extracted in a boolean format. The confidence field indicated the degree of certainty of the control.

Compliance control of the IBAN

The ibanConformity returns, as a boolean (value), whether the bank account details document is accepted or rejected with regard to our global minimum accepted rates.

ibanConformityValue
valueboolean
confidencenumber
"ibanConformity": {
  "confidence": 5,
  "errors": [],
  "value": true
}

Additional information

🚧

Loaded scans must pass prerequisites

To provide a qualitative service and a comprehensive data capture, every picture, scan, or document sent to our API must comply with determined prerequisites which can be found on this page

❗️

API limitations

  • Maximum size : 5 MB
  • Maximum number of calls per minute : 10 calls

What’s Next

Ready to process bank account details ? See our API Reference for detailed information