0% found this document useful (0 votes)
39 views

FirstCentral Credit Bureau Nigeria REST Data Submission Web Service API Version5 (1)

Uploaded by

Lennox
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
39 views

FirstCentral Credit Bureau Nigeria REST Data Submission Web Service API Version5 (1)

Uploaded by

Lennox
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 43

FirstCentral Credit Bureau Nigeria REST Data Submission

Web Service API


Version 1.5

Copyright 2006 – 2021 FirstCentral Credit


Bureau Limited All right reserved.
Copyright on the whole and every part of this document belongs to FirstCentral Credit Bureau
Limited (the
“owner”) and it may not be used, sold, transferred, copied or reproduced in whole or in part in any
manner or form or in or on any media to any person other than in accordance with the terms of
the Owner’s agreement or otherwise without prior written consent of the Owner.

1
Data Submission Integration Documentation

Table of Content
1. Introduction
2. Consumer Record Header
3. Commercial Record Header
4. Consumer Dud Cheque Header
5. Commercial Dud Cheque Header
6. Update JSON Structure Template
7. Record Encryption
8. Login Process
9. Uploading record with endpoint API

2
Introduction
Consumer Record Header is voluminous demography and credit record required for daily, weekly and monthly
data submission. The purpose of Data Submission is to meet real-time credit record update monthly.

The below is REST API test url and end points


https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/
End points
1. Login
2. IsTicketValid
3. SubmitBatchUpdate
4. Consumer
5. ConsumerDudCheque
6. Commercial
7. CommercialDudCheque

Consumer Record Header


Fields Mandatory Required DataType
CUSTOMERID Yes Yes string
BRANCHCODE Yes Yes string
SURNAME Yes Yes string
FIRSTNAME Yes Yes string
MIDDLENAME No No string
DATEOFBIRTH Yes Yes Date
NATIONALIDENTITYNUMBER No No string
DRIVERSLICENSENUMBER No No string
BVNNUMBER Yes Yes Number
PASSPORTNUMBER No No string
PENCOMIDNUMBER No No None
OTHERID No No string
GENDER Yes Yes string
NATIONALITY Yes Yes string
MARITALSTATUS Yes Yes string
MOBILENUMBER Yes Yes string
PRIMARYADDRESSLINE1 Yes Yes string
PRIMARYADDRESSLINE2 Yes Yes string
PRIMARYADDRESSCITY Yes Yes string
PRIMARYADDRESSSTATE Yes Yes string
PRIMARYADDRESSCOUNTRY Yes Yes string
PRIMARYADDRESSPOSTCODE No No None
3
EMPLOYMENTSTATUS Yes Yes string
OCCUPATION Yes Yes string
BUSINESSCATEGORY Yes Yes string
BUSINESSSECTOR Yes Yes string
BORROWERTYPE Yes Yes string
TAXID No No string
PICTUREFILEPATH No No string
EMAILADDRESS No No string
EMPLOYERNAME No No string
EMPLOYERADDRESSLINE1 No No string
EMPLOYERADDRESSLINE2 No No string
EMPLOYERCITY No No string
EMPLOYERSTATE No No string
EMPLOYERCOUNTRY No No string
TITLE No No string
PLACEOFBIRTH No No string
WORKTELEPHONE No No Numeric
HOMETELEPHONE No No Numeric
SECONDARYADDRESSLINE1 No No string
SECONDARYADDRESSLINE2 No No string
SECONDARYADDRESSCITYLGA Conditional Conditional string
SECONDARYADDRESSSTATE Conditional Conditional string
SECONDARYADDRESSCOUNTRY Conditional Conditional string
SECONDARYADDRESSPOSTCODE No No None
SPOUSESURNAME Conditional Conditional string
SPOUSEFIRSTNAME Conditional Conditional string
SPOUSEMIDDLENAME No No string
ACCOUNTNUMBER Yes Yes string
ACCOUNTSTATUS Yes Yes string
ACCOUNTSTATUSDATE Yes Yes Date
LOANEFFECTIVEDATE Yes Yes Date
DEFEREDPAYMENTDATE No No None
CREDITLIMIT Yes Yes Numeric
AVAILEDLIMIT Yes Yes Numeric
OUTSTANDINGBALANCE Yes Yes Numeric
CURRENTBALANCEDEBITIND No No None
INSTALMENTAMOUNT No No Numeric
CURRENCY Yes Yes string
DAYSINARREARS Yes Yes Numeric
OVERDUEAMOUNT Yes Yes Numeric
FACILITYTYPE Yes Yes string
FACILITYTENOR Yes Yes string
FACILITYOWNERSHIPTYPE No No None

4
REPAYMENTFREQUENCY Yes Yes string
LASTPAYMENTDATE Yes Yes Date
LASTPAYMENTAMOUNT Yes Yes Numeric
MATURITYDATE Yes Yes Date
INCOME No No None
INCOMEFREQUENCY No No None
OWNERTENANT No No None
NUMBEROFPARTICIPANTSINJOINTLOAN No No None
DEPENDANTS No No None
LOANCLASSIFICATION Yes Yes string
LEGALCHALLENGESTATUS Yes Yes string
LITIGATIONDATE Conditional Conditional Date
CONSENTSTATUS Yes Yes string
LOANSECURITYSTATUS Yes Yes string
COLLATERALTYPE Conditional Conditional string
COLLATERALDETAILS Conditional Conditional string
PREVIOUSACCOUNTNUMBER No No Numeric
PREVIOUSNAME No No string
PREVIOUSCUSTOMERID No No string
PREVIOUSBRANCHCODE No No string
CUSTOMERSACCOUNTNUMBER Yes Yes string
GUARANTEESTATUSOFLOAN Yes Yes string
TYPEOFGUARANTEE Conditional Conditional string
NAMEOFCORPORATEGUARANTOR Conditional Conditional string
BIZIDNUMBEROFCORPORATEGUARANTOR Conditional Conditional string
INDIVIDUALGUARANTORSURNAME Conditional Conditional string
INDIVIDUALGUARANTORFIRSTNAME Conditional Conditional string
INDIVIDUALGUARNTORMIDDLENAME No No string
GUARANTORDATEOFBIRTHINCORPORATION Yes Yes Date
GUARANTORGENDER Conditional Conditional string
GUARANTORNATIONALIDNUMBER No No string
GUARNATORINTLPASSPORTNUMBER No No string
GUARANTORDRIVERSLICENCENUMBER No No string
GUARANTORBVN Yes Yes Numeric
GUARANTOROTHERID No No string
GUARANTORPRIMARYADDRESSLINE1 Yes Yes string
GUARANTORPRIMARYADDRESSLINE2 Yes Yes string
GUARANTORPRIMARYADDRESSCITYLGA No No string
GUARANTORPRIMARYADDRESSSTATE Yes Yes string
GUARANTORPRIMARYADDRESSCOUNTRY Yes Yes string
GUARANTORPRIMARYPHONENUMBER Yes Yes Numeric
GUARANTOREMAIL No No string

5
Consumer Dud Cheque Record Header
Table Header Mandatory Required DataType
CUSTOMERID Yes Yes string
BRANCHCODE Yes Yes string
SURNAME Yes Yes string
FIRSTNAME Yes Yes string
MIDDLENAME No No string
DATEOFBIRTH Yes Yes Date
NATIONALIDENTITYNUMBER No No string
DRIVERSLICENSENUMBER No No string
BVNNUMBER Yes Yes string
PASSPORTNUMBER No No string
OTHERID No No string
GENDER Yes Yes string
NATIONALITY Yes Yes string
MARITALSTATUS Yes Yes string
MOBILENUMBER Yes Yes string
PRIMARYADDRESSLINE1 Yes Yes string
PRIMARYADDRESSLINE2 Yes Yes string
PRIMARYADDRESSCITY Yes Yes string
PRIMARYADDRESSSTATE Yes Yes string
PRIMARYADDRESSCOUNTRY Yes Yes string
EMPLOYMENTSTATUS Yes Yes string
OCCUPATION Yes Yes string
BUSINESSCATEGORY Yes Yes string
BUSINESSSECTOR Yes Yes string
BORROWERTYPE Yes Yes string
TAXID No No string
PICTUREFILEPATH No No string
EMAILADDRESS No No string
EMPLOYERNAME No No string
EMPLOYERADDRESSLINE1 No No string
EMPLOYERADDRESSLINE2 No No string
EMPLOYERCITY No No string
EMPLOYERSTATE No No string
EMPLOYERCOUNTRY No No string
TITLE No No string
PLACEOFBIRTH No No string
WORKTELEPHONE No No string
HOMETELEPHONE No No string
SECONDARYADDRESSLINE1 No No string
SECONDARYADDRESSLINE2 No No string
SECONDARYADDRESSCITYLGA Conditional Conditional string
6
SECONDARYADDRESSSTATE Conditional Conditional string
SECONDARYADDRESSCOUNTRY Conditional Conditional string
SPOUSESURNAME Conditional Conditional string
SPOUSEFIRSTNAME Conditional Conditional string
SPOUSEMIDDLENAME No No string
ACCOUNTNUMBER Yes Yes string
DATEACCOUNTOPENED Yes Yes Date
CHEQUENUMBER Yes Yes string
DATECHEQUEISSUED Yes Yes Date
DATECHEQUEBOUNCED Yes Yes Date
MICRNUMBER Yes Yes string
SORTCODE No No int
AMOUNTREJECTED Yes Yes double
PAYEE No No string
ISSUERNUMBER Yes Yes int
ISSUINGBANK Yes Yes string
TRANSACTIONID Yes Yes int
REASONFORBOUNCEDTRANSACTION Yes Yes string
CURRENCY Yes Yes string
HOMETELEPHONENUMBER Yes Yes string
CELLULARTELEPHONENUMBER No No string
WORKTELEPHONENUMBER No No string
FREQUENCY Yes Yes int
SETTLED No No string
SETTLEMENTDATE No No Date

Commercial Record Header

Table Header Mandatory Required DataType


BUSINESSREGISTRATIONNUMBER Yes Yes string
BUSINESSNAME Yes Yes string
BUSINESSTRADINGNAME Yes Yes NULL
BUSINESSCATEGORY Yes Yes string
BUSINESSSECTOR No No string
DATEOFINCORPORATION Yes Yes Date
CUSTOMERID Yes Yes string
CUSTOMERBRANCHCODE Yes Yes string
BUSINESSOFFICEADDRESSLINE1 Yes Yes string
BUSINESSOFFICEADDRESSLINE2 Yes Yes string
BUSINESSOFFICEADDRESSCITYLGA No No string

7
BUSINESSOFFICEADDRESSSTATE Yes Yes string
BUSINESSOFFICEADDRESSCOUNTRY Yes Yes string
BUSINESSOFFICEADDRESSPOSTCODE No No None
EMAILADDRESS No No string
SECONDARYADDRESSLINE1 No No string
SECONDARYADDRESSLINE2 No No string
SECONDARYADDRESSCITYLGA No No string
SECONDARYADDRESSSTATE No No string
SECONDARYADDRESSCOUNTRY No No string
SECONDARYADDRESSPOSTCODE No No None
TAXID No No string
PRIMARYPHONENUMBER No No string
SECONDARYPHONENUMBER No No string
ACCOUNTNUMBER Yes Yes string
ACCOUNTSTATUS Yes Yes string
ACCOUNTSTATUSDATE Yes Yes Date
LOANEFFECTIVEDATE Yes Yes Date
DEFEREDPAYMENTDATE No No None
CREDITLIMIT Yes Yes Numeric
AVAILEDLIMIT Yes Yes Numeric
OUTSTANDINGBALANCE Yes Yes Numeric
CURRENTBALANCEDEBITIND No No None
INSTALMENTAMOUNT No No Numeric
CURRENCY Yes Yes string
DAYSINARREARS Yes Yes Numeric
OVERDUEAMOUNT Yes Yes Numeric
FACILITYTYPE Yes Yes string
FACILITYTENOR Yes Yes string
REPAYMENTFREQUENCY Yes Yes string
LASTPAYMENTDATE Yes Yes Date
LASTPAYMENTAMOUNT Yes Yes Numeric
MATURITYDATE Yes Yes Date
LOANCLASSIFICATION Yes Yes string
LEGALCHALLENGESTATUS Yes Yes string
LITIGATIONDATE Conditional Conditional Date
CONSENTSTATUS Yes Yes string
LOANSECURITYSTATUS Yes Yes string
COLLATERALTYPE Conditional Conditional string
COLLATERALDETAILS Conditional Conditional string
PREVIOUSACCOUNTNUMBER No No Numeric
PREVIOUSNAME No No string
PREVIOUSCUSTOMERID No No string
PREVIOUSBRANCHCODE No No string

8
NUMBEROFDIRECTORS NULL NULL NULL
PRINCIPALOFFICER1SURNAME Yes Yes string
PRINCIPALOFFICER1FIRSTNAME Yes Yes string
PRINCIPALOFFICER1MIDDLENAME No No string
PRINCIPALOFFICER1DATEOFBIRTH Yes Yes Date
PRINCIPALOFFICER1GENDER Yes Yes string
PRINCIPALOFFICER1PRIMARYADDRESSLINE1 Yes Yes string
PRINCIPALOFFICER1PRIMARYADDRESSLINE2 No No string
PRINCIPALOFFICER1CITY Yes Yes string
PRINCIPALOFFICER1STATE Yes Yes string
PRINCIPALOFFICER1COUNTRY Yes Yes string
PRINCIPALOFFICER1NATIONALID No No string
PRINCIPALOFFICER1DRIVERSLICENSENUMBER No No string
PRINCIPALOFFICER1BVNNUMBER Yes Yes Numeric
PRINCIPALOFFICER1PASSPORTNUMBER Yes Yes string
PRINCIPALOFFICER1OTHERIDNUMBER NULL NULL NULL
PRINCIPALOFFICER1PHONENUMBER Yes Yes string
PRINCIPALOFFICER1EMAILADDRESS No No string
PRINCIPALOFFICER1POSITIONINBUSINESS Yes Yes string
PRINCIPALOFFICER2SURNAME Conditional Conditional string
PRINCIPALOFFICER2FIRSTNAME Conditional Conditional string
PRINCIPALOFFICER2MIDDLENAME Conditional Conditional string
PRINCIPALOFFICER2DATEOFBIRTH Conditional Conditional Date
PRINCIPALOFFICER2GENDER Conditional Conditional string
PRINCIPALOFFICER2PRIMARYADDRESSLINE1 Conditional Conditional string
PRINCIPALOFFICER2PRIMARYADDRESSLINE2 Conditional Conditional string
PRINCIPALOFFICER2CITY Conditional Conditional string
PRINCIPALOFFICER2STATE Conditional Conditional string
PRINCIPALOFFICER2COUNTRY Conditional Conditional string
PRINCIPALOFFICER2NATIONALID Conditional Conditional string
PRINCIPALOFFICER2DRIVERSLISCENCENUMBER Conditional Conditional string
PRINCIPALOFFICER2BVNNUMBER Conditional Conditional Numeric
PRINCIPALOFFICER2PASSPORTNUMBER Conditional Conditional string
PRINCIPALOFFICER2OTHERIDNUMBER NULL NULL NULL
PRINCIPALOFFICER2PHONENUMBER Conditional Conditional Numeric
PRINCIPALOFFICER2EMAILADDRESS Conditional Conditional string
PRINCIPALOFFICER2POSITIONINBUSINESS Conditional Conditional string

9
Commercial Dud Cheque Record Header
Table Header Mandatory Required DataType
BUSINESSREGISTRATIONNUMBER Yes Yes string
BUSINESSNAME Yes Yes string
BUSINESSCATEGORY NO NO string
BUSINESSSECTOR NO NO string
DATEOFINCORPORATION No No Date
CUSTOMERID Yes Yes string
CUSTOMERBRANCHCODE Yes Yes string
BUSINESSOFFICEADDRESSLINE1 Yes Yes string
BUSINESSOFFICEADDRESSLINE2 Yes Yes string
BUSINESSOFFICEADDRESSCITYLGA Yes Yes string
BUSINESSOFFICEADDRESSSTATE Yes Yes string
BUSINESSOFFICEADDRESSCOUNTRY Yes Yes string
PRIMARYPHONENUMBER Yes Yes Numeric
EMAILADDRESS NO NO string
SECONDARYADDRESSLINE1 No No string
SECONDARYADDRESSLINE2 NO NO string
SECONDARYADDRESSCITYLGA NO NO string
SECONDARYADDRESSSTATE No No string
SECONDARYADDRESSCOUNTRY No No string
TAXID Yes Yes Numeric
SECONDARYPHONENUMBER No No Numeric
ACCOUNTNUMBER Yes Yes string
DATEACCOUNTOPENED Yes Yes Date
CHEQUENUMBER Yes Yes string
DATECHEQUEISSUED Yes Yes Date
DATECHEQUEBOUNCED Yes Yes Date
MICRNUMBER Yes Yes string
SORTCODE No No Numeric
AMOUNTREJECTED Yes Yes Numeric
PAYEE No No string
ISSUERNUMBER Yes Yes Numeric
ISSUINGBANK Yes Yes string
TRANSACTIONID Yes Yes Numeric
REASONFORBOUNCEDTRANSACTION Yes Yes string
CURRENCY Yes Yes string
HOMETELEPHONENUMBER Yes Yes Numeric
CELLULARTELEPHONENUMBER No No Numeric
WORKTELEPHONENUMBER No No Numeric
FREQUENCY Yes Yes Numeric
SETTLED No No string
SETTLEMENTDATE NO NO Date
10
JSON Structure for Consumer Record
[{
"CUSTOMERID":"43231345",
"BRANCHCODE":"12",
"SURNAME":"Mayowa",
"FIRSTNAME":"CHIKAODIRI",
"MIDDLENAME":"Husman",
"DATEOFBIRTH":"19780520",
"NATIONALIDENTITYNUMBER":"",
"DRIVERSLICENSENUMBER":"",
"BVNNUMBER":"12345678901",
"PASSPORTNUMBER":"",
"PENCOMIDNUMBER":"",
"OTHERID":"",
"GENDER":"Female",
"NATIONALITY":"Nigeria",
"MARITALSTATUS":"Married",
"MOBILENUMBER":"",
"PRIMARYADDRESSLINE1":"13 AWOLOWO ROAD IKEJA",
"PRIMARYADDRESSLINE2":"PO BOX 321 IKEJA",
"PRIMARYADDRESSCITY":"LAGOS",
"PRIMARYADDRESSSTATE":"",
"PRIMARYADDRESSCOUNTRY":"",
"PRIMARYADDRESSPOSTCODE":"",
"EMPLOYMENTSTATUS":"Self Employed",
"OCCUPATION":"OTHERS",
"BUSINESSCATEGORY":"MEDI",
"BUSINESSSECTOR":"",
"BORROWERTYPE":"Individual",
"TAXID":"",
"PICTUREFILEPATH":"",
11
"EMAILADDRESS":"",
"EMPLOYERNAME":"",
"EMPLOYERADDRESSLINE1":"",
"EMPLOYERADDRESSLINE2":"",
"EMPLOYERCITY":"",
"EMPLOYERSTATE":"",
"EMPLOYERCOUNTRY":"",
"TITLE":"",
"PLACEOFBIRTH":"",
"WORKTELEPHONE":"",
"HOMETELEPHONE":"",
"SECONDARYADDRESSLINE1":"",
"SECONDARYADDRESSLINE2":"",
"SECONDARYADDRESSCITYLGA":"",
"SECONDARYADDRESSSTATE":"",
"SECONDARYADDRESSCOUNTRY":"",
"SECONDARYADDRESSPOSTCODE":"",
"SPOUSESURNAME":"",
"SPOUSEFIRSTNAME":"",
"SPOUSEMIDDLENAME":"",
"ACCOUNTNUMBER":"212345680",
"ACCOUNTSTATUS":"1",
"ACCOUNTSTATUSDATE":"20210131",
"LOANEFFECTIVEDATE":"19110401",
"DEFEREDPAYMENTDATE":"",
"CREDITLIMIT":"0",
"AVAILEDLIMIT":"0",
"OUTSTANDINGBALANCE":"2578.67",
"CURRENTBALANCEDEBITIND":"",
"INSTALMENTAMOUNT":"0",
"CURRENCY":"NGN",
12
"DAYSINARREARS":"569",
"OVERDUEAMOUNT":"2578.67",
"FACILITYTYPE":"Personal Overdraft",
"FACILITYTENOR":"0",
"FACILITYOWNERSHIPTYPE":"",
"REPAYMENTFREQUENCY":"Monthly",
"LASTPAYMENTDATE":"20210131",
"LASTPAYMENTAMOUNT":"0",
"MATURITYDATE":"20210228",
"INCOME":"",
"INCOMEFREQUENCY":"",
"OWNERTENANT":"",
"NUMBEROFPARTICIPANTSINJOINTLOAN":"",
"DEPENDANTS":"",
"LOANCLASSIFICATION":"Lost",
"LEGALCHALLENGESTATUS":"NO",
"LITIGATIONDATE":"",
"CONSENTSTATUS":"YES",
"LOANSECURITYSTATUS":"NO",
"COLLATERALTYPE":"",
"COLLATERALDETAILS":"",
"PREVIOUSACCOUNTNUMBER":"",
"PREVIOUSNAME":"",
"PREVIOUSCUSTOMERID":"",
"PREVIOUSBRANCHCODE":"",
"CUSTOMERSACCOUNTNUMBER":"",
"GUARANTEESTATUSOFLOAN":"",
"TYPEOFGUARANTEE":"",
"NAMEOFCORPORATEGUARANTOR":"",
"BIZIDNUMBEROFCORPORATEGUARANTOR":"",
"INDIVIDUALGUARANTORSURNAME":"",
13
"INDIVIDUALGUARANTORFIRSTNAME":"",
"INDIVIDUALGUARNTORMIDDLENAME":"",
"GUARANTORDATEOFBIRTHINCORPORATION":"",
"GUARANTORGENDER":"",
"GUARANTORNATIONALIDNUMBER":"",
"GUARNATORINTLPASSPORTNUMBER":"",
"GUARANTORDRIVERSLICENCENUMBER":"",
"GUARANTORBVN":"",
"GUARANTOROTHERID":"",
"GUARANTORPRIMARYADDRESSLINE1":"",
"GUARANTORPRIMARYADDRESSLINE2":"",
"GUARANTORPRIMARYADDRESSCITYLGA":"",
"GUARANTORPRIMARYADDRESSSTATE":"",
"GUARANTORPRIMARYADDRESSCOUNTRY":"",
"GUARANTORPRIMARYPHONENUMBER":"",
"GUARANTOREMAIL":""
}]

JSON Structure for Commercial Dud Cheque Record


[{
"BUSINESSREGISTRATIONNUMBER":"RC12345",
"BUSINESSNAME":"STANDARD ENGINEERING SERVICES",
"BUSINESSTRADINGNAME":"",
"BUSINESSCATEGORY":"",
"BUSINESSSECTOR":"",
"DATEOFINCORPORATION":"19920112",
"CUSTOMERID":"1234567",

14
"CUSTOMERBRANCHCODE":"12",
"BUSINESSOFFICEADDRESSLINE1":"3RD Olukehinde TOTAL FILLING STATION Shomolu",
"BUSINESSOFFICEADDRESSLINE2":"LAGOS",
"BUSINESSOFFICEADDRESSCITYLGA":"LAGOS",
"BUSINESSOFFICEADDRESSSTATE":"",
"BUSINESSOFFICEADDRESSCOUNTRY":"Nigeria",
"BUSINESSOFFICEADDRESSPOSTCODE":"",
"EMAILADDRESS":"",
"SECONDARYADDRESSLINE1":"",
"SECONDARYADDRESSLINE2":"",
"SECONDARYADDRESSCITYLGA":"",
"SECONDARYADDRESSSTATE":"",
"SECONDARYADDRESSCOUNTRY":"",
"SECONDARYADDRESSPOSTCODE":"",
"TAXID":"",
"PRIMARYPHONENUMBER":"",
"SECONDARYPHONENUMBER":"",
"ACCOUNTNUMBER":"2.12308E+11",
"ACCOUNTSTATUS":"Open",
"ACCOUNTSTATUSDATE":"20210131",
"LOANEFFECTIVEDATE":"19140201",
"DEFEREDPAYMENTDATE":"",
"CREDITLIMIT":"0",
"AVAILEDLIMIT":"0",
"OUTSTANDINGBALANCE":"605.99",
"CURRENTBALANCEDEBITIND":"",
"INSTALMENTAMOUNT":"0",
"CURRENCY":"NGN",
"DAYSINARREARS":"343",
"OVERDUEAMOUNT":"605.99",
"FACILITYTYPE":"Commercial Overdraft",
15
"FACILITYTENOR":"0",
"REPAYMENTFREQUENCY":"Monthly",
"LASTPAYMENTDATE":"20190713",
"LASTPAYMENTAMOUNT":"234.28",
"MATURITYDATE":"20210228",
"LOANCLASSIFICATION":"Performing",
"LEGALCHALLENGESTATUS":"NO",
"LITIGATIONDATE":"",
"CONSENTSTATUS":"YES",
"LOANSECURITYSTATUS":"NO",
"COLLATERALTYPE":"",
"COLLATERALDETAILS":"",
"PREVIOUSACCOUNTNUMBER":"",
"PREVIOUSNAME":"",
"PREVIOUSCUSTOMERID":"",
"PREVIOUSBRANCHCODE":"",
"NUMBEROFDIRECTORS":"",
"PRINCIPALOFFICER1SURNAME":"",
"PRINCIPALOFFICER1FIRSTNAME":"",
"PRINCIPALOFFICER1MIDDLENAME":"",
"PRINCIPALOFFICER1DATEOFBIRTH":"",
"PRINCIPALOFFICER1GENDER":"",
"PRINCIPALOFFICER1PRIMARYADDRESSLINE1":"",
"PRINCIPALOFFICER1PRIMARYADDRESSLINE2":"",
"PRINCIPALOFFICER1CITY":"",
"PRINCIPALOFFICER1STATE":"",
"PRINCIPALOFFICER1COUNTRY":"",
"PRINCIPALOFFICER1NATIONALID":"",
"PRINCIPALOFFICER1DRIVERSLICENSENUMBER":"",
"PRINCIPALOFFICER1BVNNUMBER":"",
"PRINCIPALOFFICER1PASSPORTNUMBER":"",
16
"PRINCIPALOFFICER1OTHERIDNUMBER":"",
"PRINCIPALOFFICER1PHONENUMBER":"",
"PRINCIPALOFFICER1EMAILADDRESS":"",
"PRINCIPALOFFICER1POSITIONINBUSINESS":"",
"PRINCIPALOFFICER2SURNAME":"",
"PRINCIPALOFFICER2FIRSTNAME":"",
"PRINCIPALOFFICER2MIDDLENAME":"",
"PRINCIPALOFFICER2DATEOFBIRTH":"",
"PRINCIPALOFFICER2GENDER":"",
"PRINCIPALOFFICER2PRIMARYADDRESSLINE1":"",
"PRINCIPALOFFICER2PRIMARYADDRESSLINE2":"",
"PRINCIPALOFFICER2CITY":"",
"PRINCIPALOFFICER2STATE":"",
"PRINCIPALOFFICER2COUNTRY":"",
"PRINCIPALOFFICER2NATIONALID":"",
"PRINCIPALOFFICER2DRIVERSLISCENCENUMBER":"",
"PRINCIPALOFFICER2BVNNUMBER":"",
"PRINCIPALOFFICER2PASSPORTNUMBER":"",
"PRINCIPALOFFICER2OTHERIDNUMBER":"",
"PRINCIPALOFFICER2PHONENUMBER":"",
"PRINCIPALOFFICER2EMAILADDRESS":"",
"PRINCIPALOFFICER2POSITIONINBUSINESS ":""
}]

17
Record Encryption
AES encryption model is required to pass update record over the API. This method provide us with system enhanced with
end-to-end encryption for data exchange security. Below is a C-Sharp C# code for ASE encryption.

public static string EncryptString(string plainText, byte[] key, byte[] iv)


{
// Instantiate a new Aes object to perform string symmetric encryption
Aes encryptor = Aes.Create();

encryptor.Mode = CipherMode.CBC;

// Set key and IV


byte[] aesKey = new byte[32];
Array.Copy(key, 0, aesKey, 0, 32);
encryptor.Key = aesKey;
encryptor.IV = iv;

// Instantiate a new MemoryStream object to contain the encrypted bytes


MemoryStream memoryStream = new MemoryStream();

// Instantiate a new encryptor from our Aes object


ICryptoTransform aesEncryptor = encryptor.CreateEncryptor();

// Instantiate a new CryptoStream object to process the data and write it to the
// memory stream
CryptoStream cryptoStream = new CryptoStream(memoryStream, aesEncryptor,
CryptoStreamMode.Write);

// Convert the plainText string into a byte array


byte[] plainBytes = Encoding.ASCII.GetBytes(plainText);

// Encrypt the input plaintext string


cryptoStream.Write(plainBytes, 0, plainBytes.Length);

// Complete the encryption process


cryptoStream.FlushFinalBlock();

// Convert the encrypted data from a MemoryStream to a byte array


byte[] cipherBytes = memoryStream.ToArray();

// Close both the MemoryStream and the CryptoStream


memoryStream.Close();
cryptoStream.Close();

// Convert the encrypted byte array to a base64 encoded string


string cipherText = Convert.ToBase64String(cipherBytes, 0, cipherBytes.Length);

// Return the encrypted data as a string


return cipherText;
}

18
Encryption Usage

string DataSubmissionRecord =
"[{'CUSTOMERID':'43231345','BRANCHCODE':'12','SURNAME':'Mayowa','FIRSTNAME':'CHIKAODIRI','MIDDLENAME':
'Husman','DATEOFBIRTH':'19780520','NATIONALIDENTITYNUMBER':'','DRIVERSLICENSENUMBER':'','BVNNUMBER':'1
2345678901','PASSPORTNUMBER':'','PENCOMIDNUMBER':'','OTHERID':'','GENDER':'Female','NATIONALITY':'Nige
ria','MARITALSTATUS':'Married','MOBILENUMBER':'','PRIMARYADDRESSLINE1':'13 AWOLOWO ROAD
IKEJA','PRIMARYADDRESSLINE2':'PO BOX 321
IKEJA','PRIMARYADDRESSCITY':'LAGOS','PRIMARYADDRESSSTATE':'','PRIMARYADDRESSCOUNTRY':'','PRIMARYADDRES
SPOSTCODE':'','EMPLOYMENTSTATUS':'Self
Employed','OCCUPATION':'OTHERS','BUSINESSCATEGORY':'MEDI','BUSINESSSECTOR':'','BORROWERTYPE':'Individu
al','TAXID':'','PICTUREFILEPATH':'','EMAILADDRESS':'','EMPLOYERNAME':'','EMPLOYERADDRESSLINE1':'','EMP
LOYERADDRESSLINE2':'','EMPLOYERCITY':'','EMPLOYERSTATE':'','EMPLOYERCOUNTRY':'','TITLE':'','PLACEOFBIR
TH':'','WORKTELEPHONE':'','HOMETELEPHONE':'','SECONDARYADDRESSLINE1':'','SECONDARYADDRESSLINE2':'','SE
CONDARYADDRESSCITYLGA':'','SECONDARYADDRESSSTATE':'','SECONDARYADDRESSCOUNTRY':'','SECONDARYADDRESSPOS
TCODE':'','SPOUSESURNAME':'','SPOUSEFIRSTNAME':'','SPOUSEMIDDLENAME':'','ACCOUNTNUMBER':'212345680','A
CCOUNTSTATUS':'1','ACCOUNTSTATUSDATE':'20210131','LOANEFFECTIVEDATE':'19110401','DEFEREDPAYMENTDATE':'
','CREDITLIMIT':'0','AVAILEDLIMIT':'0','OUTSTANDINGBALANCE':'2578.67','CURRENTBALANCEDEBITIND':'','INS
TALMENTAMOUNT':'0','CURRENCY':'NGN','DAYSINARREARS':'569','OVERDUEAMOUNT':'2578.67','FACILITYTYPE':'Pe
rsonal
Overdraft','FACILITYTENOR':'0','FACILITYOWNERSHIPTYPE':'','REPAYMENTFREQUENCY':'Monthly','LASTPAYMENTD
ATE':'20210131','LASTPAYMENTAMOUNT':'0','MATURITYDATE':'20210228','INCOME':'','INCOMEFREQUENCY':'','OW
NERTENANT':'','NUMBEROFPARTICIPANTSINJOINTLOAN':'','DEPENDANTS':'','LOANCLASSIFICATION':'Lost','LEGALC
HALLENGESTATUS':'NO','LITIGATIONDATE':'','CONSENTSTATUS':'YES','LOANSECURITYSTATUS':'NO','COLLATERALTY
PE':'','COLLATERALDETAILS':'','PREVIOUSACCOUNTNUMBER':'','PREVIOUSNAME':'','PREVIOUSCUSTOMERID':'','PR
EVIOUSBRANCHCODE':'','CUSTOMERSACCOUNTNUMBER':'','GUARANTEESTATUSOFLOAN':'','TYPEOFGUARANTEE':'','NAME
OFCORPORATEGUARANTOR':'','BIZIDNUMBEROFCORPORATEGUARANTOR':'','INDIVIDUALGUARANTORSURNAME':'','INDIVID
UALGUARANTORFIRSTNAME':'','INDIVIDUALGUARNTORMIDDLENAME':'','GUARANTORDATEOFBIRTHINCORPORATION':'','GU
ARANTORGENDER':'','GUARANTORNATIONALIDNUMBER':'','GUARNATORINTLPASSPORTNUMBER':'','GUARANTORDRIVERSLIC
ENCENUMBER':'','GUARANTORBVN':'','GUARANTOROTHERID':'','GUARANTORPRIMARYADDRESSLINE1':'','GUARANTORPRI
MARYADDRESSLINE2':'','GUARANTORPRIMARYADDRESSCITYLGA':'','GUARANTORPRIMARYADDRESSSTATE':'','GUARANTORP
RIMARYADDRESSCOUNTRY':'','GUARANTORPRIMARYPHONENUMBER':'','GUARANTOREMAIL':''}]";
string secreteKey = "3sc3RLrpd17";
// Create sha256 hash
SHA256 mySHA256 = SHA256Managed.Create();
byte[] key = mySHA256.ComputeHash(Encoding.ASCII.GetBytes(secreteKey));

// Create secret IV
byte[] iv = new byte[16] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0 };

string encrypted = EncryptString(DataSubmissionRecord, key, iv);

The Data submission in JSON is gotten from your data warehouse, this is passed to EncryptString function alongside with
the secret keys.

The method can be translated to your language of choice.

19
Login
The login is required to submit a batch record, the update will produce DataTicket which will be requested for adding
your encrypted record.

Login Request

Header Content
Content-Type: application/json; charset=utf-8
Content-Length: length

Data

{"UserName":"YourUersname","Password":" YourPassword"}

Response
[
{
"DataTicket": "E79878A174FCDC1AD50ACA9E3CDA21876C513107B9A2BE2FC479EFF3B2665E7E3D6AA0FC0AE6
30A154BA9F02C13205BA2B4C2BCD73C1A4FA681B645B4D5D2E443FD1E86B13383D2D857A05DEC7581EEECCE94A521EB4B2C
E8666A66B22B5471A"
}
]

20
Consumer Data

Submission of Data Submission Request

Header Content
Content-Type: application/json; charset=utf-8
Content-Length: length

Data

{"DataTicket": "A96F0FF8F3A138D598624381B6D67F1FA3AE67A365971BC6F1BC388AD1751031FD330EC2D101991DEE6
4D1777A729D0E440452559E1007EA1A10A07BFF047463AC72BDD76F152BBF27157137E36E08707DA95CD69AE66C79D33361
A8D9DB3690","EncryptedUpdateRecord": "string","BatchID":"string"}

21
Application of Encryption on JSON data
JSON Data expected to be submitted

BatchID
BatchID is incremental if the total record is greater than 500. Submit Consumer Monthly Data endpoints will take 500
records at a time. For every 500 Data Submission passed after first 500 Data Submission process, BatchID will be passed
as incremental value.

string DataSubmissionRecord =
"[{'CUSTOMERID':'43231345','BRANCHCODE':'12','SURNAME':'Mayowa','FIRSTNAME':'CHIKAODIRI','MIDDLENAME':
'Husman','DATEOFBIRTH':'19780520','NATIONALIDENTITYNUMBER':'','DRIVERSLICENSENUMBER':'','BVNNUMBER':'1
2345678901','PASSPORTNUMBER':'','PENCOMIDNUMBER':'','OTHERID':'','GENDER':'Female','NATIONALITY':'Nige
ria','MARITALSTATUS':'Married','MOBILENUMBER':'','PRIMARYADDRESSLINE1':'13 AWOLOWO ROAD
IKEJA','PRIMARYADDRESSLINE2':'PO BOX 321
IKEJA','PRIMARYADDRESSCITY':'LAGOS','PRIMARYADDRESSSTATE':'','PRIMARYADDRESSCOUNTRY':'','PRIMARYADDRES
SPOSTCODE':'','EMPLOYMENTSTATUS':'Self
Employed','OCCUPATION':'OTHERS','BUSINESSCATEGORY':'MEDI','BUSINESSSECTOR':'','BORROWERTYPE':'Individu
al','TAXID':'','PICTUREFILEPATH':'','EMAILADDRESS':'','EMPLOYERNAME':'','EMPLOYERADDRESSLINE1':'','EMP
LOYERADDRESSLINE2':'','EMPLOYERCITY':'','EMPLOYERSTATE':'','EMPLOYERCOUNTRY':'','TITLE':'','PLACEOFBIR
TH':'','WORKTELEPHONE':'','HOMETELEPHONE':'','SECONDARYADDRESSLINE1':'','SECONDARYADDRESSLINE2':'','SE
CONDARYADDRESSCITYLGA':'','SECONDARYADDRESSSTATE':'','SECONDARYADDRESSCOUNTRY':'','SECONDARYADDRESSPOS
TCODE':'','SPOUSESURNAME':'','SPOUSEFIRSTNAME':'','SPOUSEMIDDLENAME':'','ACCOUNTNUMBER':'212345680','A
CCOUNTSTATUS':'1','ACCOUNTSTATUSDATE':'20210131','LOANEFFECTIVEDATE':'19110401','DEFEREDPAYMENTDATE':'
','CREDITLIMIT':'0','AVAILEDLIMIT':'0','OUTSTANDINGBALANCE':'2578.67','CURRENTBALANCEDEBITIND':'','INS
TALMENTAMOUNT':'0','CURRENCY':'NGN','DAYSINARREARS':'569','OVERDUEAMOUNT':'2578.67','FACILITYTYPE':'Pe
rsonal
Overdraft','FACILITYTENOR':'0','FACILITYOWNERSHIPTYPE':'','REPAYMENTFREQUENCY':'Monthly','LASTPAYMENTD
ATE':'20210131','LASTPAYMENTAMOUNT':'0','MATURITYDATE':'20210228','INCOME':'','INCOMEFREQUENCY':'','OW
NERTENANT':'','NUMBEROFPARTICIPANTSINJOINTLOAN':'','DEPENDANTS':'','LOANCLASSIFICATION':'Lost','LEGALC
HALLENGESTATUS':'NO','LITIGATIONDATE':'','CONSENTSTATUS':'YES','LOANSECURITYSTATUS':'NO','COLLATERALTY
PE':'','COLLATERALDETAILS':'','PREVIOUSACCOUNTNUMBER':'','PREVIOUSNAME':'','PREVIOUSCUSTOMERID':'','PR
EVIOUSBRANCHCODE':'','CUSTOMERSACCOUNTNUMBER':'','GUARANTEESTATUSOFLOAN':'','TYPEOFGUARANTEE':'','NAME
OFCORPORATEGUARANTOR':'','BIZIDNUMBEROFCORPORATEGUARANTOR':'','INDIVIDUALGUARANTORSURNAME':'','INDIVID
UALGUARANTORFIRSTNAME':'','INDIVIDUALGUARNTORMIDDLENAME':'','GUARANTORDATEOFBIRTHINCORPORATION':'','GU
ARANTORGENDER':'','GUARANTORNATIONALIDNUMBER':'','GUARNATORINTLPASSPORTNUMBER':'','GUARANTORDRIVERSLIC
ENCENUMBER':'','GUARANTORBVN':'','GUARANTOROTHERID':'','GUARANTORPRIMARYADDRESSLINE1':'','GUARANTORPRI
MARYADDRESSLINE2':'','GUARANTORPRIMARYADDRESSCITYLGA':'','GUARANTORPRIMARYADDRESSSTATE':'','GUARANTORP
RIMARYADDRESSCOUNTRY':'','GUARANTORPRIMARYPHONENUMBER':'','GUARANTOREMAIL':''}]";string secreteKey =
"3sc3RLrpd17";
// Create sha256 hash
SHA256 mySHA256 = SHA256Managed.Create();
byte[] key = mySHA256.ComputeHash(Encoding.ASCII.GetBytes(secreteKey));

// Create secret IV
byte[] iv = new byte[16] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0 };

string encrypted = EncryptString(DataSubmissionRecord, key, iv);

22
Output of the encrypted JSON Data
qSgpcalAi7csWfwmVdgfPcmaV+3hC+vsb2I86fESKu6xP4bcAxrdjJxsHJdKoXW5bLTvI2jpC4IdvIHjapN4XlhVpsZp4RUyYR1xPn
2UNNYAXes1pnzZEOaQ8kbKY+3nsrwYd1zlGDL/PsHwbhAX+1/WmVLTXGXJgHIS9CJ0eUOVSE/hBkqs2KEK4cixKP7EFy039yF
7zAZfsOSxKDrj9qUQ7QaaM406be0inFojFILhH7nfx4b8l2PcrkyxIaWvWNqj4khXVdJXOqeEiPIZQ8FTI1IZZAEE9OqwCRFl6u1Z
jB8rePZT3WrF2wTx6fqjnM3KU2sMuCClORSb+UbVKs3jfdm4OhaJDGzOcJEgR6rQPUSEfYO/YTvPlLltgPozIqrftIEREoB3gK0K
RDWRL9gzsVNiJKnnBWQJ0/snDxB5H0jRLYCE1EZQkelo/SQAglM1BPuCwTQwIVTpR2eKBA==

Header Content
Content-Type: application/json; charset=utf-8
Content-Length: length

Data

[{"DataTicket":"451E879844A5EE1715B30E5227F7C42A885B35D513D6F19835FAED4F9D5340864B5B50395
6FEF8E9AE4510E40AE29E9B4718DF683EE46C928GB65D36011C4C354BACB9EE885DA7D5C9BD2C8B647311433B
28DC88F1B4E8751783AA28278AD4AEF9C926EACDFFC676CA7681E68B50E92C52D997F87FD7EFA10FDC2A49C77
2791968EA05BB8278D654D45E06D5852884C7",
"EncryptedUpdateRecord":
"qSgpcalAi7csWfwmVdgfPcmaV+3hC+vsb2I86fESKu6xP4bcAxrdjJxsHJdKoXW5bLTvI2jpC4IdvIHjapN4XlhVpsZp4RUyYR1x
Pn2UNNYAXes1pnzZEOaQ8kbKY+3nsrwYd1zlGDL/PsHwbhAX+1/WmVLTXGXJgHIS9CJ0eUOVSE/hBkqs2KEK4cixKP7EFy0
39yF7zAZfsOSxKDrj9qUQ7QaaM406be0inFojFILhH7nfx4b8l2PcrkyxIaWvWNqj4khXVdJXOqeEiPIZQ8FTI1IZZAEE9OqwCR
Fl6u1ZjB8rePZT3WrF2wTx6fqjnM3KU2sMuCClORSb+UbVKs3jfdm4OhaJDGzOcJEgR6rQPUSEfYO/YTvPlLltgPozIqrftIEREo
B3gK0KRDWRL9gzsVNiJKnnBWQJ0/snDxB5H0jRLYCE1EZQkelo/SQAglM1BPuCwTQwIVTpR2eKBA==",

"BatchID":"1"}]

23
PHP Record Encryption
<?php

// How to encrypt and decrypt byte array using PHP As show on in C# encrypted code above

$plaintext =
"[{'CUSTOMERID':'43231345','BRANCHCODE':'12','SURNAME':'Mayowa','FIRSTNAME':'CHIKAODIRI','MIDDLENA
ME':'Husman','DATEOFBIRTH':'19780520','NATIONALIDENTITYNUMBER':'','DRIVERSLICENSENUMBER':'','BVNNU
MBER':'12345678901','PASSPORTNUMBER':'','PENCOMIDNUMBER':'','OTHERID':'','GENDER':'Female','NATION
ALITY':'Nigeria','MARITALSTATUS':'Married','MOBILENUMBER':'','PRIMARYADDRESSLINE1':'13 AWOLOWO
ROAD IKEJA','PRIMARYADDRESSLINE2':'PO BOX 321
IKEJA','PRIMARYADDRESSCITY':'LAGOS','PRIMARYADDRESSSTATE':'','PRIMARYADDRESSCOUNTRY':'','PRIMARYAD
DRESSPOSTCODE':'','EMPLOYMENTSTATUS':'Self
Employed','OCCUPATION':'OTHERS','BUSINESSCATEGORY':'MEDI','BUSINESSSECTOR':'','BORROWERTYPE':'Indi
vidual','TAXID':'','PICTUREFILEPATH':'','EMAILADDRESS':'','EMPLOYERNAME':'','EMPLOYERADDRESSLINE1'
:'','EMPLOYERADDRESSLINE2':'','EMPLOYERCITY':'','EMPLOYERSTATE':'','EMPLOYERCOUNTRY':'','TITLE':''
,'PLACEOFBIRTH':'','WORKTELEPHONE':'','HOMETELEPHONE':'','SECONDARYADDRESSLINE1':'','SECONDARYADDR
ESSLINE2':'','SECONDARYADDRESSCITYLGA':'','SECONDARYADDRESSSTATE':'','SECONDARYADDRESSCOUNTRY':'',
'SECONDARYADDRESSPOSTCODE':'','SPOUSESURNAME':'','SPOUSEFIRSTNAME':'','SPOUSEMIDDLENAME':'','ACCOU
NTNUMBER':'212345680','ACCOUNTSTATUS':'1','ACCOUNTSTATUSDATE':'20210131','LOANEFFECTIVEDATE':'1911
0401','DEFEREDPAYMENTDATE':'','CREDITLIMIT':'0','AVAILEDLIMIT':'0','OUTSTANDINGBALANCE':'2578.67',
'CURRENTBALANCEDEBITIND':'','INSTALMENTAMOUNT':'0','CURRENCY':'NGN','DAYSINARREARS':'569','OVERDUE
AMOUNT':'2578.67','FACILITYTYPE':'Personal
Overdraft','FACILITYTENOR':'0','FACILITYOWNERSHIPTYPE':'','REPAYMENTFREQUENCY':'Monthly','LASTPAYM
ENTDATE':'20210131','LASTPAYMENTAMOUNT':'0','MATURITYDATE':'20210228','INCOME':'','INCOMEFREQUENCY
':'','OWNERTENANT':'','NUMBEROFPARTICIPANTSINJOINTLOAN':'','DEPENDANTS':'','LOANCLASSIFICATION':'L
ost','LEGALCHALLENGESTATUS':'NO','LITIGATIONDATE':'','CONSENTSTATUS':'YES','LOANSECURITYSTATUS':'N
O','COLLATERALTYPE':'','COLLATERALDETAILS':'','PREVIOUSACCOUNTNUMBER':'','PREVIOUSNAME':'','PREVIO
USCUSTOMERID':'','PREVIOUSBRANCHCODE':'','CUSTOMERSACCOUNTNUMBER':'','GUARANTEESTATUSOFLOAN':'','T
YPEOFGUARANTEE':'','NAMEOFCORPORATEGUARANTOR':'','BIZIDNUMBEROFCORPORATEGUARANTOR':'','INDIVIDUALG
UARANTORSURNAME':'','INDIVIDUALGUARANTORFIRSTNAME':'','INDIVIDUALGUARNTORMIDDLENAME':'','GUARANTOR
DATEOFBIRTHINCORPORATION':'','GUARANTORGENDER':'','GUARANTORNATIONALIDNUMBER':'','GUARNATORINTLPAS
SPORTNUMBER':'','GUARANTORDRIVERSLICENCENUMBER':'','GUARANTORBVN':'','GUARANTOROTHERID':'','GUARAN
TORPRIMARYADDRESSLINE1':'','GUARANTORPRIMARYADDRESSLINE2':'','GUARANTORPRIMARYADDRESSCITYLGA':'','
GUARANTORPRIMARYADDRESSSTATE':'','GUARANTORPRIMARYADDRESSCOUNTRY':'','GUARANTORPRIMARYPHONENUMBER'
:'','GUARANTOREMAIL':''}]";

$password = '3sc3RLrpd17';

$method = 'aes-256-cbc';

// Must be exact 32 chars (256 bit)

$password = substr(hash('sha256', $password, true), 0, 32);

// IV must be exact 16 chars (128 bit)

$iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) .
chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);

// av3DYGLkwBsErphcyYp+imUW4QKs19hUnFyyYcXwURU=

$encrypted = base64_encode(openssl_encrypt($plaintext, $method, $password, OPENSSL_RAW_DATA, $iv));

echo $encrypted;
24
?>
PHP Record Decryption

<?php

$password = '3sc3RLrpd17';

$method = 'aes-256-cbc';

// Must be exact 32 chars (256 bit)

$password = substr(hash('sha256', $password, true), 0, 32);

// IV must be exact 16 chars (128 bit)

$iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) .
chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);

$encrypted
=”qSgpcalAi7csWfwmVdgfPcmaV+3hC+vsb2I86fESKu6xP4bcAxrdjJxsHJdKoXW5bLTvI2jpC4IdvIHjapN4XlhVpsZp4RU
yYR1xPn2UNNYAXes1pnzZEOaQ8kbKY+3nsrwYd1zlGDL/PsHwbhAX+1/WmVLTXGXJgHIS9CJ0eUOVSE/hBkqs2KEK4ci
xKP7EFy039yF7zAZfsOSxKDrj9qUQ7QaaM406be0inFojFILhH7nfx4b8l2PcrkyxIaWvWNqj4khXVdJXOqeEiPIZQ8FTI1IZ
ZAEE9OqwCRFl6u1ZjB8rePZT3WrF2wTx6fqjnM3KU2sMuCClORSb+UbVKs3jfdm4OhaJDGzOcJEgR6rQPUSEfYO/YTvPl
LltgPozIqrftIEREoB3gK0KRDWRL9gzsVNiJKnnBWQJ0/snDxB5H0jRLYCE1EZQkelo/SQAglM1BPuCwTQwIVTpR2eKBA=
=”;

$decrypted = openssl_decrypt(base64_decode($encryptedd), $method, $password, OPENSSL_RAW_DATA, $iv);

echo 'decrypted to: ' . $decrypted . "\n\n";

?>

25
JAVA Record Encryption

public static String encrypt(String value, String SECRET_KEY) {

try {
SecureRandom random = new SecureRandom();
byte[] salt = new byte[32];
random.nextBytes(salt);
//Define Initialization Vector
byte[] ivBytes ={ (byte)0x0, (byte)0x0,(byte) 0x0, (byte)0x0,(byte) 0x0,(byte)
0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0, (byte) 0x0,(byte)
0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0 };

//random.nextBytes(ivBytes);
IvParameterSpec iv = new IvParameterSpec(ivBytes);

//Encode Secret key with ASCII and SHA-256


byte[] password = SECRET_KEY.getBytes("ASCII");

MessageDigest digest = MessageDigest.getInstance("SHA-256");


byte[] hashPassword = digest.digest(password);

byte[] aesKey = new byte[32];


aesKey = Arrays.copyOf(hashPassword, 32);

//Prepare Secret key


SecretKeySpec skeySpec = new SecretKeySpec(aesKey, "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");


cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

byte[] encrypted = cipher.doFinal(value.getBytes());


return Base64.encodeToString(encrypted, Base64.DEFAULT);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

USAGE
String SECRET_KEY = "3sc3RLrpd17";
String enval= "[{""Username"": ""1234""}]";
String EncryptedRecord = encrypt(enval); //dyUW7VzcQtKRYORpTJAf2VUi5UvgPhdU3hTo/jVoSiM=

[{ "DataTicket":
"D184DB5B06F9CA39F750271C2E459FE21F7E11EB2BCC10AA56AA2FFA66597E405B9D5F191F020C91F4A107993CE
2CBA649FC280643F80C19863328B50E2D0F5C98A6E8E742D486B8F408EF46068202B8CCF92AC1692E0440257096D
2058EC060",

"EncryptedUpdateRecord": EncryptedRecord,

"BatchID": "1" }]

26
File Upload API
Daily file submission, Weekly file submission and Monthly file submission.

This Application Programming Interface allows you to send your request in JSON Object and Returns JSON
Array to you View API URL.

FirstCentral File Upload API End Points:

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/Login

1. Login

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/Login

Request: {"UserName":"YourUsername","Password":"YourPassword"}
Response: [ { "DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CA xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 618
7E92A8B0BF8924B1D8E333E9097" } ]

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/IsValidTicket

2. IsTicketValid

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/IsValidTicket

Request:
{
"DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 6187E9
2A8B0BF8924B1D8E333E9097"
}
Response: true/false

27
https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/Consumer

3. Consumer

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/Consumer
Request:
{
"DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 6187E
92A8B0BF8924B1D8E333E9097",
"EncryptedUpdateRecord":"B3WuNHlwsHF6xGUdVCyv7k6P ezTH8ciarKXOEcdllRMdtrzRKzBYLBsqmspZhpg7K
V9 kiqx4hRWL5H3BR2XHQWvfkdEGDmd9SGe7/dRx55Ow+iQVXPlj/BoQcQBulplkXk+/J2xCUDgNSgNhZ1Jv/Ec
H1oBbE6FSsRkKd1lbSSSDhKv5Nl7h gkaVT+u8CNstD1W9Q4cDpjaEbwtv22kTGoIphM0JqFAAKtJ7mTLdJH6QH
gXWDSFY9ubcZO46ZieJ1rJGI49uCViGWOMOuTnzmLwkYHrwJ7XpwxYNd64Ao0oKlATcZ9/W5xdw65I4VKoIT
jrge0rB/KSpm58BaYv35892qhcZzLBHo7UV/Cc0SWfm0o4+hTIMVam",
"BatchID": "1"
}
Response:
[{
"TotalRecordSubmitted": "94",
"TotalMatch": "54",
"NotMatched": "40",
"MatchRate": "57%",
"Message": "Successful",
"UpdateID": "B-U202302182247112345"
}]

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/ConsumerDudCheque

4. Consumer DudCheque

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/ConsumerDudCheque
Request:
{
"DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CA xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 61
87E92A8B0BF8924B1D8E333E9097",
"EncryptedUpdateRecord":"B3WuNHlwsHF6xGUdVCyv7k6PezTH8ciarKXOEcdllRMdtrzRKzBYLBsqmspZhpg7K
V9kiqx4hRWL5H3BR2XHQWvfkdEGDmd9SGe7/dRx55Ow+iQVXPlj/BoQcQBulplkXk+/J2xCUDgNSgNhZ1Jv/Ec
H1oBbE6FSsRkKd1lbSSSDhKv5Nl7hgkaVT+u8CNstD1W9Q4cDpjaEbwtv22kTGoIphM0JqFAAKtJ7mTLdJH6QHg
XWDSFY9ubcZO46ZieJ1rJGI49uCViGWOMOuTnzmLwkYHrwJ7XpwxYNd64Ao0oKlATcZ9/W5xdw65I4VKoITjr
ge0rB/KSpm58BaYv35892qhcZzLBHo7UV/Cc0SWfm0o4+hTIMVam",
"BatchID": "1"
}
Response:
[{
"TotalRecordSubmitted": "94",
"TotalMatch": "54",
"NotMatched": "40",
"MatchRate": "57%",
"Message": "Successful",
"UpdateID": "B-U202302182247112345"
}]
28
https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/Commercial

5. Commercial

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/Commercial

Request:
{
"DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx6187E92A8B0BF8924B1D8E333E9097",
"EncryptedUpdateRecord":"B3WuNHlwsHF6xGUdVCyv7k6PezTH8ciarKXOEcdllRMdtrzRKzBYLBsqmspZhpg7K
V9kiqx4hRWL5H3BR2XHQWvfkdEGDmd9SGe7/dRx55Ow+iQVXPlj/BoQcQBulplkXk+/J2xCUDgNSgNhZ1Jv/Ec
H1oBbE6FSsRkKd1lbSSSDhKv5Nl7hgkaVT+u8CNstD1W9Q4cDpjaEbwtv22kTGoIphM0JqFAAKtJ7mTLdJH6QHg
XWDSFY9ubcZO46ZieJ1rJGI49uCViGWOMOuTnzmLwkYHrwJ7XpwxYNd64Ao0oKlATcZ9/W5xdw65I4VKoITjr
ge0rB/KSpm58BaYv35892qhcZzLBHo7UV/Cc0SWfm0o4+hTIMVam",
"BatchID": "1"
}
Response:
[{
"TotalRecordSubmitted": "94",
"TotalMatch": "54",
"NotMatched": "40",
"MatchRate": "57%",
"Message": "Successful",
"UpdateID": "B-U202302182247112345"
}]

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/CommercialDudCheque

6. Commercial DudCheque

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/CommercialDudCheque

Request:
{
"DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxx6187E92A8B0BF8924B1D8E333E9097",
"EncryptedUpdateRecord":"B3WuNHlwsHF6xGUdVCyv7k6PezTH8ciarKXOEcdllRMdtrzRKzBYLBsqmspZhpg7KV9kiqx4
hRWL5H3BR2XHQWvfkdEGDmd9SGe7/dRx55Ow+iQVXPlj/BoQcQBulplkXk+/J2xCUDgNSgNhZ1Jv/EcH1oBbE6FSsRk
Kd1lbSSSDhKv5Nl7hgkaVT+u8CNstD1W9Q4cDpjaEbwtv22kTGoIphM0JqFAAKtJ7mTLdJH6QHgXWDSFY9ubcZO46Zie
J1rJGI49uCViGWOMOuTnzmLwkYHrwJ7XpwxYNd64Ao0oKlATcZ9/W5xdw65I4VKoITjrge0rB/KSpm58BaYv35892qhcZ
zLBHo7UV/Cc0SWfm0o4+hTIMVam",
"BatchID": "1"
}
Response:
[{
"TotalRecordSubmitted": "94", "TotalMatch": "54",
"NotMatched": "40", "MatchRate": "57%",
"Message": "Successful", "UpdateID": "B-U202302182247112345" }]

29
https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/SubmitBatchUpdate

7. Submit Batch Update

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/SubmitBatchUpdate

Request:
{
"DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CA xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxx 6187E92A8B0BF8924B1D8E333E9097",
"EncryptedUpdateRecord":"B3WuNHlwsHF6xGUdVCyv7k6PezTH8ciarKXOEcd llRMdtrzRKzBYLBsqmspZhpg7K
V9kiqx4hRWL5H3BR2XHQWvfkdEGDmd 9SGe7/dRx55Ow+iQVXPlj/BoQcQBulplkXk+/J2xCUDgNSgNhZ1Jv/Ec
H1oBbE6FSsRkKd1lbSSSDhKv5Nl7hgkaVT+u8CNstD1W9Q4cDpjaEbwtv2 2kTGoIphM0JqFAAKtJ7mTLdJH6QH
gXWDSFY9ubcZO46ZieJ1rJGI49uCViGWOMOuTnzmLwkYHrwJ7XpwxYNd64Ao0oKlATcZ9/W5xdw65I4VKoIT
jrge0rB/KSpm58BaYv35892qhcZzLBHo7UV/Cc0SWfm0o4+hTIMVam",
"BatchID": "1"
}
Response:
[{
"TotalRecordSubmitted": "94",
"TotalMatch": "54",
"NotMatched": "40",
"MatchRate": "57%",
"Message": "Successful",
"UpdateID": "B-U202302182247112345"
}]

30
Reconciliation
Data Reconciliation

Data Reconciliation

The Reconciliation API end point is used when a certain month record is skiped or missing. The API endpoint is called
with specific Reconcile Date to insert the record for the month loan was taken or when repayment was made

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/ConsumerReconcile

1. Consumer Reconciliation

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/ConsumerReconcile

Request:
{
"DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 6187E
92A8B0BF8924B1D8E333E9097",
"EncryptedUpdateRecord":"B3WuNHlwsHF6xGUdVCyv7k6P ezTH8ciarKXOEcdllRMdtrzRKzBYLBsqmspZhpg7K
V9 kiqx4hRWL5H3BR2XHQWvfkdEGDmd9SGe7/dRx55Ow+iQVXPlj/BoQcQBulplkXk+/J2xCUDgNSgNhZ1Jv/Ec
H1oBbE6FSsRkKd1lbSSSDhKv5Nl7h gkaVT+u8CNstD1W9Q4cDpjaEbwtv22kTGoIphM0JqFAAKtJ7mTLdJH6QH
gXWDSFY9ubcZO46ZieJ1rJGI49uCViGWOMOuTnzmLwkYHrwJ7XpwxYNd64Ao0oKlATcZ9/W5xdw65I4VKoIT
jrge0rB/KSpm58BaYv35892qhcZzLBHo7UV/Cc0SWfm0o4+hTIMVam",
"ReconcileDate": "YYYY/MM/DD" ,

"BatchID": "1"
}
Response:
[{
"TotalRecordSubmitted": "94",
"TotalMatch": "54",
"NotMatched": "40",
"MatchRate": "57%",
"Message": "Successful",
"UpdateID": "B-U202302182247112345"
}]

31
https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/ConsumerDudChequeR
econcile

2. Consumer DudCheque Reconciliation

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/ConsumerDudChequeReconcile

Request:
{
"DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CA xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 61
87E92A8B0BF8924B1D8E333E9097",
"EncryptedUpdateRecord":"B3WuNHlwsHF6xGUdVCyv7k6PezTH8ciarKXOEcdllRMdtrzRKzBYLBsqmspZhpg7K
V9kiqx4hRWL5H3BR2XHQWvfkdEGDmd9SGe7/dRx55Ow+iQVXPlj/BoQcQBulplkXk+/J2xCUDgNSgNhZ1Jv/Ec
H1oBbE6FSsRkKd1lbSSSDhKv5Nl7hgkaVT+u8CNstD1W9Q4cDpjaEbwtv22kTGoIphM0JqFAAKtJ7mTLdJH6QHg
XWDSFY9ubcZO46ZieJ1rJGI49uCViGWOMOuTnzmLwkYHrwJ7XpwxYNd64Ao0oKlATcZ9/W5xdw65I4VKoITjr
ge0rB/KSpm58BaYv35892qhcZzLBHo7UV/Cc0SWfm0o4+hTIMVam",
"ReconcileDate": "YYYY/MM/DD" ,

"BatchID": "1"
}
Response:
[{
"TotalRecordSubmitted": "94",
"TotalMatch": "54",
"NotMatched": "40", "MatchRate": "57%", "Message": "Successful", "UpdateID": "B-U202302182247112345"
}]

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/ConsumerDudChequeR
econcile

3. Commercial Reconciliation

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/CommercialReconcile
Request:
{
"DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx6187E92A8B0BF8924B1D8E333E9097",
"EncryptedUpdateRecord":"B3WuNHlwsHF6xGUdVCyv7k6PezTH8ciarKXOEcdllRMdtrzRKzBYLBsqmspZhpg7K
V9kiqx4hRWL5H3BR2XHQWvfkdEGDmd9SGe7/dRx55Ow+iQVXPlj/BoQcQBulplkXk+/J2xCUDgNSgNhZ1Jv/Ec
H1oBbE6FSsRkKd1lbSSSDhKv5Nl7hgkaVT+u8CNstD1W9Q4cDpjaEbwtv22kTGoIphM0JqFAAKtJ7mTLdJH6QHg
XWDSFY9ubcZO46ZieJ1rJGI49uCViGWOMOuTnzmLwkYHrwJ7XpwxYNd64Ao0oKlATcZ9/W5xdw65I4VKoITjr
ge0rB/KSpm58BaYv35892qhcZzLBHo7UV/Cc0SWfm0o4+hTIMVam",
"ReconcileDate": "YYYY/MM/DD" ,

"BatchID": "1"
}
Response:
[{ "TotalRecordSubmitted": "94", "TotalMatch": "54", "NotMatched": "40", "MatchRate": "57%",

"Message": "Successful","UpdateID": "B-U202302182247112345" }]

32
https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/CommercialDudCheque
Reconcile

4. Commercial DudCheque Reconciliation

https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/CommercialDudChequeReconcile

Request:
{
"DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxx6187E92A8B0BF8924B1D8E333E9097",
"EncryptedUpdateRecord":"B3WuNHlwsHF6xGUdVCyv7k6PezTH8ciarKXOEcdllRMdtrzRKzBYLBsqmspZhpg7K
V9kiqx4hRWL5H3BR2XHQWvfkdEGDmd9SGe7/dRx55Ow+iQVXPlj/BoQcQBulplkXk+/J2xCUDgNSgNhZ1Jv/Ec
H1oBbE6FSsRkKd1lbSSSDhKv5Nl7hgkaVT+u8CNstD1W9Q4cDpjaEbwtv22kTGoIphM0JqFAAKtJ7mTLdJH6QHg
XWDSFY9ubcZO46ZieJ1rJGI49uCViGWOMOuTnzmLwkYHrwJ7XpwxYNd64Ao0oKlATcZ9/W5xdw65I4VKoITjr
ge0rB/KSpm58BaYv35892qhcZzLBHo7UV/Cc0SWfm0o4+hTIMVam",
"ReconcileDate": "YYYY/MM/DD" ,

"BatchID": "1"
}
Response:
[{
"TotalRecordSubmitted": "94",
"TotalMatch": "54",
"NotMatched": "40",
"MatchRate": "57%",
"Message": "Successful",
"UpdateID": "WL-202302182247112345"
}]

Update Output
Complete Update

{ TotalRecordSubmitted = 156, TotalMatch = 120, NotMatched = 36, MatchRate = 76%, Message = Successful, UpdateID
= WL-2021052422111169397, MissingMandatory=20, Warning=5, DataFormatFailed=4 }

33
Batch Update
Introduction
Batch update is voluminous credit record required for update periodically within a month before or after a
monthly update has been submitted. The purpose of batch update is to meet real-time credit record update
before the monthly data is submitted.
https://iremedy.firstcentralcreditbureau.com/AutoUploaderRest/restapi/SubmitBatchUpdate

Batch Update Header


Table Header Data type

ACCOUNTNO Varchar(20)/String
MONTHSINARREARS Integer
CURRENTBALANCEAMT Float
ACCOUNTSTATUSCODE Varchar(25)/String
LOANCLASSIFICATION Varchar(25)/String
AMOUNTOVERDUE float

JSON Structure Template


[{

"AccountNo":"3257634055",

"CurrentBalanceAmt":"2000",

"AmountOverdue":"0",

"Monthsinarrears":"0",

"LoanClassification":"performing",

"AccountStatusCode":"Open"

},

"AccountNo":"3257634056",

"CurrentBalanceAmt":"0",

"AmountOverdue":"0",

"Monthsinarrears":"0",

"LoanClassification":"performing",

"AccountStatusCode":"Closed"

}]

34
Record Encryption
AES encryption model is required to pass update record over the API. This method provide us with system enhanced with
end-to-end encryption for data exchange security. Below is a C-Sharp C# code for ASE encryption.

public static string EncryptString(string plainText, byte[] key, byte[] iv)


{
// Instantiate a new Aes object to perform string symmetric encryption
Aes encryptor = Aes.Create();

encryptor.Mode = CipherMode.CBC;

// Set key and IV


byte[] aesKey = new byte[32];
Array.Copy(key, 0, aesKey, 0, 32);
encryptor.Key = aesKey;
encryptor.IV = iv;

// Instantiate a new MemoryStream object to contain the encrypted bytes


MemoryStream memoryStream = new MemoryStream();

// Instantiate a new encryptor from our Aes object


ICryptoTransform aesEncryptor = encryptor.CreateEncryptor();

// Instantiate a new CryptoStream object to process the data and write it to the
// memory stream
CryptoStream cryptoStream = new CryptoStream(memoryStream, aesEncryptor,
CryptoStreamMode.Write);

// Convert the plainText string into a byte array


byte[] plainBytes = Encoding.ASCII.GetBytes(plainText);

// Encrypt the input plaintext string


cryptoStream.Write(plainBytes, 0, plainBytes.Length);

// Complete the encryption process


cryptoStream.FlushFinalBlock();

// Convert the encrypted data from a MemoryStream to a byte array


byte[] cipherBytes = memoryStream.ToArray();

// Close both the MemoryStream and the CryptoStream


memoryStream.Close();
cryptoStream.Close();

// Convert the encrypted byte array to a base64 encoded string


string cipherText = Convert.ToBase64String(cipherBytes, 0, cipherBytes.Length);

// Return the encrypted data as a string


return cipherText;
}

35
Encryption Usage

string BatchUpdateRecord =
"[{'AccountNo':'3257634055','CurrentBalanceAmt':'2000','AmountOverdue':'0','Monthsinarrears':'0','Loan
Classification':'performing','AccountStatusCode':'Open'},{'AccountNo':'3257634056','CurrentBalanceAmt'
:'0','AmountOverdue':'0','Monthsinarrears':'0','LoanClassification':'performing','AccountStatusCode':'
Closed'}]";
string secreteKey = "3sc3RLrpd17";
// Create sha256 hash
SHA256 mySHA256 = SHA256Managed.Create();
byte[] key = mySHA256.ComputeHash(Encoding.ASCII.GetBytes(secreteKey));

// Create secret IV
byte[] iv = new byte[16] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0 };

string encrypted = EncryptString(BatchUpdateRecord, key, iv);

The BatchUpdateRecord in JSON is gotten from your data warehouse, this is passed to EncryptString function alongside
with the secret keys.

The method can be translated to your language of choice.

LoginJSON
The login is required to update a batch record, the update will produce DataTicket which will be requested for adding
your encrypted record.

36
Login Request

POST /FirstCentralNigeriaWebService.asmx HTTP/1.1


Host: localhost
Content-Type: application/json; charset=utf-8
Content-Length: length

{"UserName":"YourUersname","Password":" YourPassword"}

Response
[
{
"DataTicket": "E79878A174FCDC1AD50ACA9E3CDA21876C513107B9A2BE2FC479EFF3B2665E7E3D6AA0FC0AE6
30A154BA9F02C13205BA2B4C2BCD73C1A4FA681B645B4D5D2E443FD1E86B13383D2D857A05DEC7581EEECCE94A521EB4B2C
E8666A66B22B5471A"
}
]

SubmitBatchUpdate

37
Submission of Batch Update Request with increment in BatchID

Request:
[{
"DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CA xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
6187E92A8B0BF8924B1D8E333E9097",
"EncryptedUpdateRecord":"B3WuNHlwsHF6xGUdVCyv7k6PezTH8ciarKXOEcd
llRMdtrzRKzBYLBsqmspZhpg7KV9kiqx4hRWL5H3BR2XHQWvfkdEGDmd
9SGe7/dRx55Ow+iQVXPlj/BoQcQBulplkXk+/J2xCUDgNSgNhZ1Jv/EcH1oBbE6FSsRkKd1lbSSSDhKv5Nl7hgkaVT+u8CNstD1
W9Q4cDpjaEbwtv2
2kTGoIphM0JqFAAKtJ7mTLdJH6QHgXWDSFY9ubcZO46ZieJ1rJGI49uCViGWOMOuTnzmLwkYHrwJ7XpwxYNd64Ao0oKlA
TcZ9/W5xdw65I4VKoITjrge0rB/KSpm58BaYv35892qhcZzLBHo7UV/Cc0SWfm0o4+hTIMVam",
"BatchID": "1"
},

{
"DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CA xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
6187E92A8B0BF8924B1D8E333E9097",
"EncryptedUpdateRecord":"B3WuNHlwsHF6xGUdVCyv7k6PezTH8ciarKXOEcd
llRMdtrzRKzBYLBsqmspZhpg7KV9kiqx4hRWL5H3BR2XHQWvfkdEGDmd
9SGe7/dRx55Ow+iQVXPlj/BoQcQBulplkXk+/J2xCUDgNSgNhZ1Jv/EcH1oBbE6FSsRkKd1lbSSSDhKv5Nl7hgkaVT+u8CNstD1
W9Q4cDpjaEbwtv2
2kTGoIphM0JqFAAKtJ7mTLdJH6QHgXWDSFY9ubcZO46ZieJ1rJGI49uCViGWOMOuTnzmLwkYHrwJ7XpwxYNd64Ao0oKlA
TcZ9/W5xdw65I4VKoITjrge0rB/KSpm58BaYv35892qhcZzLBHo7UV/Cc0SWfm0o4+hTIMVam",
"BatchID": "2"
},

{
"DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CA xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
6187E92A8B0BF8924B1D8E333E9097",
"EncryptedUpdateRecord":"B3WuNHlwsHF6xGUdVCyv7k6PezTH8ciarKXOEcd
llRMdtrzRKzBYLBsqmspZhpg7KV9kiqx4hRWL5H3BR2XHQWvfkdEGDmd
9SGe7/dRx55Ow+iQVXPlj/BoQcQBulplkXk+/J2xCUDgNSgNhZ1Jv/EcH1oBbE6FSsRkKd1lbSSSDhKv5Nl7hgkaVT+u8CNstD1
W9Q4cDpjaEbwtv2
2kTGoIphM0JqFAAKtJ7mTLdJH6QHgXWDSFY9ubcZO46ZieJ1rJGI49uCViGWOMOuTnzmLwkYHrwJ7XpwxYNd64Ao0oKlA
TcZ9/W5xdw65I4VKoITjrge0rB/KSpm58BaYv35892qhcZzLBHo7UV/Cc0SWfm0o4+hTIMVam",
"BatchID": "3"
}, {
"DataTicket": "7BEB9DDBEF0BB83B4BF38EF69F0CA xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
6187E92A8B0BF8924B1D8E333E9097",
"EncryptedUpdateRecord":"B3WuNHlwsHF6xGUdVCyv7k6PezTH8ciarKXOEcd
llRMdtrzRKzBYLBsqmspZhpg7KV9kiqx4hRWL5H3BR2XHQWvfkdEGDmd
9SGe7/dRx55Ow+iQVXPlj/BoQcQBulplkXk+/J2xCUDgNSgNhZ1Jv/EcH1oBbE6FSsRkKd1lbSSSDhKv5Nl7hgkaVT+u8CNstD1
W9Q4cDpjaEbwtv2
2kTGoIphM0JqFAAKtJ7mTLdJH6QHgXWDSFY9ubcZO46ZieJ1rJGI49uCViGWOMOuTnzmLwkYHrwJ7XpwxYNd64Ao0oKlA
TcZ9/W5xdw65I4VKoITjrge0rB/KSpm58BaYv35892qhcZzLBHo7UV/Cc0SWfm0o4+hTIMVam",
"BatchID": "4"
}] 38
Application of Encryption on JSON data
JSON Data expected to be submitted
[{"AccountNo":"3257634055",

"CurrentBalanceAmt":"2000",

"AmountOverdue":"0",

"Monthsinarrears":"0",

"LoanClassification":"performing",

"AccountStatusCode":"Open"

}, {

"AccountNo":"3257634056",

"CurrentBalanceAmt":"0",

"AmountOverdue":"0",

"Monthsinarrears":"0",

"LoanClassification":"performing",

"AccountStatusCode":"Closed"}]

BatchID
BatchID is incremental if the total record is greater than 500. SubmitBatchUpdate will take 500 record at a time, for
every 500 batch update passed after first 500 batch update record, BatchID will be passed as incremental value.

string BatchUpdateRecord =
"[{'AccountNo':'3257634055','CurrentBalanceAmt':'2000','AmountOverdue':'0','Monthsinarrears':'0','Loan
Classification':'performing','AccountStatusCode':'Open'},{'AccountNo':'3257634056','CurrentBalanceAmt'
:'0','AmountOverdue':'0','Monthsinarrears':'0','LoanClassification':'performing','AccountStatusCode':'
Closed'}]";
string secreteKey = "3sc3RLrpd17";
// Create sha256 hash
SHA256 mySHA256 = SHA256Managed.Create();
byte[] key = mySHA256.ComputeHash(Encoding.ASCII.GetBytes(secreteKey));

// Create secret IV
byte[] iv = new byte[16] { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0 };

string encrypted = EncryptString(BatchUpdateRecord, key, iv);

39
Output of the encrypted JSON Data

Header Content
Content-Type: application/json; charset=utf-8
Content-Length: length

Data

[{"DataTicket":"451E879844A5EE1715B30E5227F7C42A885B35D513D6F19835FAED4F9D5340864B5B50395
6FEF8E9AE4510E40AE29E9B4718DF683EE46C928GB65D36011C4C354BACB9EE885DA7D5C9BD2C8B647311433B
28DC88F1B4E8751783AA28278AD4AEF9C926EACDFFC676CA7681E68B50E92C52D997F87FD7EFA10FDC2A49C77
2791968EA05BB8278D654D45E06D5852884C7",
"EncryptedUpdateRecord":
"qSgpcalAi7csWfwmVdgfPcmaV+3hC+vsb2I86fESKu6xP4bcAxrdjJxsHJdKoXW5bLTvI2jpC4IdvIHjapN4XlhVpsZp4RUyYR1x
Pn2UNNYAXes1pnzZEOaQ8kbKY+3nsrwYd1zlGDL/PsHwbhAX+1/WmVLTXGXJgHIS9CJ0eUOVSE/hBkqs2KEK4cixKP7EFy0
39yF7zAZfsOSxKDrj9qUQ7QaaM406be0inFojFILhH7nfx4b8l2PcrkyxIaWvWNqj4khXVdJXOqeEiPIZQ8FTI1IZZAEE9OqwCR
Fl6u1ZjB8rePZT3WrF2wTx6fqjnM3KU2sMuCClORSb+UbVKs3jfdm4OhaJDGzOcJEgR6rQPUSEfYO/YTvPlLltgPozIqrftIEREo
B3gK0KRDWRL9gzsVNiJKnnBWQJ0/snDxB5H0jRLYCE1EZQkelo/SQAglM1BPuCwTQwIVTpR2eKBA==",

"BatchID":"1"}]

PHP Record Encryption


<?php

// How to encrypt and decrypt byte array using PHP As show on in C# encrypted code above

$plaintext = "[{'AccountNo':'3257634055','CurrentBalanceAmt':'2000','AmountOverdue':'0','Monthsinarrears':'0','Loan

Classification':'performing','AccountStatusCode':'Open'},{'AccountNo':'3257634056','CurrentBalanceAmt'

:'0','AmountOverdue':'0','Monthsinarrears':'0','LoanClassification':'performing','AccountStatusCode':'

Closed'}]";

$password = '3sc3RLrpd17';

$method = 'aes-256-cbc';

// Must be exact 32 chars (256 bit)

$password = substr(hash('sha256', $password, true), 0, 32);

// IV must be exact 16 chars (128 bit)

$iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) .
chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);

// av3DYGLkwBsErphcyYp+imUW4QKs19hUnFyyYcXwURU=

$encrypted = base64_encode(openssl_encrypt($plaintext, $method, $password, OPENSSL_RAW_DATA, $iv));

echo $encrypted;

?> 40
PHP Record Decryption

<?php

$password = '3sc3RLrpd17';

$method = 'aes-256-cbc';

// Must be exact 32 chars (256 bit)

$password = substr(hash('sha256', $password, true), 0, 32);

// IV must be exact 16 chars (128 bit)

$iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) .
chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);

$encrypted
=”qSgpcalAi7csWfwmVdgfPcmaV+3hC+vsb2I86fESKu6xP4bcAxrdjJxsHJdKoXW5bLTvI2jpC4IdvIHjapN4XlhVpsZp4RU
yYR1xPn2UNNYAXes1pnzZEOaQ8kbKY+3nsrwYd1zlGDL/PsHwbhAX+1/WmVLTXGXJgHIS9CJ0eUOVSE/hBkqs2KEK4ci
xKP7EFy039yF7zAZfsOSxKDrj9qUQ7QaaM406be0inFojFILhH7nfx4b8l2PcrkyxIaWvWNqj4khXVdJXOqeEiPIZQ8FTI1IZ
ZAEE9OqwCRFl6u1ZjB8rePZT3WrF2wTx6fqjnM3KU2sMuCClORSb+UbVKs3jfdm4OhaJDGzOcJEgR6rQPUSEfYO/YTvPl
LltgPozIqrftIEREoB3gK0KRDWRL9gzsVNiJKnnBWQJ0/snDxB5H0jRLYCE1EZQkelo/SQAglM1BPuCwTQwIVTpR2eKBA=
=”;

$decrypted = openssl_decrypt(base64_decode($encryptedd), $method, $password, OPENSSL_RAW_DATA, $iv);

echo 'decrypted to: ' . $decrypted . "\n\n";

?>

41
JAVA Record Encryption

public static String encrypt(String value, String SECRET_KEY) {

try {
SecureRandom random = new SecureRandom();
byte[] salt = new byte[32];
random.nextBytes(salt);
//Define Initialization Vector
byte[] ivBytes ={ (byte)0x0, (byte)0x0,(byte) 0x0, (byte)0x0,(byte) 0x0,(byte)
0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0, (byte) 0x0,(byte)
0x0,(byte) 0x0,(byte) 0x0,(byte) 0x0 };

//random.nextBytes(ivBytes);
IvParameterSpec iv = new IvParameterSpec(ivBytes);

//Encode Secret key with ASCII and SHA-256


byte[] password = SECRET_KEY.getBytes("ASCII");

MessageDigest digest = MessageDigest.getInstance("SHA-256");


byte[] hashPassword = digest.digest(password);

byte[] aesKey = new byte[32];


aesKey = Arrays.copyOf(hashPassword, 32);

//Prepare Secret key


SecretKeySpec skeySpec = new SecretKeySpec(aesKey, "AES");

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");


cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

byte[] encrypted = cipher.doFinal(value.getBytes());


return Base64.encodeToString(encrypted, Base64.DEFAULT);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}

USAGE
String SECRET_KEY = "3sc3RLrpd17";
String enval= "[{""Username"": ""1234""}]";
String EncryptedRecord = encrypt(enval); //dyUW7VzcQtKRYORpTJAf2VUi5UvgPhdU3hTo/jVoSiM=

[{ "DataTicket":
"D184DB5B06F9CA39F750271C2E459FE21F7E11EB2BCC10AA56AA2FFA66597E405B9D5F191F020C91F4A107993CE
2CBA649FC280643F80C19863328B50E2D0F5C98A6E8E742D486B8F408EF46068202B8CCF92AC1692E0440257096D
2058EC060",

"EncryptedUpdateRecord": EncryptedRecord,

"BatchID": "1" }]

42
Update Output
Complete Update

{ TotalRecordSubmitted = 156, TotalMatch = 120, NotMatched = 36, MatchRate = 76%, Message = Successful, UpdateID
= B-U2021052422111169397 }

Data Submission Integration Process

1. Acquire UAT credentials from FirstCentral team


2. Follow the documentation for integration and contact FirstCentral technical support team for
assistance
3. Test your data on UAT environment
4. Send Test sample request and UploadID from response to technical team supporting your integration
process
5. Our QA team/data team will check and confirm that your data structure with contents are ok
6. If your data is good in 5 above, you will be issued live secret key
7. You will send your first live data by reporting the UploadID and payload in PDF for your process
documentation.
8. If your reviewed live data is good, FirstCentral team will activate your live key and push your data to
production.
9. In future, if your data structure is different from what is approved, the system will automatically
disable your live key. The last data you submitted when these changes happen will be disabled.
10. To submit the correct version of disabled data in 9 above, you will submit through reconciliation
endpoints in the documentation

43

You might also like