Verify a NIN (National Identification Number)
curl --request POST \
--url https://api-partner.onecluster.co/api/v1/kyc/nin/verify \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--header 'X-Signature: <x-signature>' \
--data '
{
"nin": "12345678901",
"nameToMatch": "Adebayo Johnson"
}
'import requests
url = "https://api-partner.onecluster.co/api/v1/kyc/nin/verify"
payload = {
"nin": "12345678901",
"nameToMatch": "Adebayo Johnson"
}
headers = {
"X-Signature": "<x-signature>",
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Signature': '<x-signature>',
Authorization: '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({nin: '12345678901', nameToMatch: 'Adebayo Johnson'})
};
fetch('https://api-partner.onecluster.co/api/v1/kyc/nin/verify', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-partner.onecluster.co/api/v1/kyc/nin/verify",
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([
'nin' => '12345678901',
'nameToMatch' => 'Adebayo Johnson'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json",
"X-Signature: <x-signature>"
],
]);
$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://api-partner.onecluster.co/api/v1/kyc/nin/verify"
payload := strings.NewReader("{\n \"nin\": \"12345678901\",\n \"nameToMatch\": \"Adebayo Johnson\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Signature", "<x-signature>")
req.Header.Add("Authorization", "<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://api-partner.onecluster.co/api/v1/kyc/nin/verify")
.header("X-Signature", "<x-signature>")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"nin\": \"12345678901\",\n \"nameToMatch\": \"Adebayo Johnson\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-partner.onecluster.co/api/v1/kyc/nin/verify")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Signature"] = '<x-signature>'
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"nin\": \"12345678901\",\n \"nameToMatch\": \"Adebayo Johnson\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"responseCode": "00",
"message": "NIN verified",
"data": {
"match": true,
"ninMasked": "****8901",
"nameMatchScore": 0.97
}
}{
"type": "https://api.onecluster.co/errors/insufficient-funds",
"title": "Insufficient Funds",
"status": 422,
"detail": "The account balance is ₦0.00. You need at least ₦50,000.00 to complete this transfer.",
"instance": "/api/v1/payments/transfer",
"correlationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"code": "INSUFFICIENT_FUNDS"
}KYC Endpoints
Verify NIN
Verifies a NIN against the NIMC (National Identity Management Commission) database. Returns masked identity information, full PII is never exposed.
POST
/
api
/
v1
/
kyc
/
nin
/
verify
Verify a NIN (National Identification Number)
curl --request POST \
--url https://api-partner.onecluster.co/api/v1/kyc/nin/verify \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--header 'X-Signature: <x-signature>' \
--data '
{
"nin": "12345678901",
"nameToMatch": "Adebayo Johnson"
}
'import requests
url = "https://api-partner.onecluster.co/api/v1/kyc/nin/verify"
payload = {
"nin": "12345678901",
"nameToMatch": "Adebayo Johnson"
}
headers = {
"X-Signature": "<x-signature>",
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Signature': '<x-signature>',
Authorization: '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({nin: '12345678901', nameToMatch: 'Adebayo Johnson'})
};
fetch('https://api-partner.onecluster.co/api/v1/kyc/nin/verify', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-partner.onecluster.co/api/v1/kyc/nin/verify",
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([
'nin' => '12345678901',
'nameToMatch' => 'Adebayo Johnson'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json",
"X-Signature: <x-signature>"
],
]);
$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://api-partner.onecluster.co/api/v1/kyc/nin/verify"
payload := strings.NewReader("{\n \"nin\": \"12345678901\",\n \"nameToMatch\": \"Adebayo Johnson\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Signature", "<x-signature>")
req.Header.Add("Authorization", "<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://api-partner.onecluster.co/api/v1/kyc/nin/verify")
.header("X-Signature", "<x-signature>")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"nin\": \"12345678901\",\n \"nameToMatch\": \"Adebayo Johnson\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-partner.onecluster.co/api/v1/kyc/nin/verify")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Signature"] = '<x-signature>'
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"nin\": \"12345678901\",\n \"nameToMatch\": \"Adebayo Johnson\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"responseCode": "00",
"message": "NIN verified",
"data": {
"match": true,
"ninMasked": "****8901",
"nameMatchScore": 0.97
}
}{
"type": "https://api.onecluster.co/errors/insufficient-funds",
"title": "Insufficient Funds",
"status": 422,
"detail": "The account balance is ₦0.00. You need at least ₦50,000.00 to complete this transfer.",
"instance": "/api/v1/payments/transfer",
"correlationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"code": "INSUFFICIENT_FUNDS"
}Authorizations
Your API key, formatted as: ApiKey ubn_sb_your_key_here
- Sandbox keys start with
ubn_sb_ - Production keys start with
ubn_pk_ - Never use production keys during testing, they will charge real money
Headers
A UUID v4 you generate to trace this request through our systems. If you don't provide one, we generate it for you. Always include it in support requests, it helps us find your request in logs.
Example:
"7f3a9c21-4e8b-4a12-b6d1-3c8a7f2e1b09"
Body
application/json
Response
NIN verification result (PII masked)
Standard response wrapper for all successful API calls

