docs.openbanking.vulte.ng
Open in
urlscan Pro
34.237.153.113
Public Scan
Submitted URL: http://docs.openbanking.vulte.ng/
Effective URL: https://docs.openbanking.vulte.ng/
Submission Tags: phishing
Submission: On April 04 via api from ES — Scanned from ES
Effective URL: https://docs.openbanking.vulte.ng/
Submission Tags: phishing
Submission: On April 04 via api from ES — Scanned from ES
Form analysis
0 forms found in the DOMText Content
Public Documentation Settings ENVIRONMENT No Environment LAYOUT Double Column LANGUAGE cURL - cURL Vulte - Documentation Introduction Banking as a Service Want to try it quickly? Index of services Getting access to the APIs General API information Authentication headers What requests would look like What responses would look like Vulte standard status codes HTTP Status Codes Encryption of Secure element Switching providers for a service Bank CBN Codes Enquiry Transfers Payments Virtual Accounts Lookup Others Utll VULTE - DOCUMENTATION BANKING AS A SERVICE Our vision is to collaboratively provide the underlying banking services infrastructure to fintechs and innovators in order to deliver best in class user experiences and target the next generation bank customers. This suite of APIs provides access to an array of payment-related, enquiry & KYC lookup services. Vulte wraps around them an abstraction layer with one major goal: To provide a consistent interface to integrators regardless of underlying service provider. That way, you can switch between providers at any time, based on quality of service, business justification, etc. without starting a new integration project or changing your systems in any way. WANT TO TRY IT QUICKLY? To get started, sign up for Vulte by visiting https://openbanking.vulte.ng. Once your account has been approved, you will receive an invite email to set your password. * Set up your password * Login with newly set password * Generate your API key and secret INDEX OF SERVICES Here's the list of services available at the moment. It's a list that will grow with time as we complete more integrations. LOOKUP BVN MIN With this service, the calling apps can KYC a customer's bank verification number. This service will only return a True/False match of the supplied customer details if it matches what is saved against their BVN correctly. LOOKUP BVN MID With this service, the calling apps can do KYC with the customer's bvn. This service will return slightly above minimal KYC information. LOOKUP BVN MAX With this service, the calling apps can do KYC with the customer's bvn. This service will return maximum KYC information. LOOKUP ACCOUNT MIN With this service, the calling apps can KYC a customer's account numbe. This service will only return minimal KYC information. LOOKUP ACCOUNT MID With this service, the calling apps can do KYC with the customer's account number. This service will return slightly above minimal KYC information. LOOKUP ACCOUNT MAX With this service, the calling apps can do KYC with the customer's account number. This service will return maximum KYC information. GET STATEMENT With this service, the calling apps can get statements of accounts. Apps will forward the customer reference account number they will like to obtain information on and forward to Vulte. GET BALANCE With this service, the calling apps can get available balance for a given source. COLLECT With this service, the calling app can request or initiate payment from a customer. Provide a customer’s bank account number, Vulte forwards to selected provider, provider debits the linked account and credits beneficiary account tied to the app. The underlying provider may prompt for OTP, therefore you’d supply the OTP via a follow-on call. TRANSFER FUNDS With this service, the calling apps can do a transfer to a destination account number from a given source. Authorisation details (for source of funds) will always be required by the Vulte, apps will have to provide this. DISBURSE With this service, the calling apps can do a transfer to a destination account number from a pre-configured account of the app. If authorisation details are required by a provider, apps will have to provide this. LOOKUP NUBAN With this service, the calling apps can check corresponding banks matched to a customer's account number. In effect, take an account number and try to determine which bank it’s from. GET ACCOUNTS MIN With this service, the calling apps can take customer ref and return a masked list of accounts linked to it. Apps will collect the customer ref they will like to obtain information on and forward to Vulte. GET ACCOUNTS MID With this service, the calling apps can take customer ref and return an unmasked list of accounts linked to it. Apps will collect the customer ref they will like to obtain information on and forward to Vulte. GET BANKS With this service, the calling apps can get list of financial institutions with their corresponding codes. LIST BRANCHES List branches of Polaris Bank GETTING ACCESS TO THE APIS To get started, sign up for Vulte by visiting https://openbanking.vulte.ng. Once your account has been approved, you will receive an invite email to set your password. * Set up your password * Login with newly set password * Generate your API key and secret GENERAL API INFORMATION The APIs are fairly RESTFUL and organized around the main services you would be interacting with. You can simply import this collection from the top right of the page into your Postman. The base url currently sits at: Plain Text https://api.openbanking.vulte.ng AUTHENTICATION HEADERS Authenticate your API calls by including your API key in the Authorization header of every request you make. You can manage your API keys from your dashboard. Sample Authorization Header: Plain Text Authorization: Bearer {api_key} Also, every request requires you to provide a unique request-ref per call. Then You'd need to add a custom header called Signature that's an MD5 hash of that request-ref and your api-secret separated by a semi-colon. ;. Sample Signature Header: Plain Text Signature:MD5Hash(request_ref;client_secret) Your complete header for evey single call will look like: Plain Text Content-Type:application/json Authorization:Bearer {{api_key}} Signature:{{MD5Hash(request_ref;client_secret)}} WHAT REQUESTS WOULD LOOK LIKE For all requests, you'd put a JSON object in the body of your API call. All payloads have the following high level construct: View More Plain Text { "request_ref":"0000000001", "request_type":"lookup_bvn_max | get_statement |etc", "auth": { "type": "bvn | bank.account", "secure": "YKBOxtdD8kZHqG7JO0C9TZ", "auth_provider": "Polaris" }, "transaction": { "amount": 10000, "transaction_ref": "000001", "transaction_desc": "A random transaction", "transaction_ref-parent": "000001", "customer":{ "customer_ref": "000001", "firstname": "Kola", "surname": "Eboe", "email": "kolaebue@gmail.com", "mobile_no": "2348009871412" }, "meta":{ "a_key":"a_meta_value_1", "b_key":"a_meta_value_2" }, "details": { "key": 'value' } } } WHAT RESPONSES WOULD LOOK LIKE For all responses, you'd get a JSON object in the body of the response you receive. All payloads have the following high level construct: View More Plain Text { "status": "Processing | WaitingForOTP | ProcessingOTP | Successful | Failed | OfflineValidating | OfflineValidated | OfflineNotifying | OfflineNotified", "message": "The transaction has been processed successully", "data": { "provider_responde_code":"00", "provider": "Polaris", "errors": [], "error": null, "charge_token": "Kz5Dev7BenV9HmLNB", "paymentoptions": [] } } * status: Indicates the state of the request, whether successful, failed or anything in between * message: Provides a text description of the state of the request and at times a message for the customer * data: Will contain much more details of the outcome of the request. The values within this could vary by request type or endpoint called but some standard elements would be in almost all calls * provider_response_code: The actual response code receieved from the underlyig provider, e.g. 00 for Quickteller * provider: The provider that was used to process the request * errors: In case of a failed transaction, this contains the lists of errors that occurred while processing the transaction * error: This contain the most important error that hinders the successful completion of the transaction. We highly recommend that developers use the Errors field to determine the result of an API call. As an empty Errors node indicate a successful transaction. NOTE: Some API calls may have response elements that are only applicable to those API calls. You will see examples in the provided postman collection and across the documentation. VULTE STANDARD STATUS CODES * Successful: For all requests that were successfully processed * Failed: If a request fails. Read the errors object(s) * WaitingForOTP: If a request requires OTP validation for completion. * PendingValidation: If a request requires other information to be supplied for completion. * Processing: If a transaction request is still in a processing state and needs to be subsequently queried. * OptionsDelivered: Applicable only for services that support some form of options processing. * InvalidID: If an ID being looked up by service is not valid. * Fraud: If a request is flagged as suspicious. * Duplicate: If a similar request has been made earlier within a stipulated time frame of 5 minutes. * [Anything else]: This would vary per endpoint called. Applicable values would be in the documentation for that endpoint. HTTP STATUS CODES * 200: A successful request occurred, do note that the description field on the response can contain further steps to be carried on this transaction * 400: Data validation error occurred due to inconsistent data supplied by the client * 401: Invalid request authorization, which might be due to invalid API key or the client is not registered for the service being accessed. * 500: An internal server error at our End, this should be reported if it persists. ENCRYPTION OF SECURE ELEMENT NOTE Please note that the underlying encryption behind the core Vulte communication is based on the AES algorithm. This section only shows encryption details for some parameters on the merchant request payload. For encryption of values for the auth.secure field, do use Triple DES Encryption Algorithm with your application secret key as the encryption key E.g. Plain Text TripleDES.encrypt("{bvn}",secretKey) TripleDES.encrypt("{bank_account;bank_code}",secretKey) TripleDES.encrypt("{otp}",secretKey) TripleDES.encrypt("{card.Pan;card.Cvv;card.Expdate;card.Pin}",secretKey) NOTE For DCIR: CVV is not required for Card-Present transactions, the cvv position should be left empty. View More Plain Text TripleDES.encrypt("{card.Pan;card.Cvv;card.Expdate;card.Pin}",secretKey) => Card-Not-Present TripleDES.encrypt("{card.Pan;;card.Expdate;card.Pinblock}",secretKey) => Card-Present NOTE Expiry date is MMYY SAMPLE ENCRYPTION IN JAVA View More Plain Text MessageDigest md = MessageDigest.getInstance("md5"); byte[] digestOfPassword = md.digest(key.getBytes("UTF-16LE")); byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); for (int j = 0, k = 16; j < 8;) { keyBytes[k++] = keyBytes[j++]; } SecretKey secretKey = new SecretKeySpec(keyBytes, 0, 24, "DESede"); IvParameterSpec iv = new IvParameterSpec(new byte[8]); Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv); byte[] plainTextBytes = toBeEncrypted.getBytes("UTF-16LE"); byte[] cipherText = cipher.doFinal(plainTextBytes); String output = new String(Base64.encodeBase64(cipherText)); return output; SAMPLE ENCRYPTION IN C-SHARP View More Plain Text string encryptedText = ""; MD5 md5 = new MD5CryptoServiceProvider(); TripleDES des = new TripleDESCryptoServiceProvider(); des.KeySize = 128; des.Mode = CipherMode.CBC; des.Padding = PaddingMode.PKCS7; byte[] md5Bytes = md5.ComputeHash(Encoding.Unicode.GetBytes(key)); byte[] ivBytes = new byte[8]; des.Key = md5Bytes; des.IV = ivBytes; byte[] clearBytes = Encoding.Unicode.GetBytes(TextToEncrypt); ICryptoTransform ct = des.CreateEncryptor(); using (MemoryStream ms = new MemoryStream()) { using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)) { cs.Write(clearBytes, 0, clearBytes.Length); cs.Close(); } encryptedText = Convert.ToBase64String(ms.ToArray()); } return encryptedText; SAMPLE ENCRYPTION IN PHP View More Plain Text function EncryptV2($encryption_key,$data) { $source = mb_convert_encoding($encryption_key, 'UTF-16LE', 'UTF-8'); $key = md5($source, true); $key .= substr($key, 0, 8); // a 128 bit (16 byte) key // append the first 8 bytes onto the end //Pad for PKCS7 $block = mcrypt_get_block_size('tripledes', 'cbc'); $len = strlen($data); $padding = $block - ($len % $block); $data .= str_repeat(chr($padding),$padding); $iv = "\0\0\0\0\0\0\0\0"; $encData = mcrypt_encrypt('tripledes', $key, $data, 'cbc',$iv); echo base64_encode($encData); } SAMPLE ENCRYPTION IN NODE.JS View More Plain Text const crypto = require('crypto'); function encrypt(sharedKey, plainText) { const bufferedKey = Buffer.from(sharedKey, 'utf16le'); const key = crypto.createHash('md5').update(bufferedKey).digest(); const newKey = Buffer.concat([key, key.slice(0, 8)]); const IV = Buffer.alloc(8, '\0'); const cipher = crypto.createCipheriv('des-ede3-cbc', newKey, IV).setAutoPadding(true); return cipher.update(plainText, 'utf8', 'base64') + cipher.final('base64'); } SWITCHING PROVIDERS FOR A SERVICE All services subscribed to in your application are attached to providers that will end up fulfilling such service(s) on request. You can switch providers as you wish by managing the application from your dashboard and editing the service details. Also, for some endpoints, you can explicitly set the provider you would like to be used in the request payload. You would see examples in the documentation for the endpoints that support this. BANK CBN CODES Anywhere bank codes are required in the API specification (bank_code), this refers to the CBN bank codes. Details of all bank codes can be found here. Now let's dive deeper into specific API calls.