0.1.21 • Published 9 months ago

bni-nodejs v0.1.21

Weekly downloads
-
License
MIT
Repository
github
Last release
9 months ago

BNI API SDK - Node.js · Static Badge Static Badge

This is the Official Node JS API client / library for BNI API.

Please visit Digital Services for more information about our product and visit our documentation page at API Documentation for more technical details.

1. Installation

1.1 Using NPM

npm install --save bni-nodejs

1.2 Manual Installation

If you are not using NPM, you can clone or download this repository. Then import from index.js file.

import { BNIClient } from "bni-nodejs";
// const { BNIClient } = require('bni-nodejs'); // legacy way

2. Usage

2.1 Choose an API Product

We have 6 API products you can use:

  • One Gate Payment - A solution for a company to integrate its application / system with banking transaction services. documentation
  • Snap BI - Integrate with SNAP BI documentation
  • RDL - A solution for a company to integrate its application / system with banking transaction services. documentation
  • RDN - A solution for Securities companies in opening digital accounts for investors and can facilitate book-entry transactions by integrating them with API. documentation
  • RDF - A solution for fintech companies registered with OJK in opening digital accounts to facilitate fund transfer transactions by utilizing API technology. Benefits Providing convenience for Fintech companies in opening, managing and carrying out transactions on fintech fund accounts advantages - Real-time account bookkeeping process - Transfer to other banks via the Online Transfer feature (Bersama, Prima, Link) - Get recipient account information from the bank - Can carry out Inhouse transfer transactions, Clearing (SKN), RTGS. documentation
  • Ecollection - Integrate with Ecollection. documentation

2.2 Client Initialization and Configuration

Get your client key and server key from Menu - Applications Create API client object

import { BNIClient } from "bni-nodejs";
// const { BNIClient } = require('bni-nodejs'); // legacy way

// Create Core API instance
const client = new BNIClient({
  env: "sandbox", // dev, sandbox or prod
  clientId: "{your-client-id}",
  clientSecret: "{your-client-secret}",
  apiKey: "{your-api-key}",
  apiSecret: "{your-api-secret}",
  appName: "{your-app-name}",
});

2.2.A One Gate Payment

Create One Gate Payment class object

import { BNIClient, OneGatePayment } from "bni-nodejs";
// const { BNIClient, OneGatePayment } = require('bni-nodejs'); // legacy way

// Create Client instance
const client = new BNIClient({
  env: "sandbox", // dev, sandbox or prod
  clientId: "{your-client-id}",
  clientSecret: "{your-client-secret}",
  apiKey: "{your-api-key}",
  apiSecret: "{your-api-secret}",
  appName: "{your-app-name}",
});

const ogp = new OneGatePayment(client);

Available methods for One Gate Payment class

Get Balance

// return as Promise of Object
const getBalance = await ogp.getBalance({
  accountNo: "113183203",
});

Get In House Inquiry

// return as Promise of Object
const getInHouseInquiry = await ogp.getInHouseInquiry({
  accountNo: "113183203",
});

Do Payment

// return as Promise of Object
const doPayment = await ogp.doPayment({
  customerReferenceNumber: "20170227000000000020", // max 20 char client defined reference number
  paymentMethod: "0", // 0: In-house (intra BNI), 1: RTGS transfer, 2: Kliring transfer
  debitAccountNo: "113183203",
  creditAccountNo: "115471119",
  valueDate: "20170227000000000",
  valueCurrency: "IDR",
  valueAmount: "100500",
  remark: "", // optional
  beneficiaryEmailAddress: "mail@example.com", // optional
  beneficiaryName: "Mr. X", // optional max 50 char (mandatory if paymentMethod 1 / 2)
  beneficiaryAddress1: "Jakarta", // optional max 50 char (mandatory if paymentMethod 1 / 2)
  beneficiaryAddress2: "", // optional max 50 char
  destinationBankCode: "", // optional (mandatory if paymentMethod 1 / 2)
  chargingModelId: "OUR", // OUR: fee will be paid by sender (default), BEN: fee will be paid by beneficary, SHA: fee divided
});

Get Payment Status

// return as Promise of Object
const getPaymentStatus = await ogp.getPaymentStatus({
  customerReferenceNumber: "20170227000000000020", // max 20 char client defined reference number
});

Get Inter Bank Inquiry

// return as Promise of Object
const getInterBankInquiry = await ogp.getInterBankInquiry({
  customerReferenceNumber: "20170227000000000021", // max 20 char client defined reference number
  accountNum: "113183203",
  destinationBankCode: "014",
  destinationAccountNum: "3333333333",
});

Get Inter Bank Payment

// return as Promise of Object
const getInterBankPayment = await ogp.getInterBankPayment({
  customerReferenceNumber: "20170227000000000021", // max 20 char client defined reference number
  amount: "100500",
  destinationAccountNum: "3333333333",
  destinationAccountName:
    "BENEFICIARY NAME 1 UNTIL HERE1BENEFICIARY NAME 2(OPT) UNTIL HERE2",
  destinationBankCode: "014",
  destinationBankName: "BCA",
  accountNum: "115471119",
  retrievalReffNum: "100000000024", // refference number for Interbank Transaction
});

2.2.B Snap BI Transfer Credit

Create Snap BI class object

import { BNIClient, SnapBI } from "bni-nodejs";
// const { BNIClient, SnapBI } = require('bni-nodejs'); // legacy way

// Create Client instance
const client = new BNIClient({
  env: "dev", // dev, sandbox or prod
  clientId: "{your-client-id}",
  clientSecret: "{your-client-secret}",
  apiKey: "{your-api-key}",
  apiSecret: "{your-api-secret}",
  appName: "{your-app-name}",
});

const snap = new SnapBI(client, {
  privateKeyPath: "{your-rsa-private-key-path}", // Mandatory
  channelId: "{your-channel-id}", // Mandatory
  ipAddress: "{your-ip-address}", // Optional
  latitude: "{your-latitude}", // Optional
  longitude: "{your-longitude}", // Optional
});

Available methods for Snap BI class

Balance Inquiry

// return as Promise of Object
const balanceInquiry = await snap.balanceInquiry({
  partnerReferenceNo: "202010290000000000002", // optional
  accountNo: "0115476117",
});

Internal Account Inquiry

// return as Promise of Object
const internalAccountInquiry = await snap.internalAccountInquiry({
  partnerReferenceNo: "2023062601000000000509", // optional
  beneficiaryAccountNo: "317125693",
});

Transaction Status Inquiry

// return as Promise of Object
const transactionStatusInquiry = await snap.transactionStatusInquiry({
  originalPartnerReferenceNo: "202310271020300006", // optional
  originalReferenceNo: "", // transaction reference number
  originalExternalId: "", // optional
  serviceCode: "22", // SNAP BI service code
  transactionDate: "",
  amount: {
    value: "110000010",
    currency: "IDR",
  },
  additionalInfo: {
    deviceId: "09864ADCASA", // optinal
    channel: "API", // optinal
  },
});

Transfer Intra Bank

// return as Promise of Object
const transferIntraBank = await snap.transferIntraBank({
  partnerReferenceNo: '20220426170737356898', // transaction reference number
  amount: {
    value: '55000.00',
    currency: 'IDR'
  },
  beneficiaryAccountNo: '0115476151',
  beneficiaryEmail: '', // optional
  currency: 'IDR', // optional
  customerReference: '20220426170737356898', // optional
  feeType: 'OUR', // OUR: fee will be paid by sender (default), BEN: fee will be paid by beneficary, SHA: fee divided
  remark: '20220426170737356898', // optional
  sourceAccountNo: '0115476117',
  transactionDate: '2022-04-26T17:07:36+07:00',
  additionalInfo: {
    deviceId: '123456', // optinal
    channel: 'mobilephone' // optinal
  }
});

Transfer RTGS

// return as Promise of Object
const transferRTGS = await snap.transferRTGS({
  partnerReferenceNo: "20220513095840015788857", // transaction reference number
  amount: {
    value: "100000001.00",
    currency: "IDR",
  },
  beneficiaryAccountName: "PTZomatoMediaIndonesia",
  beneficiaryAccountNo: '"3333333333',
  beneficiaryAccountAddress: "JlGatotSubrotoNoKav18RW1KuninganBarKecMampangPrptKotaJakartaSelatanDaerahKhususIbukotaJakarta12710", // optional
  beneficiaryBankCode: "CENAIDJA",
  beneficiaryBankName: "PTBANKCENTRALASIATbk", // optional
  beneficiaryCustomerResidence: "1",
  beneficiaryCustomerType: "2",
  beneficiaryEmail: "", // optional
  currency: "IDR", // optional
  customerReference: "20220513095840015788857",
  feeType: "OUR", // OUR: fee will be paid by sender (default), BEN: fee will be paid by beneficary, SHA: fee divided
  kodePos: "-", // optional
  recieverPhone: "-", // optional
  remark: "DANA20220513095840015788857PTZomatoMediaIndonesia", // optional
  senderCustomerResidence: "-", // optional
  senderCustomerType: "-", // optional
  senderPhone: "", // optional
  sourceAccountNo: "0115476151",
  transactionDate: "2020-06-17T01:03:04+07:00",
  additionalInfo: {
    deviceId: "", // optinal
    channel: "", // optinal
  },
});

Transfer SKNBI

// return as Promise of Object
const transferSKNBI = await snap.transferSKNBI({
  partnerReferenceNo: "20220523150428586179325", // transaction reference number
  amount: {
    value: "10000001.00",
    currency: "IDR",
  },
  beneficiaryAccountName: "PTZomatoMediaIndonesia",
  beneficiaryAccountNo: "0115476117",
  beneficiaryAddress: "JlGatotSubrotoNoKav18RW1KuninganBarKecMampangPrptKotaJakartaSelatanDaerahKhususIbukotaJakarta12710", // optional
  beneficiaryBankCode: "CENAIDJAXXX",
  beneficiaryBankName: "PTBANKCENTRALASIATbk", // optional
  beneficiaryCustomerResidence: "1",
  beneficiaryCustomerType: "2",
  beneficiaryEmail: "", // optional
  currency: "IDR", // optional
  customerReference: "20220523150428586179325",
  feeType: "OUR", // OUR: fee will be paid by sender (default), BEN: fee will be paid by beneficary, SHA: fee divided
  kodePos: "", // optional
  recieverPhone: "", // optional
  remark: "DANA20220523150428586179325PTZomatoMediaIndonesia", // optional
  senderCustomerResidence: "", // optional
  senderCustomerType: "", // optional
  senderPhone: "", // optional
  sourceAccountNo: "0115476151",
  transactionDate: "2020-06-17T01:03:04+07:00",
  additionalInfo: {
    deviceId: "", // optinal
    channel: "", // optinal
  },
});

External Account Inquiry

// return as Promise of Object
const externalAccountInquiry = await snap.externalAccountInquiry({
  beneficiaryBankCode: "CENAIDJAXXX",
  beneficiaryAccountNo: "123456789",
  partnerReferenceNo: "20240226163135663", // optional
  additionalInfo: {
    deviceId: "09864ADCASA", // optinal
    channel: "API", // optinal
  },
});

Transfer Inter Bank

// return as Promise of Object
const transferInterBank = await snap.transferInterBank({
  partnerReferenceNo: "20240226163731861", // transaction reference number
  amount: {
    value: "20000",
    currency: "IDR",
  },
  beneficiaryAccountName: "SRI ANGGRAINI",
  beneficiaryAccountNo: "0000000986",
  beneficiaryAddress: "Palembang", // optional
  beneficiaryBankCode: "014",
  beneficiaryBankName: "Bank BCA", // optional
  beneficiaryEmail: "mail@example.com", // optional
  currency: "IDR", // optional
  customerReference: "20231219085", // optional
  sourceAccountNo: "1000161562",
  transactionDate: "2024-01-04T08:37:08+07:00",
  feeType: "OUR", // OUR: fee will be paid by sender (default), BEN: fee will be paid by beneficary, SHA: fee divided
  additionalInfo: {
    deviceId: "09864ADCASA", // optinal
    channel: "API", // optinal
  },
});

2.2.C P2P Lending / RDL

Create Rdl class object

import { BNIClient, Rdl } from "bni-nodejs";
// const { BNIClient, Rdl } = require('bni-nodejs'); // legacy way

// Create Client instance
const client = new BNIClient({
  env: "sandbox", // dev, sandbox or prod
  clientId: "{your-client-id}",
  clientSecret: "{your-client-secret}",
  apiKey: "{your-api-key}",
  apiSecret: "{your-api-secret}",
  appName: "{your-app-name}",
});

const rdl = new Rdl(client);

Available methods for RDL class

Register Investor

// return as Promise of Object
const registerInvestor = async () => {
  const res = await rdl.registerInvestor({
    companyId: "SANDBOX",
    parentCompanyId: "STI_CHS",
    uuidFaceRecog: "492F33851D634CFB", //RequestUuid successed value from Face Recognition API (KYC valid)
    title: "01",
    firstName: "Agus", //optional
    middleName: "", //optional
    lastName: "Saputra",
    optNPWP: "1", //“1” or “0” (Default “1”)
    NPWPNum: "001058893408123",
    nationality: "ID", //e.g.: “ID”
    domicileCountry: "ID", //e.g.: “ID”
    religion: "2",
    birthPlace: "Semarang",
    birthDate: "14081982",
    gender: "M", //“M” or “F”
    isMarried: "S",
    motherMaidenName: "Dina Maryati",
    jobCode: "01",
    education: "07",
    idType: "01",
    idNumber: "4147016201959998", //Identity Number (KTP only)
    idIssuingCity: "Jakarta Barat",
    idExpiryDate: "26102099", //ddMMyyyy
    addressStreet: "Jalan Mawar Melati",
    addressRtRwPerum: "003009Sentosa",
    addressKel: "Cengkareng Barat",
    addressKec: "Cengkareng/Jakarta Barat",
    zipCode: "11730",
    homePhone1: "0214", //Area code, e.g. 021 (3 - 4 digit) If not exist, fill with “9999”
    homePhone2: "7459", //Number after area code (min 4 digit) If not exist, fill with “99999999”
    officePhone1: "", //(Optional) Area code, e.g. 021
    officePhone2: "", //(Optional)  Number after area code
    mobilePhone1: "0812", //Operator code, e.g. 0812 (4 digit) If not exist, fill with “0899”
    mobilePhone2: "12348331", //Number after operator code (min 6 digit) If not exist, fill with “999999”
    faxNum1: "", //(Optional) Area code, e.g. 021
    faxNum2: "", //(Optional) Number after area code
    email: "agus.saputra@gmail.com",
    monthlyIncome: "8000000",
    branchOpening: "0259",
    institutionName: "PT. BNI SECURITIES",
    sid: "IDD280436215354",
    employerName: "Salman", //Employer Name / Company Name
    employerAddDet: "St Baker", //Employer street address / home street address
    employerAddCity: "Arrandelle", //Employer city address / home city address
    jobDesc: "Pedagang",
    ownedBankAccNo: "0337109074",
    idIssuingDate: "10122008",
  });
  return res;
};

Register Investor Account

// return as Promise of Object
const registerInvestorAccount = async () => {
  const res = await rdl.registerInvestorAccount({
    companyId: "SANDBOX",
    parentCompanyId: "STI_CHS", //optional
    cifNumber: "9100749959",
    currency: "IDR", //“IDR” or “USD”
    openAccountReason: "2",
    sourceOfFund: "1",
    branchId: "0259",
  });
  return res;
};

Inquiry Account Info

// return as Promise of Object
const inquiryAccountInfo = async () => {
  const res = await rdl.inquiryAccountInfo({
    companyId: "SANDBOX",
    parentCompanyId: "STI_CHS", //optional
    accountNumber: "0115476117",
  });
  return res;
};

Inquiry Account Balance

// return as Promise of Object
const inquiryAccountBalance = async () => {
  const res = await rdl.inquiryAccountBalance({
    companyId: "SANDBOX",
    parentCompanyId: "STI_CHS", //optional
    accountNumber: "0115476117",
  });
  return res;
};

Inquiry Account History

// return as Promise of Object
const inquiryAccountHistory = async () => {
  const res = await rdl.inquiryAccountHistory({
    companyId: "NI001",
    parentCompanyId: "KSEI", //optional
    accountNumber: "0115476117",
  });
  return res;
};

Payment Using Transfer

// return as Promise of Object
const paymentUsingTransfer = async () => {
  const res = await rdl.paymentUsingTransfer({
    companyId: "SANDBOX",
    parentCompanyId: "STI_CHS", //optional
    accountNumber: "0115476117",
    beneficiaryAccountNumber: "0115471119",
    currency: "IDR", //e.g., “IDR”
    amount: "11500",
    remark: "Test P2PL", //(optional) Recommended for the reconciliation purpose
  });
  return res;
};

Payment Using Clearing

// return as Promise of Object
const paymentUsingClearing = async () => {
  const res = await rdl.paymentUsingClearing({
    companyId: "SANDBOX",
    parentCompanyId: "STI_CHS", //optional
    accountNumber: "0115476117",
    beneficiaryAccountNumber: "3333333333",
    beneficiaryAddress1: "Jakarta",
    beneficiaryAddress2: "",
    beneficiaryBankCode: "140397",
    beneficiaryName: "Panji Samudra",
    currency: "IDR", //e.g., “IDR”
    amount: "15000",
    remark: "Test kliring", //(optional)Recommended for the reconciliation purpose
    chargingType: "OUR",
  });
  return res;
};

Payment Using RTGS

// return as Promise of Object
const paymentUsingRTGS = async () => {
  const res = await rdl.paymentUsingRTGS({
    companyId: "SANDBOX",
    parentCompanyId: "STI_CHS",
    accountNumber: "0115476117",
    beneficiaryAccountNumber: "3333333333",
    beneficiaryAddress1: "Jakarta",
    beneficiaryAddress2: "",
    beneficiaryBankCode: "CENAIDJA",
    beneficiaryName: "Panji Samudra",
    currency: "IDR", //e.g., “IDR”
    amount: "150000000",
    remark: "Test rtgs", //(optional)Recommended for the reconciliation purpose
    chargingType: "OUR",
  });
  return res;
};

Inquiry Payment Status

// return as Promise of Object
const inquiryPaymentStatus = async () => {
  const res = await rdl.inquiryPaymentStatus({
    companyId: "SANDBOX",
    parentCompanyId: "STI_CHS", //optional
    requestedUuid: "E8C6E0027F6E429F",
  });
  return res;
};

Inquiry Interbank Account

// return as Promise of Object
const inquiryInterbankAccount = async () => {
  const res = await rdl.inquiryInterbankAccount({
    companyId: "NI001",
    parentCompanyId: "KSEI", //optional
    accountNumber: "0115476117",
    beneficiaryBankCode: "013",
    beneficiaryAccountNumber: "01300000",
  });
  return res;
};

Payment Using Interbank

// return as Promise of Object
const paymentUsingInterbank = async () => {
  const res = await rdl.paymentUsingInterbank({
    companyId: "SANDBOX",
    parentCompanyId: "STI_CHS", //optional
    accountNumber: "0115476117",
    beneficiaryAccountNumber: "3333333333", //Get from Inquiry Interbank Account
    beneficiaryAccountName: "KEN AROK",
    beneficiaryBankCode: "014",
    beneficiaryBankName: "BANK BCA", //Get from Inquiry Interbank Account
    amount: "15000",
  });
  return res;
};

Face Recognition

// return as Promise of Object
const faceRecognition = async () => {
  const res = await rdl.faceRecognition({
    companyId: "SANDBOX",
    parentCompanyId: "STI_CHS", //optional
    firstName: "MOHAMMAD", //optional
    middleName: "BAQER", //optional
    lastName: "ZALQAD",
    idNumber: "0141111121260118", //Identity Number (KTP only)
    birthDate: "29-09-2021",
    birthPlace: "BANDUNG",
    gender: "M", //“M” or “F”
    cityAddress: "Bandung",
    stateProvAddress: "Jawa Barat",
    addressCountry: "ID", //e.g.: “ID”
    streetAddress1: "bandung",
    streetAddress2: "bandung",
    postCodeAddress: "40914",
    country: "ID", //e.g.: “ID”
    selfiePhoto: "29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuP", //Base64 encoded selfie photo
  });
  return res;
};

2.2.D Fintech Account Service (RDF)

Create Fintech Account Service (RDF) class object

import { BNIClient, Rdf } from 'bni-nodejs';
// const { BNIClient, Rdf } = require('bni-nodejs'); // legacy way

// Create Client instance
const client = new BNIClient({
  env: 'sandbox', // dev, sandbox or prod
  clientId: '{your-client-id}',
  clientSecret: '{your-client-secret}',
  apiKey: '{your-api-key}',
  apiSecret: '{your-api-secret}',
  appName: '{your-app-name}'
});

const rdf = new Rdf(client);

Available methods for Fintech Account Service (RDF) class

Register Investor

// return as Promise of Object
const registerInvestor = async () => {
  const res = await rdf.registerInvestor({
    companyId: "SANDBOX",
    parentCompanyId: "STI_CHS",
    uuidFaceRecog: "492F33851D634CFB", //RequestUuid successed value from Face Recognition API (KYC valid)
    title: "01",
    firstName: "Agus", //optional
    middleName: "", //optional
    lastName: "Saputra",
    optNPWP: "1", //“1” or “0” (Default “1”)
    NPWPNum: "001058893408123",
    nationality: "ID", //e.g.: “ID”
    domicileCountry: "ID", //e.g.: “ID”
    religion: "2",
    birthPlace: "Semarang",
    birthDate: "14081982",
    gender: "M", //“M” or “F”
    isMarried: "S",
    motherMaidenName: "Dina Maryati",
    jobCode: "01",
    education: "07",
    idType: "01",
    idNumber: "4147016201959998", //Identity Number (KTP only)
    idIssuingCity: "Jakarta Barat",
    idExpiryDate: "26102099", //ddMMyyyy
    addressStreet: "Jalan Mawar Melati",
    addressRtRwPerum: "003009Sentosa",
    addressKel: "Cengkareng Barat",
    addressKec: "Cengkareng/Jakarta Barat",
    zipCode: "11730",
    homePhone1: "0214", //Area code, e.g. 021 (3 - 4 digit) If not exist, fill with “9999”
    homePhone2: "7459", //Number after area code (min 4 digit) If not exist, fill with “99999999”
    officePhone1: "", //(Optional) Area code, e.g. 021
    officePhone2: "", //(Optional)  Number after area code
    mobilePhone1: "0812", //Operator code, e.g. 0812 (4 digit) If not exist, fill with “0899”
    mobilePhone2: "12348331", //Number after operator code (min 6 digit) If not exist, fill with “999999”
    faxNum1: "", //(Optional) Area code, e.g. 021
    faxNum2: "", //(Optional) Number after area code
    email: "agus.saputra@gmail.com",
    monthlyIncome: "8000000",
    branchOpening: "0259",
    institutionName: "PT. BNI SECURITIES",
    sid: "IDD280436215354",
    employerName: "Salman", //Employer Name / Company Name
    employerAddDet: "St Baker", //Employer street address / home street address
    employerAddCity: "Arrandelle", //Employer city address / home city address
    jobDesc: "Pedagang",
    ownedBankAccNo: "0337109074",
    idIssuingDate: "10122008",
  });
  return res;
};

Face Recognition

// return as Promise of Object
const faceRecognition = async () => {
  const res = await rdf.faceRecognition({
    companyId: "SANDBOX",
    parentCompanyId: "STI_CHS", //optional
    firstName: "MOHAMMAD", //optional
    middleName: "BAQER", //optional
    lastName: "ZALQAD",
    idNumber: "0141111121260118", //Identity Number (KTP only)
    birthDate: "29-09-2021",
    birthPlace: "BANDUNG",
    gender: "M", //“M” or “F”
    cityAddress: "Bandung",
    stateProvAddress: "Jawa Barat",
    addressCountry: "ID", //e.g.: “ID”
    streetAddress1: "bandung",
    streetAddress2: "bandung",
    postCodeAddress: "40914",
    country: "ID", //e.g.: “ID”
    selfiePhoto: "29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuP", //Base64 encoded selfie photo
  });
  return res;
};

Register Investor Account

// return as Promise of Object
const registerInvestorAccount = async () => {
  const res = await rdf.registerInvestorAccount({
    companyId: ' NI001',
    parentCompanyId: 'KSEI', // optional
    cifNumber: '9100749959',
    currency: 'IDR', // “IDR” or “USD”
    openAccountReason: '2',
    sourceOfFund: '1',
    branchId: '0259',
    bnisId: '19050813401',
    sre: 'NI001CX5U00109' 
  });
  return res;
};

Inquiry Account Info

// return as Promise of Object
const inquiryAccountInfo = async () => {
  const res = rdf.inquiryAccountInfo({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    accountNumber: '0115476117'
  });
  return res;
};

Inquiry Account Balance

// return as Promise of Object
const inquiryAccountBalance = async () => {
  const res = rdf.inquiryAccountBalance({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    accountNumber: '0115476117'
  });
  return res;
};

Inquiry Account History

// return as Promise of Object
const inquiryAccountHistory = async () => {
  const res = rdf.inquiryAccountHistory({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    accountNumber: '0115476117'
  });
  return res;
};

Payment Using Transfer

// return as Promise of Object
const paymentUsingTransfer = async () => {
  const res = rdf.paymentUsingTransfer({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    accountNumber: '0115476117',
    beneficiaryAccountNumber: '0115471119',
    currency: 'IDR', // e.g., “IDR”
    amount: '11500',
    remark: 'Test RDN' // Recommended for the reconciliation purpose
  });
  return res;
};

Inquiry Payment Status

// return as Promise of Object
const inquiryPaymentStatus = async () => {
  const res = rdf.inquiryPaymentStatus({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    requestedUuid: 'E8C6E0027F6E429F'
  });
  return res;
};

Payment Using Clearing

// return as Promise of Object
const paymentUsingClearing = async () => {
  const res = rdf.paymentUsingClearing({
    companyId: 'SANDBOX',
    parentCompanyId: 'STI_CHS', // optional
    accountNumber: '0115476117',
    beneficiaryAccountNumber: '3333333333',
    beneficiaryAddress1: 'Jakarta',
    beneficiaryAddress2: '',
    beneficiaryBankCode: '140397',
    beneficiaryName: 'Panji Samudra',
    currency: 'IDR', // e.g., “IDR”
    amount: '15000',
    remark: 'Test kliring', // //(optional)Recommended for the reconciliation purpose
    chargingType: 'OUR'
  });
  return res;
};

Payment Using RTGS

// return as Promise of Object
const paymentUsingRTGS = async () => {
  const res = rdf.paymentUsingRTGS({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    accountNumber: '0115476117',
    beneficiaryAccountNumber: '3333333333',
    beneficiaryAddress1: 'Jakarta',
    beneficiaryAddress2: '',
    beneficiaryBankCode: 'CENAIDJA',
    beneficiaryName: 'Panji Samudra',
    currency: 'IDR', // e.g., “IDR” 
    amount: '150000000',
    remark: 'Test rtgs', // Recommended for the reconciliation purpose
    chargingType: 'OUR'
  });
  return res;
};

Inquiry Interbank Account

// return as Promise of Object
const inquiryInterbankAccount = async () => {
  const res = rdf.inquiryInterbankAccount({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    accountNumber: '0115476117',
    beneficiaryBankCode: '013',
    beneficiaryAccountNumber: '01300000'
  });
  return res;
};

Payment Using Interbank

// return as Promise of Object
const paymentUsingInterbank = async () => {
  const res = rdf.paymentUsingInterbank({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    accountNumber: '0115476117',
    beneficiaryAccountNumber: '3333333333',
    beneficiaryAccountName: 'KEN AROK', // Get from Inquiry Interbank Account
    beneficiaryBankCode: '014',
    beneficiaryBankName: 'BANK BCA', // Get from Inquiry Interbank Account
    amount: '15000'
  });
  return res;
};

2.2.E RDN

Create RDN class object

import { BNIClient, Rdn } from 'bni-nodejs';
// const { BNIClient, Rdn } = require('bni-nodejs'); // legacy way

// Create Client instance
const client = new BNIClient({
  env: 'sandbox', // dev, sandbox or prod
  clientId: '{your-client-id}',
  clientSecret: '{your-client-secret}',
  apiKey: '{your-api-key}',
  apiSecret: '{your-api-secret}',
  appName: '{your-app-name}'
});

const rdn = new Rdn(client);

Available methods for RDN class

Face Recognition

// return as Promise of Object
const faceRecognition = async () => {
  const res = await rdn.faceRecognition({
    companyId: "SANDBOX",
    parentCompanyId: "STI_CHS", //optional
    firstName: "MOHAMMAD", //optional
    middleName: "BAQER", //optional
    lastName: "ZALQAD",
    idNumber: "0141111121260118", //Identity Number (KTP only)
    birthDate: "29-09-2021",
    birthPlace: "BANDUNG",
    gender: "M", //“M” or “F”
    cityAddress: "Bandung",
    stateProvAddress: "Jawa Barat",
    addressCountry: "ID", //e.g.: “ID”
    streetAddress1: "bandung",
    streetAddress2: "bandung",
    postCodeAddress: "40914",
    country: "ID", //e.g.: “ID”
    selfiePhoto: "29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuP", //Base64 encoded selfie photo
  });
  return res;
};

Register Investor

// return as Promise of Object
const registerInvestor = async () => {
  const res = await rdn.registerInvestor({
    companyId: "SANDBOX",
    parentCompanyId: "STI_CHS",
    uuidFaceRecog: "492F33851D634CFB", //RequestUuid successed value from Face Recognition API (KYC valid)
    title: "01",
    firstName: "Agus", //optional
    middleName: "", //optional
    lastName: "Saputra",
    optNPWP: "1", //“1” or “0” (Default “1”)
    NPWPNum: "001058893408123",
    nationality: "ID", //e.g.: “ID”
    domicileCountry: "ID", //e.g.: “ID”
    religion: "2",
    birthPlace: "Semarang",
    birthDate: "14081982",
    gender: "M", //“M” or “F”
    isMarried: "S",
    motherMaidenName: "Dina Maryati",
    jobCode: "01",
    education: "7",
    idType: "01",
    idNumber: "4147016201959998", //Identity Number (KTP only)
    idIssuingCity: "Jakarta Barat",
    idExpiryDate: "26102099", //ddMMyyyy
    addressStreet: "Jalan Mawar Melati",
    addressRtRwPerum: "003009Sentosa",
    addressKel: "Cengkareng Barat",
    addressKec: "Cengkareng/Jakarta Barat",
    zipCode: "11730",
    homePhone1: "0214", //Area code, e.g. 021 (3 - 4 digit) If not exist, fill with “9999”
    homePhone2: "7459", //Number after area code (min 4 digit) If not exist, fill with “99999999”
    officePhone1: "", //(Optional) Area code, e.g. 021
    officePhone2: "", //(Optional)  Number after area code
    mobilePhone1: "0812", //Operator code, e.g. 0812 (4 digit) If not exist, fill with “0899”
    mobilePhone2: "12348331", //Number after operator code (min 6 digit) If not exist, fill with “999999”
    faxNum1: "", //(Optional) Area code, e.g. 021
    faxNum2: "", //(Optional) Number after area code
    email: "agus.saputra@gmail.com",
    monthlyIncome: "8000000",
    branchOpening: "0259",
    institutionName: "PT. BNI SECURITIES",
    sid: "IDD280436215354",
    employerName: "Salman", //Employer Name / Company Name
    employerAddDet: "St Baker", //Employer street address / home street address
    employerAddCity: "Arrandelle", //Employer city address / home city address
    jobDesc: "Pedagang",
    ownedBankAccNo: "0337109074",
    idIssuingDate: "10122008",
  });
  return res;
};

Check SID

// return as Promise of Object
const checkSID = async () => {
  const res = await rdn.checkSID({
  companyId: 'SANDBOX', // Registered participan id from KSEI
  parentCompanyId: 'STI_CHS',
  participantId: 'NI001', // Institution code, e.g.: "NI001"
  sidNumber: 'IDD1206M9527805', // SID number, e.g.: "IDD12345002"
  accountNumberOnKsei: 'NI001CRKG00146', 
  branchCode: '0259',
  ack: 'Y' // N = send data to KSEI & Y = check previous checkSID status
  });
  return res;
};

Register Investor Account

// return as Promise of Object
const registerInvestorAccount = async () => {
  const res = await rdn.registerInvestorAccount({
    companyId: ' NI001',
    parentCompanyId: 'KSEI', // optional
    cifNumber: '9100749959',
    currency: 'IDR', // “IDR” or “USD”
    openAccountReason: '2',
    sourceOfFund: '1',
    branchId: '0259',
    bnisId: '19050813401', // Value = requestUuid.
    sre: 'NI001CX5U00109' // No. Sub rekening efek, e.g: “NI001CX5U00109”
  });
  return res;
};

Send Data Static

// return as Promise of Object
const sendDataStatic = async () => {
  const res = await rdn.sendDataStatic({
    companyId: 'SPS App', // Registered participan id from KSEI
    parentCompanyId: 'KSEI', // optional
    participantCode: 'NI001', // Institution code, e.g: “NI001”
    participantName: 'PT. BNI SECURITIES', // Institution name, e.g.: “PT. BNI SECURITIES”
    investorName: 'SUMARNO', // Investor name
    investorCode: 'IDD250436742277', // Investor code, e.g.: "IDD250436742277"
    investorAccountNumber: 'NI001042300155', // Investor account number, e.g.: "NI001042300155"
    bankAccountNumber: '242345393', // e.g.: "242345393"
    activityDate: '20180511', // e.g: "yyyyMMdd"
    activity: 'O' // (O)pening / (C)lose / (B)lock Account / (U)nblock Account
  });
  return res;
};

Inquiry Account Info

// return as Promise of Object
const inquiryAccountInfo = async () => {
  const res = rdn.inquiryAccountInfo({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    accountNumber: '0115476117'
  });
  return res;
};

Inquiry Account Balance

// return as Promise of Object
const inquiryAccountBalance = async () => {
  const res = rdn.inquiryAccountBalance({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    accountNumber: '0115476117'
  });
  return res;
};

Inquiry Account History

// return as Promise of Object
const inquiryAccountHistory = async () => {
  const res = rdn.inquiryAccountHistory({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    accountNumber: '0115476117'
  });
  return res;
};

Payment Using Transfer

// return as Promise of Object
const paymentUsingTransfer = async () => {
  const res = rdn.paymentUsingTransfer({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    accountNumber: '0115476117',
    beneficiaryAccountNumber: '0115471119',
    currency: 'IDR', // e.g., “IDR”
    amount: '11500',
    remark: 'Test RDN' // Recommended for the reconciliation purpose
  });
  return res;
};

Inquiry Payment Status

// return as Promise of Object
const inquiryPaymentStatus = async () => {
  const res = rdn.inquiryPaymentStatus({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    requestedUuid: 'E8C6E0027F6E429F'
  });
  return res;
};

Payment Using Clearing

// return as Promise of Object
const paymentUsingClearing = async () => {
  const res = rdn.paymentUsingClearing({
    companyId: 'SANDBOX',
    parentCompanyId: 'STI_CHS', // optional
    accountNumber: '0115476117', // Transfer/payment provider account number
    beneficiaryAccountNumber: '3333333333', // Transfer/payment receiver account number
    beneficiaryAddress1: 'Jakarta', // Receiver address, e.g.: "Jakarta"
    beneficiaryAddress2: '', // optional
    beneficiaryBankCode: '140397',
    beneficiaryName: 'Panji Samudra', // Receiver name
    currency: 'IDR', // e.g., “IDR”
    amount: '15000', // Total payment/transfer
    remark: 'Test kliring', // //(optional)Recommended for the reconciliation purpose
    chargingType: 'OUR'
  });
  return res;
};

Payment Using RTGS

// return as Promise of Object
const paymentUsingRTGS = async () => {
  const res = rdn.paymentUsingRTGS({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    accountNumber: '0115476117',
    beneficiaryAccountNumber: '3333333333',
    beneficiaryAddress1: 'Jakarta',
    beneficiaryAddress2: '',
    beneficiaryBankCode: 'CENAIDJA',
    beneficiaryName: 'Panji Samudra',
    currency: 'IDR', // e.g., “IDR” 
    amount: '150000000',
    remark: 'Test rtgs', // Recommended for the reconciliation purpose
    chargingType: 'OUR'
  });
  return res;
};

Inquiry Interbank Account

// return as Promise of Object
const inquiryInterbankAccount = async () => {
  const res = rdn.inquiryInterbankAccount({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    accountNumber: '0115476117',
    beneficiaryBankCode: '013',
    beneficiaryAccountNumber: '01300000'
  });
  return res;
};

Payment Using Interbank

// return as Promise of Object
const paymentUsingInterbank = async () => {
  const res = rdn.paymentUsingInterbank({
    companyId: 'NI001',
    parentCompanyId: 'KSEI', // optional
    accountNumber: '0115476117',
    beneficiaryAccountNumber: '3333333333',
    beneficiaryAccountName: 'KEN AROK', // Get from Inquiry Interbank Account
    beneficiaryBankCode: '014',
    beneficiaryBankName: 'BANK BCA', // Get from Inquiry Interbank Account
    amount: '15000'
  });
  return res;
};

2.2.F Ecollection

Create Ecollection class object

import { BNIClient, Ecollection } from 'bni-nodejs';
// const { BNIClient, Ecollection } = require('bni-nodejs'); // legacy way

// Create Client instance
const client = new BNIClient({
  env: 'dev', // dev, sandbox or prod
  clientId: '{your-client-id}',
  clientSecret: '{your-client-secret}',
  apiKey: '{your-api-key}',
  apiSecret: '{your-api-secret}',
  appName: '{your-app-name}'
});

const ecollection = new Ecollection(client);

Available methods for Ecollection class

Create Billing

// return as Promise of Object
const createBilling = await ecollection.createBilling({
    customerName: "Yories Yolanda", //mandatory
    description: "your description", //optional
    trxAmount: "1000", //mandatory except billing type is "o" (open payment)
    billingType: "o", //mandatory. Credit: o,c,i,m,n,x. Debit: p,j,d,z
    customerEmail: "mail@example.com", //optional
    customerPhone: "08111222333", //optional
    datetimeExpired: "2023-12-31T23:59:59+07:00", //optional
    trxId: "no-20230615-7", //mandatory
    virtualAccount: "" //optional, if empty then autogenerated
});

Inquiry Billing

// return as Promise of Object
const inquiryBilling = await ecollection.inquiryBilling({
    trxId: "no-20230615-7", //mandatory
});

Inactive Billing

// return as Promise of Object
const inactiveBilling = await ecollection.inactiveBilling({
    trxId: "no-20230615-7", //mandatory
    virtualAccount: "1122334455", //mandatory
});

Update Billing

// return as Promise of Object
const updateBilling = await ecollection.updateBilling({
    customerName: "Yories Yolanda", //mandatory
    description: "your description", //optional
    trxAmount: "1000", //mandatory except billing type is "o" (open payment)
    customerEmail: "mail@example.com", //optional
    customerPhone: "08111222333", //optional
    datetimeExpired: "2023-12-31T23:59:59+07:00", //optional
    trxId: "no-20230615-7", //mandatory
    virtualAccount: "" //optional, if empty then autogenerated
});

2.2.G BNI Move Digiloan

Create BNI Move class object

import { BNIClient, BNIMove } from 'bni-nodejs';
// const { BNIClient, BNIMove } = require('bni-nodejs'); // legacy way

// Create Client instance
const client = new BNIClient({
  env: 'sandbox', // dev, sandbox or prod
  clientId: '{your-client-id}',
  clientSecret: '{your-client-secret}',
  apiKey: '{your-api-key}',
  apiSecret: '{your-api-secret}'
  appName: '{your-app-name}' // optional
});

const bniMove = new BNIMove(client);

Available methods for BNI Move class

Prescreening

// return as Promise of Object
const prescreening = async () => {
  const res = await bniMove.prescreening({
    kodeMitra: 'BNI',
    npp: '', // optional
    namaLengkapKtp: 'Muhammad Haikal Madani',
    noKtp: '3174052209980002',
    noHandphone: '085921658045',
    alamatUsaha: 'jakarta',
    provinsiUsaha: '06',
    kotaUsaha: '143',
    kecamatanUsaha: '1074',
    kelurahanUsaha: '4254',
    kodePosUsaha: '11450',
    sektorEkonomi: '2',
    totalPenjualan: 50000000,
    jangkaWaktu: '12',
    jenisPinjaman: '1',
    maximumKredit: 50000000,
    jenisKelamin: '1',
    tanggalLahir: '1998-10-07',
    subSektorEkonomi: '050111',
    deskripsi: 'Usaha Ternak Perikanan',
    email: 'muhammadhaikalmadani@mail.com' // optional
  });
  return res;
};

Save Image

// return as Promise of Object
const saveImage = async () => {
  const res = await bniMove.saveImage({
    Id: 'MJO2024022000004',
    deskripsi: 'Foto Identitas KTP',
    jenisDokumen: 'A03',
    namaFile: 'Foto KTP',
    extensionFile: 'png',
    dataBase64: '{image-file-base64}'
  });
  return res;
};

Get help

0.1.21

9 months ago

0.1.20

11 months ago

0.1.17

12 months ago

0.1.18

12 months ago

0.1.19

12 months ago

0.1.16

1 year ago

0.1.13

1 year ago

0.1.14

1 year ago

0.1.15

1 year ago

0.1.12

2 years ago

0.1.12-hotfix

2 years ago

0.1.12-b

2 years ago

0.1.11

2 years ago

0.1.10

2 years ago

0.1.8

2 years ago

0.1.7

2 years ago

0.1.9

2 years ago

0.1.6

2 years ago

0.1.2

3 years ago

0.1.4

3 years ago

0.1.3

3 years ago

0.1.5

3 years ago

0.1.1

3 years ago

0.1.0

3 years ago