investec-api
v2.0.0
Published
A Node module to interact with Investec's Open API
Readme
investec-api
An NPM module to interact with Investec's Open API
Usage
(This module has types, so intellisense is your friend).
Set up client
import { Client } from "investec-api";
const client = await Client.create(id, secret, apiKey, baseUrl?);| Param | Required | Description |
| ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| id | true | Your API key ID issued by Investec. |
| secret | true | The corresponding API key secret. |
| apiKey | true | The corresponding API key. |
| baseUrl | false | Optional base URL that will be used when interacting with the Investec Open API. If none is passed, then "https://openapi.investec.com" is used. |
This creates an access token that the client will use to interact with the API.
If you start to get errors about the token no longer being valid, simply call:
await client.authenticate();Response validation
Every API response is checked against a zod schema derived from Investec's OpenAPI specs, since the spec and the live API have been known to drift.
const client = await Client.create(id, secret, apiKey, baseUrl, {
validation: "warn", // "warn" (default) | "strict" | "off"
onValidationWarning: (endpoint, issues) => {
// default logs to console.warn
},
});warn(default): mismatches are reported (endpoint + field path) and the data is returned as-is.strict: mismatches throw anInvestecValidationError.off: no validation.
Unknown extra fields never warn; only missing or wrongly-typed known fields do.
Accounts (Private Banking)
List accounts
const accounts = await client.getAccounts();This returns an array of Account objects.
Breaking change:
getAccountsno longer takes a realm. Business (CIB) accounts are a separate domain with their own shape and endpoints; useclient.getBusinessAccounts()instead.
Account functions
On an Account object, you can:
Get Balance
const balance = await account.getBalance();Get transactions
const transactions = await account.getTransactions({
fromDate: string;
toDate: string;
transactionType: string;
includePending: boolean;
});Get pending transactions
const pendingTransactions = await account.getPendingTransactions();Get documents
const documents = await account.getDocuments("2023-04-01", "2023-06-01");Get document (PDF)
const pdf = await account.getDocument(documentType, documentDate); // BufferTransfer
const transfer = await account.transfer(
[
{
account: Account;
amount: number;
myReference: string;
theirReference: string;
}
],
profileId? // optional; defaults to the account's own profileId
);Payments
const payment = await account.pay([
{
beneficiary: InvestecBeneficiary;
myReference: string;
theirReference: string;
amount: number;
// optional, for payments requiring authorisation
// (ids come from client.getAuthorisationSetupDetails):
authorisation?: { aId?: string; bId?: string; periodId?: string };
fasterPayment?: boolean;
}
]);Beneficiaries
List beneficiaries
const beneficiaries = await client.getBeneficiaries();List beneficiary categories
const beneficiaryCategories = await client.getBeneficiaryCategories(profileId?);The live API requires a profileId (the spec doesn't document it); when omitted, the default profile is looked up and used.
Profiles
List profiles
const profiles = await client.getProfiles();List profile accounts
const accounts = await client.getProfileAccounts(profileId);Get authorisation setup details
const details = await client.getAuthorisationSetupDetails(profileId, accountId);List profile beneficiaries
const beneficiaries = await client.getProfileBeneficiaries(profileId, accountId);Business Banking (CIB)
List business accounts
const accounts = await client.getBusinessAccounts(); // BusinessAccount[]Business account transactions
const transactions = await businessAccount.getTransactions({
fromDate?: string;
toDate?: string;
page?: number;
});Initiate payment
Takes a PAIN.001 (ISO 20022) remittance payload and an idempotency key.
const { paymentId } = await client.initiateBusinessPayment(
{
format: "XMLPain NEWSTDD",
payload: {
body: {
content: base64EncodedPain001File,
contentEncoding: "base64",
},
},
},
idempotencyKey
);Payment status
const status = await client.getBusinessPaymentStatus(paymentId);List companies
const companies = await client.getBusinessCompanies();Cards
List cards
const cards = await client.getCards();Create virtual card
const virtualCard = await Card.createVirtualCard(client, {
accountNumber: string;
embossName: string;
embossName2?: string;
});Get Card countries
const countries = await Card.getCountries();Get Card currencies
const countries = await Card.getCurrencies();Get Card merchants
const countries = await Card.getMerchants();Card functions
On a Card object, you can:
Get card detail
const detail = await card.getDetail();Get card detail with sensitive information
Requires an RSA (2048) key pair; the API encrypts card number, expiry date and CVV with your public key (returned in ExtendedDetails).
const detail = await card.getSensitiveDetail({
keyId: number;
identifier: string;
appName: string;
modulus: string;
exponent: string;
});Toggle programmable feature
const enabled = await card.toggleProgrammableFeature(true | false);Get Saved code
const savedCode = await card.getSavedCode();Get published code
const publishedCode = await card.getPublishedCode();Update saved code
const updatedCode = await card.updateSavedCode(code: string);Publish saved code
const publishedCode = await card.publishSavedCode(codeId: string, code?: string);Simulate functions execution
const execution = await card.simulateFunctionExecution({
code: string;
centsAmount: string;
currencyCode: string;
merchantCode: number;
merchantCity: string;
countryCode: string;
});Get previous executions
const executions = await card.getExecutions();List environment variables
const variables = await card.getEnvironmentVariables();Update environment variables
const variables = await card.updateEnvironmentVariables({...});Investec Programmable Banking Docs
You can read more about Investec's Programmable Banking here.
This library is merely an interface to the above.
