OpenAPI definition (v0)

Download OpenAPI specification:Download

Introduction

Cache is a white-label fund manager that launches and operates digital investment products for partner companies.

When a Fund has been established, partner companies use Cache’s API to provide instructions relating to the Fund in real time.

Cache API services

Cache provides seven core API services that you can use to operate your Fund:

Investment Options retrieves the investment options as part of the investment scheme

Investors manages the records relating to your investors including creating, updating and retrieving investor details and verifying an investor for KYC purposes.

Subscriptions manages the subscription details of investors and the payments and fees associated with their subscription (for products with subscription fees only).

Instructions manages the transaction instructions that have been provided including applications, redemption requests and switch requests.

Transactions manages the historical transaction information relating to your Fund and retrieve transaction fees that will apply to transaction instructions.

Invoices manages invoice details and amounts using a reference code (for products where applications are funded by invoice).

Tax manages tax statements relating to the fund

Structure

The Cache’s REST APIs have resource-oriented URLs and use HTTP response codes to indicate API errors.

Cache supports cross-origin resource sharing, allowing you to interact securely with our API from a client-side web application.

Authentication

Authentication & authorization related operations

Login

Cache APIs support token-based authorization via the Authorization request header. The Authentication endpoint is used to retrieve an access token. After the access token is obtained, it must be inserted into the Authorization header for all requests.

Request Body schema: application/json
apiKey
required
string
apiSecret
required
string

Responses

Request samples

Content type
application/json
{
  • "apiKey": "string",
  • "apiSecret": "string"
}

Response samples

Content type
application/hal+json
"jwt token"

Refresh token

Access tokens expire after 5 minutes, but can be refreshed within 30 minutes of issue.

Responses

Response samples

Content type
application/hal+json
"jwt token"

Individual

Endpoints to manage individual stakeholders, including personal identification details, contact information, residential addresses, tax residency status and other information. These APIs enable the complete lifecycle management of individual investors.

Update individual details

Updates the information of an existing individual stakeholder identified by their unique individual number

An individual can be updated either via the API or by the Operations team through the Admin portal.

When the Operations team updates an individual in the admin portal, the system publishes the following webhook events:

  1. individual.updated.success → triggered when individual update is successful See payload example:
    {
      "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
      "type": "individual.updated",
      "publishedAt": "2021-09-13T07:44:44.712943Z",
      "title": "Individual Updated",
      "body": {
       "individualNumber": "I1",
       "externalIndividualId": "1001",
       "stakeholderType" : INDIVIDUAL,
       "status" : ACTIVE,
       "source" : ADMIN_PORTAL
    }
    
Authorizations:
BearerAuth
path Parameters
individualNumber
required
string
Request Body schema: application/json
email
string
phoneNumber
string
Array of objects (CreateAddressDto) unique
externalIndividualId
string
firstName
required
string^[a-zA-Zàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýż...

Letters, spaces and following characters; +@!^$&'()*-:;=?.#_,[]/\

lastName
required
string^[a-zA-Zàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýż...

Letters, spaces and following characters; +@!^$&'()*-:;=?.#_,[]/\

middleName
string^[a-zA-Zàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýż...

Letters, spaces and following characters; +@!^$&'()*-:;=?.#_,[]/\

tfn
string
status
string
Enum: "ACTIVE" "INACTIVE"
dateOfBirth
string <date>
foreignTaxResident
boolean
Array of objects (SaveForeignTaxResidentDto) unique

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "phoneNumber": "string",
  • "addresses": [
    ],
  • "externalIndividualId": "string",
  • "firstName": "string",
  • "lastName": "string",
  • "middleName": "string",
  • "tfn": "string",
  • "status": "ACTIVE",
  • "dateOfBirth": "2019-08-24",
  • "foreignTaxResident": true,
  • "foreignTaxResidentDetails": [
    ]
}

Search individuals

Retrieves a paginated list of individuals matching the specified search criteria including name, status, and verification details with other details.

Authorizations:
BearerAuth
query Parameters
required
object (IndividualsPredicate)

Responses

Create individual stakeholder

Creates a new individual stakeholder record in the system with the provided personal and identification details

An individual can be created either via the API or by the Operations team through the Admin portal.

When the Operations team creates an individual, the system publishes the following webhook events:

  1. individual.created.success → triggered when individual creation is successful See payload example:
    {
      "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
      "type": "individual.created",
      "publishedAt": "2021-09-13T07:44:44.712943Z",
      "title": "Individual Created",
      "body": {
       "individualNumber": "I1",
       "externalIndividualId": "1001",
       "stakeholderType" : INDIVIDUAL,
       "status" : ACTIVE,
       "source" : ADMIN_PORTAL
     }
    
Authorizations:
BearerAuth
Request Body schema: application/json
externalIndividualId
string
firstName
required
string^[a-zA-Zàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýż...

Letters, spaces and following characters; +@!^$&'()*-:;=?.#_,[]/\

lastName
required
string^[a-zA-Zàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýż...

Letters, spaces and following characters; +@!^$&'()*-:;=?.#_,[]/\

middleName
string^[a-zA-Zàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýż...

Letters, spaces and following characters; +@!^$&'()*-:;=?.#_,[]/\

tfn
string
dateOfBirth
string <date>
email
string
Array of objects (CreateAddressDto) unique
phoneNumber
string
foreignTaxResident
boolean
Array of objects (SaveForeignTaxResidentDto) unique

Responses

Request samples

Content type
application/json
{
  • "externalIndividualId": "string",
  • "firstName": "string",
  • "lastName": "string",
  • "middleName": "string",
  • "tfn": "string",
  • "dateOfBirth": "2019-08-24",
  • "email": "string",
  • "addresses": [
    ],
  • "phoneNumber": "string",
  • "foreignTaxResident": true,
  • "foreignTaxResidentDetails": [
    ]
}

Company

Endpoints for managing company stakeholders, including company registration details, business structure, registered addresses, and other information. These APIs facilitate comprehensive company entity management.

Update an existing company's information

Updates the details of an existing company identified by its unique company number. Allows modification of company information such as contact details, address, and other relevant data.

A company can be updated either via the API or by the Operations team through the Admin portal.

When the Operations team updates a company, the system publishes the following webhook events:

  1. company.updated.success → triggered when company update is successful See payload example:
    {
     "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
     "type": "company.updated.success",
     "publishedAt": "2021-09-13T07:44:44.712943Z",
     "title": "Company Updated Successfully",
     "body": {
         "companyId": 51,
         "companyName": "Some Company",
         "companyNumber": "C51",
         "status": "UPDATED"
     }
    }
    
Authorizations:
BearerAuth
path Parameters
companyNumber
required
string
Request Body schema: application/json
email
string
phoneNumber
string
Array of objects (CreateAddressDto) unique
externalCompanyId
string
companyName
required
string
abn
string
acn
string
object (ExchangeDto)
object (ApplicationIdDto)
tfn
string
status
string
Enum: "ACTIVE" "INACTIVE"
foreignTaxResident
boolean
Array of objects (SaveForeignTaxResidentDto) unique

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "phoneNumber": "string",
  • "addresses": [
    ],
  • "externalCompanyId": "string",
  • "companyName": "string",
  • "abn": "string",
  • "acn": "string",
  • "exchange": {
    },
  • "verification": {
    },
  • "tfn": "string",
  • "status": "ACTIVE",
  • "foreignTaxResident": true,
  • "foreignTaxResidentDetails": [
    ]
}

Search companies with advanced filtering options

Executes an advanced search across the company database with comprehensive filtering capabilities. Supports filtering by multiple criteria including company name, verification status, registration details, and other attributes. Returns paginated results that can be sorted based on specified parameters.

Authorizations:
BearerAuth
query Parameters
required
object (CompaniesPredicate)

Responses

Create a new company record with basic information

Creates a new company record with fundamental details such as company name, registration number, and contact information. The company is initially created with a 'NOT_VERIFIED' status.

A company can be created either via the API or by the Operations team through the Admin portal.

When the Operations team creates a company, the system publishes the following webhook events:

  1. company.created.success → triggered when company creation is successful See payload example:
    {
     "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
     "type": "company.created.success",
     "publishedAt": "2021-09-13T07:44:44.712943Z",
     "title": "Company Created Successfully",
     "body": {
         "companyId": 51,
         "companyName": "Some Company",
         "companyNumber": "C51",
         "status": "NOT_VERIFIED"
     }
    }
    
Authorizations:
BearerAuth
Request Body schema: application/json
externalCompanyId
string
companyName
required
string
acn
string[0-9]{9}
abn
string
Array of objects (CreateAddressDto) unique
object (ExchangeDto)
tfn
string
phoneNumber
string
email
string
object (ApplicationIdDto)
foreignTaxResident
boolean
Array of objects (SaveForeignTaxResidentDto) unique

Responses

Request samples

Content type
application/json
{
  • "externalCompanyId": "string",
  • "companyName": "string",
  • "acn": "string",
  • "abn": "string",
  • "addresses": [
    ],
  • "exchange": {
    },
  • "tfn": "string",
  • "phoneNumber": "string",
  • "email": "string",
  • "verification": {
    },
  • "foreignTaxResident": true,
  • "foreignTaxResidentDetails": [
    ]
}

Retrieve all stakeholders for a specific company

Returns a complete list of all stakeholders associated with a company identified by its company number. The response provides comprehensive information for each stakeholder, including their roles (e.g., director, shareholder), ownership percentages, verification status, and other relevant details.

Authorizations:
BearerAuth
path Parameters
companyNumber
required
string

Responses

Add new stakeholders to an existing company

Registers new stakeholders (directors, shareholders, or key personnel) for a company identified by its unique company number. Important: This operation is only permitted when the company's verification status is either 'NOT_VERIFIED' or 'VERIFICATION_FAILED'. To maintain data integrity, stakeholder additions are blocked once a company's status becomes 'VERIFIED'.

A company can be updated either via the API or by the Operations team through the Admin portal.

When the Operations team updates a company, the system publishes the following webhook events:

  1. company.updated.success → triggered when company update is successful See payload example:
    {
     "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
     "type": "company.updated.success",
     "publishedAt": "2021-09-13T07:44:44.712943Z",
     "title": "Company Updated Successfully",
     "body": {
         "companyId": 51,
         "companyName": "Some Company",
         "companyNumber": "C51",
         "status": "UPDATED"
     }
    }
    
Authorizations:
BearerAuth
path Parameters
companyNumber
required
string
Request Body schema: application/json
required
Array of objects (CreateCompanyStakeholderDto) unique

Responses

Request samples

Content type
application/json
{
  • "stakeholders": [
    ]
}

Delete a specific stakeholder from a company

Permanently removes a stakeholder from a company using the company number and stakeholder ID. This operation is restricted to companies with 'NOT_VERIFIED' or 'VERIFICATION_FAILED' status. For data integrity purposes, stakeholder removal is not permitted once a company becomes 'VERIFIED'. Warning: This action is irreversible and the stakeholder's information cannot be recovered after deletion.

A company can be updated either via the API or by the Operations team through the Admin portal.

When the Operations team updates a company, the system publishes the following webhook events:

  1. company.updated.success → triggered when company update is successful See payload example:
    {
     "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
     "type": "company.updated.success",
     "publishedAt": "2021-09-13T07:44:44.712943Z",
     "title": "Company Updated Successfully",
     "body": {
         "companyId": 51,
         "companyName": "Some Company",
         "companyNumber": "C51",
         "status": "UPDATED"
     }
    }
    
Authorizations:
BearerAuth
path Parameters
companyNumber
required
string
companyStakeholderId
required
integer <int64>

Responses

Trust

Endpoints to manage trust entities as stakeholders, including trust deed information, trustee details (both individual and corporate),and other information. These APIs support the complete administration of trust entity management.

Update an existing trust

Updates details of an existing Trust identified by trust number. Allows modification of trust information such as name, type, and other mutable fields. Requires valid trust number for identification.

A trust can be updated either via the API or by the Operations team through the Admin portal.

When the Operations team updates a trust, the system publishes the following webhook events:

  1. trust.updated.success → triggered when trust update is successful See payload example:
    {
      "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
      "type": "trust.updated",
      "publishedAt": "2021-09-13T07:44:44.712943Z",
      "title": "Trust Updated",
      "body": {
       "trustNumber": "T1",
       "externalCompanyId": "1001",
       "stakeholderType" : TRUST
       "status" : ACTIVE,
       "source" : ADMIN_PORTAL
     }
    }
    
Authorizations:
BearerAuth
path Parameters
trustNumber
required
string
Request Body schema: application/json
email
string
phoneNumber
string
Array of objects (CreateAddressDto) unique
externalTrustId
string
trustName
required
string
abn
string
tfn
string
status
string
Enum: "ACTIVE" "INACTIVE"
object (ApplicationIdDto)
foreignTaxResident
boolean
Array of objects (SaveForeignTaxResidentDto) unique

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "phoneNumber": "string",
  • "addresses": [
    ],
  • "externalTrustId": "string",
  • "trustName": "string",
  • "abn": "string",
  • "tfn": "string",
  • "status": "ACTIVE",
  • "verification": {
    },
  • "foreignTaxResident": true,
  • "foreignTaxResidentDetails": [
    ]
}

Search trusts

Search and retrieve paginated list of trusts based on specified criteria. Supports filtering by trust name, type, status, creation date, and other attributes. Results are paginated for efficient data retrieval.

Authorizations:
BearerAuth
query Parameters
required
object (TrustsPredicate)

Responses

Create a new trust record

Creates a new Trust record in the system with the provided trust details including name, type, and other relevant information. Returns comprehensive trust information including generated trust number.

A trust can be created either via the API or by the Operations team through the Admin portal.

When the Operations team creates a trust, the system publishes the following webhook events:

  1. trust.created.success → triggered when trust creation is successful See payload example:
    {
      "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
      "type": "trust.created",
      "publishedAt": "2021-09-13T07:44:44.712943Z",
      "title": "Trust Created",
      "body": {
       "trustNumber": "T1",
       "externalTrustId": "1001",
       "stakeholderType" : TRUST,
       "status" : ACTIVE,
       "source" : ADMIN_PORTAL
     }
    }
    
Authorizations:
BearerAuth
Request Body schema: application/json
externalTrustId
string
trustName
required
string
abn
string
tfn
string
email
string
phoneNumber
string
object (ApplicationIdDto)
foreignTaxResident
boolean
Array of objects (SaveForeignTaxResidentDto) unique
Array of objects (CreateAddressDto) unique

Responses

Request samples

Content type
application/json
{
  • "externalTrustId": "string",
  • "trustName": "string",
  • "abn": "string",
  • "tfn": "string",
  • "email": "string",
  • "phoneNumber": "string",
  • "verification": {
    },
  • "foreignTaxResident": true,
  • "foreignTaxResidentDetails": [
    ],
  • "addresses": [
    ]
}

Get trust stakeholders

Retrieves a complete list of stakeholders associated with the specified trust. The response includes detailed information about each stakeholder including their role, ownership percentage, and verification status.

Authorizations:
BearerAuth
path Parameters
trustNumber
required
string

Responses

Add stakeholders to a trust

Register new stakeholders for a specific trust using its trust number. Allows multiple stakeholders to be added in a single request. Each stakeholder record includes their role, ownership percentage, and personal details.

A trust can be updated either via the API or by the Operations team through the Admin portal.

When the Operations team updates a trust, the system publishes the following webhook events:

  1. trust.updated.success → triggered when trust update is successful See payload example:
    {
      "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
      "type": "trust.updated",
      "publishedAt": "2021-09-13T07:44:44.712943Z",
      "title": "Trust Updated",
      "body": {
       "trustNumber": "T1",
       "externalCompanyId": "1001",
       "stakeholderType" : TRUST
       "status" : ACTIVE,
       "source" : ADMIN_PORTAL
     }
    }
    
Authorizations:
BearerAuth
path Parameters
trustNumber
required
string
Request Body schema: application/json
required
Array of objects (CreateTrustStakeholderDto) unique

Responses

Request samples

Content type
application/json
{
  • "stakeholders": [
    ]
}

Remove stakeholder from trust

Removes association between a stakeholder and a Trust. Requires trust number and stakeholder ID. Operation will be rejected if the Trust has been verified to maintain data integrity.

A trust can be updated either via the API or by the Operations team through the Admin portal.

When the Operations team updates a trust, the system publishes the following webhook events:

  1. trust.updated.success → triggered when trust update is successful See payload example:
    {
      "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
      "type": "trust.updated",
      "publishedAt": "2021-09-13T07:44:44.712943Z",
      "title": "Trust Updated",
      "body": {
       "trustNumber": "T1",
       "externalCompanyId": "1001",
       "stakeholderType" : TRUST
       "status" : ACTIVE,
       "source" : ADMIN_PORTAL
     }
    }
    
Authorizations:
BearerAuth
path Parameters
trustNumber
required
string
trustStakeholderId
required
integer <int64>

Responses

KYC & AML

The Know Your Client (KYC) and Anti-Money Laundering (AML) process is a legal requirement to verify user identities to assess their risk factors like money laundering, terrorism financing and other illegal or criminal activity. These APIs can be used to initiate verification of stakeholders, including Individuals, Companies, and Trusts.

Initiate KYC/AML verification process for stakeholders individuals, companies and trusts

Initiates the verification process for a stakeholder based on their type (INDIVIDUAL, COMPANY or TRUST) and unique stakeholder number.

The verification process includes:

  1. Creating a FundOps help centre ticket to manually verify Companies and Trusts
  2. Conducting background checks and company ownership structure verification
  3. Performing necessary KYC/AML compliance verifications
  4. Updating the stakeholder's verification status based on the verification results

The process may take time to complete. The response includes the current verification status and any additional requirements.

When verification is successful, the system publishes one of the following webhook events based on stakeholder type:

  1. kyc.trust.success → triggered when trust verification is successful See payload example:

    {
     "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
     "type": "kyc.trust.success",
     "publishedAt": "2021-09-13T07:44:44.712943Z",
     "title": "KYC Trust Success",
     "body": {
         "trustNumber": "T1",
         "externalTrustId": "1001",
         "stakeholderType" : "TRUST",
         "status" : "ACTIVE",
         "source" : "ADMIN_PORTAL"
     }
    }
    
  2. kyc.company.success → triggered when company verification is successful See payload example:

    {
     "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
     "type": "kyc.company.success",
     "publishedAt": "2021-09-13T07:44:44.712943Z",
     "title": "KYC Company Success",
     "body": {
         "companyNumber": "C1",
         "externalCompanyId": "1001",
         "stakeholderType" : "COMPANY",
         "status" : "ACTIVE",
         "source" : "ADMIN_PORTAL"
     }
    }
    
  3. kyc.individual.success → triggered when individual verification is successful See payload example:

    {
     "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
     "type": "kyc.individual.success",
     "publishedAt": "2021-09-13T07:44:44.712943Z",
     "title": "KYC Individual Success",
     "body": {
         "individualNumber": "I1",
         "externalIndividualId": "1001",
         "stakeholderType" : "INDIVIDUAL",
         "status" : "ACTIVE",
         "source" : "ADMIN_PORTAL"
     }
    }
    

    On verification failure, the system publishes one of the following webhook events:

    1. kyc.trust.failed
    2. kyc.company.failed
    3. kyc.individual.failed
Authorizations:
BearerAuth
path Parameters
stakeholderNumber
required
string
query Parameters
stakeholderType
required
string
Enum: "ACCOUNT" "INDIVIDUAL" "COMPANY" "TRUST"

Responses

Manually override stakeholder verification status

Administrative endpoint for authorized users to manually override the verification status of a stakeholder (INDIVIDUAL, COMPANY or TRUST).

This endpoint:

  1. Requires appropriate administrative authorization
  2. Updates verification status to VERIFIED
  3. Records verification date and timestamp
  4. Stores associated comments and reasons for the manual override
  5. Maintains an audit trail of the manual verification change including:
    • User who performed the override
    • Previous verification status
    • Timestamp of the change
    • Reason for manual override

Note:

  • This operation bypasses standard verification checks
  • Should only be used in exceptional circumstances
  • No webhook events are triggered for manual overrides
  • All changes are permanently logged for compliance purposes
Authorizations:
BearerAuth
path Parameters
stakeholderNumber
required
string
query Parameters
stakeholderType
required
string
Enum: "ACCOUNT" "INDIVIDUAL" "COMPANY" "TRUST"
Request Body schema: application/json
notes
required
string
verifiedBy
required
string

Responses

Request samples

Content type
application/json
{
  • "notes": "string",
  • "verifiedBy": "string"
}

Verify individual KYC

Initiates the Know Your Customer (KYC) verification process for an individual stakeholder and returns their current verification status along with detailed results. The verification requires the following mandatory information to be previously registered: first name, last name, date of birth, and complete residential address. The process validates the individual's identity against official databases and performs Anti-Money Laundering (AML) checks. The response includes verification status, timestamp, and any additional verification requirements.

An individual can be verified either via the API or by the Operations team through the Admin portal.

When the Operations team verified an individual, the system publishes the following webhook events:

  1. individual.verified.success → triggered when verification is successful See payload example:
    {
      "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
      "type": "kyc.individual.success",
      "publishedAt": "2021-09-13T07:44:44.712943Z",
      "title": "KYC Individual Success",
      "body": {
       "individualNumber": "I1",
       "externalIndividualId": "1001",
       "stakeholderType" : INDIVIDUAL,
       "status" : ACTIVE,
       "source" : KYC
     }
    }
    
Authorizations:
BearerAuth
path Parameters
individualNumber
required
string

Responses

Upload verification document for stakeholder

Uploads a document for stakeholder verification purposes as part of KYC/AML process. The system will document will be processed and verified by the system. Maximum file size: 20MB. Supported formats: PDF, JPG, PNG. The System will create a Help Centre ticket for verification tracking.

Authorizations:
BearerAuth
path Parameters
stakeholderNumber
required
string
query Parameters
required
object (UploadDocumentDto)

Responses

Generate company ownership structure via Simple KYC

Retrieves and generates a comprehensive ownership structure for a company through the Simple KYC API integration. The operation returns detailed information about shareholders, directors, and beneficial owners.

Since this process takes time to complete, the system generates and stores the ownership structure asynchronously. Once the process is finished, the system publishes webhook events to notify subscribers of the result:

  1. kyc.simple-kyc.success → triggered when Simple KYC processing is successful. See payload example:
{
    "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
    "type": "kyc.simple-kyc.success",
    "publishedAt": "2021-09-13T07:44:44.712943Z",
    "title": "Simple KYC Success",
    "body": {
        "companyId": 51,
        "companyName": "Some Company",
        "companyNumber": "C51",
        "companyAcn": "647382914",
        "status": "GENERATED"
    }
}
  1. kyc.simple-kyc.failed → triggered when Simple KYC processing fails. See payload example:
{
    "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
    "type": "kyc.simple-kyc.failed",
    "publishedAt": "2021-09-13T07:44:44.712943Z",
    "title": "Simple KYC Failed",
    "body": {
        "companyId": 51,
        "companyName": "Some Company",
        "companyNumber": "C51",
        "companyAcn": "647382914",
        "status": "GENERATED_FAIL"
    }
}

Notes:

  • Each API call to Simple KYC incurs charges according to their pricing structure.
Authorizations:
BearerAuth
path Parameters
companyNumber
required
string

Responses

Search companies in Simple KYC database

Performs a search in the Simple KYC database using various identifiers: company name, ABN (Australian Business Number), or ACN (Australian Company Number). The search functionality is case-insensitive and supports partial matching for company names, enabling flexible and comprehensive search results.

Authorizations:
BearerAuth
Request Body schema: application/json
companyName
string
acn
string
abn
string
valid
boolean

Responses

Request samples

Content type
application/json
{
  • "companyName": "string",
  • "acn": "string",
  • "abn": "string",
  • "valid": true
}

Accounts

For legacy customers who initially used Cache APIs with an Investor ID, the Investor ID and Account ID are identical. For new customers, only the Account ID should be used.

Force update verification status of an Account

Manually updates the verification status of an account. This endpoint should be used with caution and only in specific circumstances where automated verification processes need to be overridden. Requires appropriate authorization and will be audited for compliance purposes.

Authorizations:
BearerAuth
path Parameters
accountId
required
integer <int64>
Request Body schema: application/json
notes
required
string
verifiedBy
required
string

Responses

Request samples

Content type
application/json
{
  • "notes": "string",
  • "verifiedBy": "string"
}

Update Distribution Reinvestment Plan Status

Updates the Distribution Reinvestment Plan (DRP) status for a specific investment option within an account. The DRP allows automatic reinvestment of distributions back into the same investment option instead of receiving cash payments. This setting can be configured independently for each investment option associated with the account.

Authorizations:
BearerAuth
path Parameters
accountId
required
integer <int64>
investmentOptionId
required
integer <int64>
Request Body schema: application/json
drpvalue
required
number <double>

Responses

Request samples

Content type
application/json
{
  • "drpvalue": 0
}

Retrieve Account by ID

Retrieves detailed information about a specific non-individual account using its unique identifier. The response includes complete account details including stakeholders, verification status, and other relevant information.

Authorizations:
BearerAuth
path Parameters
accountId
required
integer <int64>

Responses

Update Account by account id

This endpoint updates the details of an existing Account.

Important rules and restrictions:

  • This endpoint cannot be used to update the details of Account Stakeholders.
  • If an Account has already been verified, the identity of the Stakeholders cannot be changed.
  • The following fields are never updatable:
    • Account Type
    • Date/Time of Register
    • Identity of the Stakeholders

If any of the above details are incorrect, a new Account must be created instead of updating the existing one.

An account can be updated either via the API or by the Operations team through the Admin portal.

When the Operations team updates an account, the system publishes the following webhook events:

  1. account.updated.success → triggered when account creation is successful See payload example:
    {
      "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
      "type": "account.updated",
      "publishedAt": "2021-09-13T07:44:44.712943Z",
      "title": "Account Updated",
      "body": {
       "accountId": "1",
       "externalAccountId": "1001",
       "status" : ACTIVE,
       "source" : ADMIN_PORTAL
     }
    }
    
Authorizations:
BearerAuth
path Parameters
accountId
required
integer <int64>
Request Body schema: application/json
email
string
phoneNumber
string
Array of objects (CreateAddressDto) unique
externalAccountId
string [ 0 .. 100 ] characters
tags
Array of strings unique

Responses

Request samples

Content type
application/json
{
  • "email": "string",
  • "phoneNumber": "string",
  • "addresses": [
    ],
  • "externalAccountId": "string",
  • "tags": [
    ]
}

Verify an Account by account id

This endpoint initiates the verification process for an account and all its stakeholders:

Verification Process:

  • Triggers Know Your Customer (KYC) verification for all individual stakeholders associated with the account

Verification Outcomes:

  • VERIFIED - All stakeholders successfully pass verification checks
  • VERIFICATION_FAILED - One or more stakeholders fail verification

The account's verification status is updated based on the collective result of all stakeholder verifications.

An account can be verified either via the API or by the Operations team through the Admin portal.

When the Operations team verifies an account, the system publishes the following webhook events:

  1. account.verified.success → triggered when account is verified. See payload example:
    {
      "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
      "type": "kyc.account.success",
      "publishedAt": "2021-09-13T07:44:44.712943Z",
      "title": "Account Verified",
      "body": {
       "accountId": "1",
       "externalAccountId": "1001",
       "status" : ACTIVE,
       "source" : ADMIN_PORTAL
     }
    }
    
  2. account.verified.failed → triggered when account is verification failed. See payload example:
{
   "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
   "type": "kyc.account.failed",
   "publishedAt": "2021-09-13T07:44:44.712943Z",
   "title": "Account Verification Failed",
   "body": {
       "accountId": "1",
       "externalAccountId": "1001",
       "status" : ACTIVE,
       "source" : ADMIN_PORTAL
     }
}
Authorizations:
BearerAuth
path Parameters
accountId
required
integer <int64>

Responses

Upload supporting documentation for account management

Uploads a new document for the specified account. Supported documents include bank account verification, identification documents, proof of address, and other account-related documentation. Documents must be in PDF, JPG, or PNG format with a maximum size of 20MB.

Authorizations:
BearerAuth
path Parameters
accountId
required
integer <int64>
query Parameters
required
object (UploadDocumentDto)

Responses

Create an Account

Creates a new non-individual account with the provided details. This endpoint allows you to set up various account types including Company, Trust, and other non-individual entities. The account types JOINT_HOLDING, INDIVIDUAL, COMPANY, TRUST, and MINOR will be automatically marked as VERIFIED if their account stakeholders are already VERIFIED

The following rules apply to Registered Holders and Beneficial Holders based on the Account Type:

Individual

  • Exactly 1 Registered Holder, which must be Stakeholder Type = Individual.
  • No Beneficial Holder.

Minor

  • Exactly 1 Registered Holder, which must be Stakeholder Type = Individual.
  • Exactly 1 Beneficial Holder, which must be Stakeholder Type = Individual.

Company

  • Exactly 1 Registered Holder, which must be Stakeholder Type = Company.
  • No Beneficial Holder.

Joint

  • Exactly 2 Registered Holders, which must be Stakeholder Type = Individual.
  • No Beneficial Holder.

SMSF

  • At least 1 (possibly more) Registered Holder, which may be Stakeholder Type = Company or Individual (Trustees).
  • Exactly 1 Beneficial Holder, which must be Stakeholder Type = Trust.

Trust

  • At least 1 (possibly more) Registered Holder, which may be Stakeholder Type = Company or Individual (Trustees).
  • Exactly 1 Beneficial Holder, which must be Stakeholder Type = Trust.

An account can be created either via the API or by the Operations team through the Admin portal.

When the Operations team creates an account, the system publishes the following webhook events:

  1. account.created.success → triggered when account creation is successful See payload example:
    {
      "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
      "type": "account.created",
      "publishedAt": "2021-09-13T07:44:44.712943Z",
      "title": "Account Created",
      "body": {
       "accountId": "1",
       "externalAccountId": "1001",
       "status" : ACTIVE,
       "source" : ADMIN_PORTAL
     }
    }
    
Authorizations:
BearerAuth
Request Body schema: application/json
externalAccountId
string [ 0 .. 100 ] characters
nonIndividualAccountType
required
string
Enum: "INDIVIDUAL" "COMPANY" "JOINT_HOLDING" "SUPERANNUATION_FUND" "TRUST" "GOVERNMENT_ENTITY" "INCORPORATED_ASSOC" "UNINCORPORATED_ASSOC" "PARTNERSHIP" "CHARITABLE_TRUST" "SYNDICATE" "MINOR" "SMSF" "OTHER_ENTITY" "CORPORATION" "SOLE_TRADER"
email
required
string
phoneNumber
required
string
pdsReceivedInAustralia
boolean

PDS Received in Australia should be set to TRUE if a non-Australian phone number is provided in the phoneNumber field.

required
Array of objects (CreateAddressDto) unique
dateTimeOfRegister
required
string <date-time>

pattern = 'yyyy-MM-dd HH:mm:ss'

tags
Array of strings unique
required
Array of objects (CreateAccountStakeholderDto) unique
drpStatus
boolean

Responses

Request samples

Content type
application/json
{
  • "externalAccountId": "string",
  • "nonIndividualAccountType": "INDIVIDUAL",
  • "email": "string",
  • "phoneNumber": "string",
  • "pdsReceivedInAustralia": true,
  • "addresses": [
    ],
  • "dateTimeOfRegister": "2019-08-24T14:15:22Z",
  • "tags": [
    ],
  • "accountStakeholders": [
    ],
  • "drpStatus": true
}

Rollover Process

A rollover is an investment procedure where:
- An Investor redeems units from one Fund held in one Account.
- The proceeds of this redemption are used by the Investor for an application for units in either the same Fund or a different one. This application is done within another Account, which can either be a new one or an existing one.
- A significant condition to be met is that the first and second Accounts need to have the same Interested Parties.

Authorizations:
BearerAuth
path Parameters
fromAccountId
required
integer <int64>
toAccountId
required
integer <int64>
Request Body schema: application/json
idempotencyKey
required
string
fromFundId
required
integer <int64>
toFundId
required
integer <int64>
fromInvestmentOptionId
required
integer <int64>
toInvestmentOptionId
required
integer <int64>
fullRollover
boolean
Default: true
amount
number

Responses

Request samples

Content type
application/json
{
  • "idempotencyKey": "string",
  • "fromFundId": 0,
  • "toFundId": 0,
  • "fromInvestmentOptionId": 0,
  • "toInvestmentOptionId": 0,
  • "fullRollover": true,
  • "amount": 0
}

Clone an Account by id

Bank details are optional. Cloned account shall use the bank details from the request. If no bank details are provided in the request, the System shall use the bank account details from the source account. In case, source account doesn't have any bank details and no bank details are provide in the request the account shall not have any bank details

Authorizations:
BearerAuth
path Parameters
accountId
required
integer <int64>
Request Body schema: application/json
externalAccountId
string
object (ClonedBankingDetailsDto)

Bank details are optional. Cloned account shall use the bank details from the request. If no bank details are provided in the request, the System shall use the bank account details from the source account. In case, source account doesn't have any bank details and no bank details are provide in the request the account shall not have any bank details

Responses

Request samples

Content type
application/json
{
  • "externalAccountId": "string",
  • "bankingDetails": {
    }
}

Retrieve account's distribution details

Returns a list of distribution details for a specific account within a given date range.

The response includes distribution details like payment amount, reinvestment amounts and units, and other details.

Both fromDate and toDate parameters are required and must be in yyyy-MM-dd format.

The date range is inclusive of both start and end dates.

Following webhook is published to notify clients that the distributions are completed for a specific period :

  1. distribution.completed → notifies when distribution is completed. See payload example:
    {
     "fromDate": "2025-01-01",
     "toDate": "2025-01-31"
    }
    
Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
query Parameters
fromDate
required
string <date>
toDate
required
string <date>

Responses

Search Accounts

Search for non-individual accounts using various criteria. The search can be filtered by account status, type, creation date, and other parameters defined in the NonIndividualAccountPredicate. Results are paginated for better performance and data management.

Authorizations:
BearerAuth
query Parameters
required
object (NonIndividualAccountPredicate)

Responses

Retrieve Account DRP Status

Retrieves the Distribution Reinvestment Plan (DRP) status for a specific account. The response includes information about whether distributions are currently being reinvested and the reinvestment preferences for different investment options.

Authorizations:
BearerAuth
path Parameters
accountId
required
integer <int64>

Responses

Account Tags

A Stakeholder can maintain multiple accounts for different purposes (e.g., trading, investment, retirement). This endpoint allows tagging an account with a specific purpose, making it easier to distinguish between multiple accounts belonging to the same Stakeholder.

Get all tags associated with an account

Retrieves all tags that have been assigned to a specific investor. Tags can be used to categorize and filter investors for reporting and management purposes. Returns an empty set if no tags are associated with the investor.

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>

Responses

Add tags to an investor's account

This endpoint allows you to add one or more tags to an investor's account. Tags are useful for categorizing and filtering investors. If a tag already exists for the investor, it will not be duplicated.

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
Request Body schema: application/json
tags
Array of strings unique

Responses

Request samples

Content type
application/json
{
  • "tags": [
    ]
}

Banking Details

An Account can have only one active bank account at any given time.

This set of APIs is used to manage the banking details associated with an Account.

Following webhook is published when ops team updates banking details from admin portal

.

Banking Details Updated Webhook Example:

{
  "webhookId": "c38a7f71-2561-42ff-b333-1ef01ad85eb4",
  "type": "investor.banking.updated",
  "title": "Investor Banking Updated",
  "body": {
    "externalAccountId": "431638446828",
    "investorId": 10
  },
  "publishedAt": "2021-11-10T14:17:58.150330Z"
}

Retrieve linked bank account details for an account

Returns the currently linked bank account details for the specified investor. This includes account name, BSB, account number and bank name.

If no bank account has been linked yet, the API will return a 404 Not Found response.

This endpoint is commonly used to display the account's current banking details before making updates or to verify payment destination details.

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>

Responses

Update banking details by investor id

This API allows investors to update their bank details if their current holding is $0. If their holding is >$0 then you will need to contact the Cache support via email (with a bank statement of the new account) to update their bank details.

We only support standard Australian bank account & BSB. Australian banking standards mandate a 6 digit BSB and 6-9 digit account numbers. Only digits allowed. Furthermore, certain account numbers (ex, 999999 or 802919) are reserved and cannot be used.

For security reasons, we don’t allow special characters to be used in any of the input parameters. See below the regular expression we use for validation.

ACCEPTED_CHARACTERS_REGEX = \"^[a-zA-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ∂ð ',.'-]{0,48}+$\";

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
Request Body schema: application/json
bank_bsb
required
string
bank_account_number
required
string[0-9]+
bank_account_name
required
string^[a-zA-Zàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýż...

Letters, spaces and following characters; +@!^$&'()*-:;=?.#_,[]/

Responses

Request samples

Content type
application/json
{
  • "bank_bsb": "string",
  • "bank_account_number": "string",
  • "bank_account_name": "string"
}

Create banking details by investor id

Creates a ‘linked bank account’ for an existing investor.

All direct debit requests and withdrawal payments may only be made to a linked bank account stored for the relevant investor.

At this time, each investor may only create one linked bank account.

We only support standard Australian bank account & BSB. Australian banking standards mandate a 6 digit BSB and 6-9 digit account numbers. Only digits allowed. Furthermore, certain account numbers (ex, 999999 or 802919) are reserved and cannot be used.

For security reasons, we don’t allow special characters to be used in any of the input parameters. See below the regular expression we use for validation.

ACCEPTED_CHARACTERS_REGEX = \"^[a-zA-ZàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýżźñçčšžÀÁÂÄÃÅĄĆČĖĘÈÉÊËÌÍÎÏĮŁŃÒÓÔÖÕØÙÚÛÜŲŪŸÝŻŹÑßÇŒÆČŠŽ∂ð ',.'-]{0,48}+$\";

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
Request Body schema: application/json
bank_bsb
required
string
bank_account_number
required
string[0-9]+
bank_account_name
required
string^[a-zA-Zàáâäãåąčćęèéêëėįìíîïłńòóôöõøùúûüųūÿýż...

Letters, spaces and following characters; +@!^$&'()*-:;=?.#_,[]/

Responses

Request samples

Content type
application/json
{
  • "bank_bsb": "string",
  • "bank_account_number": "string",
  • "bank_account_name": "string"
}

Account Holdings

Account Holdings represent the assets or investments currently held within an Account.

These APIs provide functionality including :

  • Retrieve a list of all holdings for a given Account
  • View details of account holding holdings based on instruction tags
  • Track changes in holdings over time

Notes:

  • Holdings are read-only from the API perspective; they are updated based on settlement and transaction processes.
  • All holdings are tied to a single Account and cannot be shared across Accounts.

Retrieve holding information by account id

Provides a detailed snapshot of all current investments held by an existing investor. The response includes investment options, units held, and current valuation. Use isSecondVersion parameter for enhanced holding details.

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
query Parameters
isSecondVersion
boolean

Responses

Retrieve historical holding information by account id

Provides historical balance of investments held by an existing investor within a specified date range. Results can be filtered by instruction tags and include daily balance snapshots between the provided from and to dates.

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
query Parameters
fromDate
required
string <date>
toDate
required
string <date>
instructionTags
required
Array of strings unique

Responses

Retrieve holding balance by account id and instruction tag

Provides a snapshot of investments filtered by specified instruction tags for an existing investor. Tags are case-insensitive and can be used to group or categorize holdings based on investment instructions.

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
query Parameters
instructionTags
required
Array of strings unique

Responses

Retrieve holding balance by account id

Provides a balance of the investments held by an existing investor. Holding Balance has following Balance Logic Types.

logicType Description When commonly used
Actual         The sum of all units held by investors and recorded on the register. This is the 'legal' balance used for unit pricing and audit purposes.
Cleared         The 'Actual Balance' less any Applications that:
  • have the Transaction Status 'Unitised', and
  • do not have the Funding Status 'Fully Funded',(eg 'debited' Applications).
This is the balance of all transactions that are no longer at risk of defaulting.
Projected         The 'Actual Balance' less any Redemptions that have the Transaction Status 'Approved'. This is the projected balance the Investment Option will have when all pending transactions into and out of the Investment Option have been processed.
Requested         The sum of:
  • all Applications with the transaction status 'Approved', and
  • all Redemptions with the transaction status 'Approved'.
Uncleared         The 'Actual Balance' less the 'Cleared Balance'.
Pending         The 'Requested Balance' plus the 'Uncleared Balance'.
Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
query Parameters
logicType
string
Enum: "Actual" "Cleared" "Available" "Projected" "Requested" "Uncleared" "Pending"
valueType
string
Enum: "Value" "Cost" "Gain"
calculationType
string
Enum: "FIFO" "LIFO" "VWAP"
isSecondVersion
boolean

Responses

Investment Options

Investment Options represent the financial products that an account holder can select when investing.

Notes:

  • Some investment options are interest rate based (e.g., term deposits, fixed-income products).
    • The API may return the current applicable rate and associated terms.
    • Rates can vary over time, and historical rate information may also be provided.
  • Investment options are managed centrally and cannot be modified directly through this API.
  • Selections are linked to Accounts during or subsequent investment allocation.

Investment Option Unit Price Updated Webhook Example:

{
  "webhookId": "d13f0ef5-47fd-4992-b6d1-906e6ab608d2",
  "type": "client.options.unitprice.updated",
  "title": "Investment option unit-price updated",
  "body": {
    "investmentOptionId": 2,
    "unitPrice": 17.11,
    "unitPriceBuy": 18.6,
    "unitPriceDate": "20220610",
    "unitPriceSell": 10.11
  },
  "publishedAt": "2022-06-10T05:51:44.760508Z"
}

Update interest rate by investment option

Update the interest rate with a specified date for an investment option.

Authorizations:
BearerAuth
Request Body schema: application/json
investmentOptionId
required
integer <int64>

The ID that identifies the Investment Option on the Cache stack.

effectiveStartDate
required
string <date>

The Start Date which the interest rate commences.

effectiveEndDate
required
string <date>

The End Date which the interest rate ceases (inclusive).

baseRate
number <double>

The base interest rate is reference rate to be applied over the Start and End Date (inclusive). If the rate only applies for one day then the Start and End Date will be the same.

spreadRate
number <double>

This is the rate that will be added to the base rate to calculate the grossRate(final interest rate) to be applied to the investor’s accrual. If the interest rate applied to calculate the accrual has no spread then the Spread should be set to 0 and the baseRate should be populated with the grossRate.

interestAmount
number <double>

The total amount of interest that has been accrued over the Start and End Date. If the amount is to be applied for a single day then the Start and End Date will be the same and correspond to the accrual day. If the amount applies over a period (eg. weekend) then the Start and End Date should correspond to the starting and ending date for the period.

Responses

Request samples

Content type
application/json
{
  • "investmentOptionId": 0,
  • "effectiveStartDate": "2019-08-24",
  • "effectiveEndDate": "2019-08-24",
  • "baseRate": 0,
  • "spreadRate": 0,
  • "interestAmount": 0
}

List of investment options

Returns a list of all available investment options within the Fund.

Authorizations:
BearerAuth

Responses

Retrieve unit price by investment option

Retrieves the most recent recorded unit price for an investment option.

Authorizations:
BearerAuth
path Parameters
investmentOptionId
required
integer <int64>

Responses

Retrieve historical unit prices by investment option id

Returns an array of all the unit prices determined for an investment option within a date period.

The response will not provide a unit price for days on which a unit price was not determined (e.g. on a weekend or public holiday).

The 'fromDate' must be less than the 'toDate' and the 'toDate' must be less than or equal to today's date.

Authorizations:
BearerAuth
path Parameters
investmentOptionId
required
integer <int64>
query Parameters
fromDate
string <date>
toDate
string <date>

Responses

Retrieve interest rate by investment option

Retrieves the most recent recorded interest rate for an investment option.

Authorizations:
BearerAuth
path Parameters
investmentOptionId
required
integer <int64>

Responses

Retrieve historical interest rates by investment option id

Returns an array of all the interest rates determined for an investment option within a date period.

The response will not provide a unit price for days on which a unit price was not determined (e.g. on a weekend or public holiday).

The 'fromDate' must be less than the 'toDate' and the 'toDate' must be less than or equal to today's date.

Authorizations:
BearerAuth
path Parameters
investmentOptionId
required
integer <int64>
query Parameters
fromDate
string <date>
toDate
string <date>

Responses

Retrieve total balance of Investment Option

Returns current holding balance of the investment option

Authorizations:
BearerAuth
path Parameters
investmentOptionId
required
integer <int64>

Responses

All Instructions

An Instruction is a request made by an Account Holder to initiate the processing of a transaction on their account.

Instructions can be submitted either via this API or through the Help Centre.

Notes:

  • Once an Investment Option has been set up and the Account has been created and verified, you can create an application Instruction for that Account.
  • Instructions represent the starting point for investment or transactional activity (e.g., applying application, redemption, switching options).
  • Validation ensures the Account and Stakeholder meet all compliance and eligibility requirements before the Instruction is processed.

List instructions by investor id

Returns a list of all transaction instructions for an existing investor.

You may request a filtered list by ‘date’, ‘instruction type’ or ‘transaction type’ to reduce the volume of data returned.

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
query Parameters
fromDate
required
string <date>
toDate
required
string <date>
instructionType
string
Enum: "ONE_OFF" "RECURRING" "REINVESTMENT"
transactionType
string
Enum: "APPLICATION" "REDEMPTION" "SWITCH" "ADJUSTMENT_UP" "ADJUSTMENT_DOWN"
tags
required
Array of strings unique

Responses

Retrieve an instruction by instruction id

Retrieves the details of an instruction, including a list of the transactions that have been created by it.

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
instructionId
required
integer <int64>

Responses

Applications

Cancel a recurring instruction by instruction id

Use this endpoint to cancel a recurring application Instruction for an Investor.

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
instructionId
required
integer <int64>

Responses

Create an application instruction by investor id

Creates a new ‘application’ transaction instruction, being a request by the investor to invest in the Fund.

Application transaction instructions may apply to more than 1 investment option and may be set to recur weekly, fortnightly or monthly. Recurring transactions may be set to recur a specified number of iterations, until a particular date has passed or until cancelled.

In case of direct debit as funding source sum of all applications is capped by direct debit limit of client (50000 by default). If application sum is exceeding this limit error will be occurred, to find out the limit check with Cache. Manual funding source is uncapped

Following webhooks are published for application instruction.

  1. instruction.processed → notifies when instruction has been initiated manually by Ops team via Admin Portal See payload example:

    {
     "externalAccountId": "nonInd1734041221",
     "investorId": 423
    }
    
  2. instruction.failed → notifies when instruction has failed See payload example:

    {
     "externalAccountId": "nonInd1734041773",
     "instructionId": 2650,
     "instructionTags": [],
     "investmentOptionIds": [
       7,
       1
     ],
     "investorId": 425,
     "transactionType": "APPLICATION"
     }
    
Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
Request Body schema: application/json
funding_source
required
string
Enum: "MANUAL" "DIRECT_DEBIT"
required
Array of objects (InvestmentOptionApplicationDto)

At least one is required

object (RecurringOptionsDto)
idempotency_key
required
string
instruction_tag
string

Responses

Request samples

Content type
application/json
{
  • "funding_source": "MANUAL",
  • "investment_options": [
    ],
  • "recurring_options": {
    },
  • "idempotency_key": "string",
  • "instruction_tag": "string"
}

Retrieve pending recurring instructions by investor id

Use this endpoint to retrieve all the recurring application instructions for an Investor.

Authorizations:
BearerAuth
query Parameters
investorId
integer <int64>

Responses

Redemptions

Create a redemption instruction by investor id

Use this endpoint to creates a new 'redemption' instruction, which is a request by the Investor to withdraw money from the Fund. Each redemption instruction applies to one investment option only.

"Full Redemptions" (a redemption for all the "cleared" units held by an Investor): If Full Redemption is True, then both Units and Amount must be zero. "Partial Redemptions" (a redemption for less than all remaining units held by an Investor): If Full Redemption is False, then either Units or Amount must be provided and the other must be zero.

Redemptions created using this endpoint do not follow our "real time liquidity" payment flow. Note: We do not accept redemption instructions for uncleared or pending balances. Investors should be advised to wait until all pending applications are cleared (ie they are no longer pending) before seeking to make a Full Redemption. If an investor submits a Full Redemption while they have a "pending" application and the "pending" instruction is successful, the investor will ultimately retain a residual balance.

Following webhooks are published for redemption instruction:

  1. instruction.processed → notifies when instruction has been initiated manually by Ops team via Admin Portal See payload example:

    {
     "externalAccountId": "nonInd1734041221",
     "investorId": 423
    }
    
  2. instruction.failed → notifies when instruction has failed See payload example:

    {
     "externalAccountId": "nonInd1734041773",
     "instructionId": 2650,
     "instructionTags": [],
     "investmentOptionIds": [
       7,
       1
     ],
     "investorId": 425,
     "transactionType": "REDEMPTION"
     }
    
Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
Request Body schema: application/json
full_redemption
required
boolean

false

units
required
number
amount
required
number
investment_option_id
required
integer <int64>
idempotency_key
required
string

Responses

Request samples

Content type
application/json
{
  • "full_redemption": true,
  • "units": 0,
  • "amount": 0,
  • "investment_option_id": 0,
  • "idempotency_key": "string"
}

Switches

Create a new switch

Creates a new ‘switch’ transaction instruction, being a request by the investor to move money from one investment option to another.

Following webhooks are published for webhook instruction.

  1. instruction.processed → notifies when instruction has been initiated manually by Ops team via Admin Portal See payload example:

    {
     "externalAccountId": "nonInd1734041221",
     "investorId": 423
    }
    
  2. instruction.failed → notifies when instruction has failed See payload example:

    {
     "externalAccountId": "nonInd1734041773",
     "instructionId": 2650,
     "instructionTags": [],
     "investmentOptionIds": [
       7,
       1
     ],
     "investorId": 425,
     "transactionType": "SWITCH"
     }
    
Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
Request Body schema: application/json
value
boolean
investmentOption
boolean
from_investment_option_id
required
integer <int64>
to_investment_option_id
required
integer <int64>
amount
required
number
units
required
number
idempotency_key
required
string
full_switch
required
boolean
Default: false

Responses

Request samples

Content type
application/json
{
  • "value": true,
  • "investmentOption": true,
  • "from_investment_option_id": 0,
  • "to_investment_option_id": 0,
  • "amount": 0,
  • "units": 0,
  • "idempotency_key": "string",
  • "full_switch": false
}

Instruction Tags

List instruction tags by instruction id

Retrieves the tag list of an instruction by Instruction ID

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
instructionId
required
integer <int64>

Responses

All Transactions

A Transaction represents the execution and settlement of an approved Instruction.

Transactions can be only created via back-office processing of Instructions.

Notes:

  • Each Transaction is linked to a specific Account and Investment Option
  • The type of Transaction (e.g., application, redemption, switch) determines what processing rules are applied
  • Transaction status updates trigger webhooks to notify external systems
  • Historical Transaction data is maintained for audit and reporting purposes

Processed Transaction Webhook Example for Application(similar webhook published for Redemption and Switch):

{
    "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
    "type": "transaction.processed",
    "publishedAt": "2021-09-13T07:44:44.712943Z",
    "title": "Transaction Processed (Application)",
    "body": {
        "externalAccountId": "1001",
        "instructionId": "1",
        "transactionType": "APPLICATION",
        "instructionTags": [
            "someTag1",
            "someTag2"
        ],
        "investmentOptionIds": [
            1,
            2
        ],
        "investorId": 101,
        "transactionId": 202
    }
}

Failed Transaction Webhook Example for Application(similar webhook published for Redemption and Switch):

{
    "webhookId": "5ba28486-1ece-4786-bbed-21fca2235edf",
    "type": "transaction.failed",
    "publishedAt": "2021-09-13T07:44:44.712943Z",
    "title": "Transaction Failed (Application)",
    "body": {
        "externalAccountId": "1001",
        "instructionId": "1",
        "transactionType": "APPLICATION",
        "instructionTags": [
            "someTag1",
            "someTag2"
        ],
        "investmentOptionIds": [
            1,
            2
        ],
        "investorId": 101,
        "transactionId": 202
    }
}

Investment Payment Processed Webhook Example:

{
   "webhookId": "be03bd99-4bf4-4b1f-bd10-92f81891573b",
   "type": "payment.processed.investment",
   "title": "Payment Processed",
   "body": {
     "externalAccountId": "431637232492",
     "instructionId": 4,
     "investorId": 2,
     "paymentSum": 1,
     "transactionId": 4
   },
   "publishedAt": "2021-11-18T10:50:42.615311Z"
}

Investment Payment Accepted Webhook Example:

{
   "webhookId": "be03bd99-4bf4-4b1f-bd10-92f81891573b",
   "type": "payment.accepted.investment",
   "title": "Payment Accepted",
   "body": {
     "externalAccountId": "431637232492",
     "instructionId": 4,
     "investorId": 2,
     "paymentSum": 1,
     "transactionId": 4
   },
   "publishedAt": "2021-11-18T10:50:42.615311Z"
}

Investment Payment Failed Webhook Example:

{
   "webhookId": "be03bd99-4bf4-4b1f-bd10-92f81891573b",
   "type": "payment.failed.investment",
   "title": "Payment Failed: voided (invalid_bsb_number)",
   "body": {
     "externalAccountId": "431637232492",
     "instructionId": 4,
     "investorId": 2,
     "paymentSum": 1,
     "transactionId": 4
   },
   "publishedAt": "2021-11-18T10:50:42.615311Z"
}

Investment Payment Refused Webhook Example:

{
   "webhookId": "be03bd99-4bf4-4b1f-bd10-92f81891573b",
   "type": "payment.refused.investment",
   "title": "Payment Refused: declined",
   "body": {
     "externalAccountId": "431637232492",
     "instructionId": 4,
     "investorId": 2,
     "paymentSum": 1,
     "transactionId": 4
   },
   "publishedAt": "2021-11-18T10:50:42.615311Z"
}

Unitised Transaction Webhook Example for Application(similar webhook published for Redemption and Switch):

{
    "webhookId": "d855a831-54af-40f4-b412-cf1755004e48",
    "type": "transactions.unitised",
    "publishedAt": "2023-05-25T07:34:57.631854Z",
    "title": "Unitised Transactions",
    "body": {
        "unitisedTransactions": [
            {
                "amount": 10,
                "units": 5.464481,
                "unitPrice": 1.83,
                "transactionId": 274068,
                "investmentOptionName": "Cache Non-Functional Testing Growth",
                "investmentOptionId": 3,
                "transactionStatus": "UNITISED",
                "instructionId": 277658,
                "fundingStatus": "FULLY_FUNDED"
            },
            {
                "amount": 10,
                "units": 0.967118,
                "unitPrice": 10.34,
                "transactionId": 274068,
                "investmentOptionName": "Cache Non-Functional Testing Balanced",
                "investmentOptionId": 2,
                "transactionStatus": "UNITISED",
                "instructionId": 277658,
                "fundingStatus": "FULLY_FUNDED"
            }
        ]
    }
}

List transactions by transaction id

Returns a list transactions retrieved by their IDs. The results will not include cancelled or rejected transaction instructions.

You may request a filtered list by ‘application’, ‘redemption’ or ‘switch’.

Authorizations:
BearerAuth
Request Body schema: application/json
page
integer <int32>
size
integer <int32>
sortDirection
string
Enum: "ASC" "DESC"
sortColumn
string
Enum: "id" "instructionId" "investorId" "cxiRequestNumber" "transactionType" "fundingSource" "dateCreated"

Column name to sort

ids
Array of integers <int64> unique [ items <int64 > ]

Transaction ids

Responses

Request samples

Content type
application/json
{
  • "page": 0,
  • "size": 0,
  • "sortDirection": "ASC",
  • "sortColumn": "id",
  • "ids": [
    ]
}

List transactions by account id

Returns a list of all transactions for an existing investor. This is a historic record of the actual transactions that have been processed on behalf of an investor, and will not include cancelled or rejected transaction instructions.

You may request a filtered list by ‘application’, ‘redemption’ or ‘switch’.

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
query Parameters
transactionType
string
Enum: "APPLICATION" "REDEMPTION" "SWITCH" "ADJUSTMENT_UP" "ADJUSTMENT_DOWN"
instructionType
string
Enum: "ONE_OFF" "RECURRING" "REINVESTMENT"
fromDate
required
string <date>
toDate
required
string <date>
instructionTags
required
Array of strings unique

Responses

Retrieve a transaction by transaction id

Retrieves detailed information for a specific transaction, including transaction status, amounts, dates, and associated metadata. The transaction must belong to the specified account ID.

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
transactionId
required
integer <int64>

Responses

Transaction Tags

List transactions by transaction tags

Returns a list of all transactions that match the specified transaction tags. Tags are case-insensitive and can be used to filter transactions based on custom categorization or grouping criteria.

Authorizations:
BearerAuth
query Parameters
transactionTags
required
Array of strings unique

Responses

Fee Calculator

Calculate fee for investment option

Use this API to retrieve the transaction fees that will apply to a transaction instruction.

For an application investment instruction (which may relate to multiple investment options), you can provide an array of investment options with investment amounts.

For a redemption (which only apply to a single investment option), you may provide an array of 1 investment option.

For a switch, you may provide an array of 1 investment option which relates to the option you are switching into (do not include the details of the investment option you are switching out of).

You can also provide amounts ‘inclusive’ of the transaction fee (ie the ‘gross amount’) or ‘exclusive’ of the transaction fee (ie the ‘net amount’) by selecting the appropriate ‘fee type’. Please note: this only applies to Application transaction types.

Redemption and switch transactions are always fee inclusive (fee_type parameter will be ignored for these operations).

Authorizations:
BearerAuth
Request Body schema: application/json
fee_type
required
string
Enum: "INCLUSIVE" "EXCLUSIVE"
transaction_type
required
string
Enum: "APPLICATION" "REDEMPTION" "SWITCH" "ADJUSTMENT_UP" "ADJUSTMENT_DOWN"
required
Array of objects (FeeCalculationInvestmentOptionRequest)

Responses

Request samples

Content type
application/json
{
  • "fee_type": "INCLUSIVE",
  • "transaction_type": "APPLICATION",
  • "investment_options": [
    ]
}

Sandbox Testing

Fully fund and unitise transactions (SANDBOX ONLY)

Performs full funding and unitisation of specified transactions. WARNING: This operation is only available in the Sandbox environment and should not be used in production.

Authorizations:
BearerAuth
Request Body schema: application/json
ids
Array of integers <int64> unique [ items <int64 > ]

Responses

Request samples

Content type
application/json
{
  • "ids": [
    ]
}

Create daily unit prices (SANDBOX ONLY)

Creates a daily unit price for investment options in the Sandbox environment only. This endpoint is for testing purposes and will not work in production.

Authorizations:
BearerAuth
Request Body schema: application/json
investment_option_id
integer <int64>
unit_price
number <double>
unit_price_buy
number <double>
unit_price_sell
number <double>
price_date
string <date>
price_effective_time
string

Responses

Request samples

Content type
application/json
{
  • "investment_option_id": 0,
  • "unit_price": 0,
  • "unit_price_buy": 0,
  • "unit_price_sell": 0,
  • "price_date": "2019-08-24",
  • "price_effective_time": "string"
}

Invoices

Application instructions can be funded through Direct Debit or Manual funding methods. Invoices are generated for manually funded transactions to track and process payments.

Invoice Generated Webhook Example:

{
  "webhookId": "db594772-4b79-41f9-9d7b-6436e11e32bf",
  "type": "invoice.generated",
  "title": "Invoice is issued by administrator",
  "body": {
    "invoiceCode": "INV-3-20211202-002"
  },
  "publishedAt": "2021-12-20T00:03:03.552897Z"
}

Pay amount of invoice by invoice reference code

Updates the paid amount for an invoice using its reference code. Requires payment amount in the request body. Returns updated invoice details including new payment status and remaining balance.

Authorizations:
BearerAuth
path Parameters
invoiceCode
required
string
Request Body schema: application/json
paidAmount
number <double>

Responses

Request samples

Content type
application/json
{
  • "paidAmount": 0
}

Retrieve client's invoice by invoice reference code

Retrieves client's invoice details by its reference code.

Authorizations:
BearerAuth
path Parameters
invoiceCode
required
string

Responses

Retrieve client's invoice summarized total by invoice reference code

Retrieves summarized total of client's invoice by its reference code.

Authorizations:
BearerAuth
path Parameters
invoiceCode
required
string

Responses

Subscriptions

Some products on the Cache platform charge Accountholders:

  • a fixed amount each month (eg $2 per month); or
  • a % of their account balance (eg 0.5% pa)

That money is charged to the Accountholder personally (ie it is not charged to the Fund as a whole). We call this a 'Subscription' and we refer to the amounts charged as 'Subscription Fees'.

Investor Subscription Created Webhook Example:

{
   "webhookId": "d2fb18df-52c0-4a21-bc5a-533ab574cc68",
   "type": "investor.subscription.created",
   "title": "Subscription for Investor was created",
   "body": {
     "externalAccountId": "431638446828",
     "investorId": 5
   },
   "publishedAt": "2022-01-20T09:07:06.118100Z"
}

Payment Accepted Webhook Example:

{
  "webhookId": "db1cf05d-b886-4389-9d59-59e4b9054710",
  "type": "payment.accepted.subscription",
  "title": "Payment Success: approved (attempt 1 out of 3)",
  "body": {
    "externalAccountId": "431637232492",
    "investorId": 2,
    "maxPaymentAttempt": 3,
    "paymentAttempt": 1,
    "paymentSum": 0.15
  },
  "publishedAt": "2022-02-09T13:59:58.498958Z"
}

Payment Failed Webhook Example:

{
  "webhookId": "db0b708d-e3b2-4119-ab3d-d0b9d4fdff9e",
  "type": "payment.failed.subscription",
  "title": "Payment Failed: voided (invalid_bsb_number)",
  "body": {
    "externalAccountId": "431637232492",
    "investorId": 2,
    "paymentSum": 5.5
  },
  "publishedAt": "2021-11-25T07:34:57.631854Z"
}

Payment Refused Webhook Example:

{
  "webhookId": "db0b708d-e3b2-4119-ab3d-d0b9d4fdff9e",
  "type": "payment.refused.subscription",
  "title": "Payment Refused: declined",
  "body": {
    "externalAccountId": "431637232492",
    "investorId": 2,
    "paymentSum": 5.5
  },
  "publishedAt": "2021-11-25T07:34:57.631854Z"
}

Calculate subscription fees based on given setting and given holdings

This endpoint calculates subscription fees based on the provided settings and holdings data. The calculation takes into account the investment amount, fee period, and other relevant parameters specified in the request.

path Parameters
investorId
required
integer <int64>
Request Body schema: application/json
required
object (SubscriptionConfigsDto)
required
object (SubscriptionHoldingsInfoDto)

Responses

Request samples

Content type
application/json
{
  • "configs": {
    },
  • "holdingDetails": {
    }
}

Retrieve subscription status by investor id

This endpoint retrieves the current Subscription Status for an Investor. +That is, an Investor is either a "Subscriber" that is currently in a "Subscription Fee Period" or they are not.

path Parameters
investorId
required
integer <int64>

Responses

Retrieve subscription details by investor id

This endpoint retrieves information relating to the Subscription Fee Period that the Investor is currently in (including dates and estimated fee amount).The API shall throw exception "No holding available for this period" if the investor doesn't have any cleared holdings.

path Parameters
investorId
required
integer <int64>

Responses

Subscription Payments

Mark investor subscription payment as successful

Updates the status of an investor's subscription payment to successful. This operation is typically called after receiving a successful payment confirmation from the payment gateway. The operation will update both the payment record and the associated subscription billing status.

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
cachePaymentId
required
integer <int64>

Responses

Retrieve investor's subscription payment history

Retrieves a paginated list of subscription payment details for a specific investor. The results include payment status, amount, dates, and associated subscription information. Results can be filtered and sorted using pagination parameters.

Authorizations:
BearerAuth
path Parameters
investorId
required
integer <int64>
query Parameters
required
object (PageDto)

Responses

Report

The Cache system produces different reports. When a report is generated, the system will publish the following webhook

Report Generate Success Webhook Example:

{
  "webhookId": "d13f0ef5-47fd-4992-b6d1-906e6ab608d2",
  "type": "report.generate.success",
  "title": " Generate Success",
  "body": {
    "reportCreatedAt": "2025-06-05T07:56:50.403166Z",
    "reportJobId": 134,
    "reportTotalCount": 5,
    "reportType": "TRANSACTION_CONFIRMATION"
  },
  "publishedAt": "2022-06-10T05:51:44.760508Z"
}

Retrieve available reports for an account

Retrieves a list of available reports for the specified account. Reports can be filtered by type and date range. Available report types:

  • ACCOUNT_PERIODIC_STATEMENT
  • ACCOUNT_HOLDING_STATEMENT
  • TRANSACTION_CONFIRMATION
  • DISTRIBUTION_STATEMENT
  • ACCOUNT_TRANSACTION_STATEMENT
  • TAX_STATEMENT: Annual tax documentation
Authorizations:
BearerAuth
path Parameters
accountId
required
integer <int64>
query Parameters
reportType
string
Enum: "FOOTER" "ACCOUNT_PERIODIC_STATEMENT" "ACCOUNT_HOLDING_STATEMENT" "TRANSACTION_CONFIRMATION" "DISTRIBUTION_STATEMENT" "ACCOUNT_TRANSACTION_STATEMENT" "TAX_STATEMENT"
fromDate
string <date>
toDate
string <date>

Responses

Download a specific report as PDF

Downloads a specific report in PDF format for the given account and report job ID. An optional custom filename can be specified for the downloaded file.

Authorizations:
BearerAuth
path Parameters
accountId
required
integer <int64>
jobId
required
integer <int64>
query Parameters
saveFileName
string

Responses

FixedIncome

Retrieve balance protection of an account

Retrieve fixed income balance protection of an account

Authorizations:
BearerAuth
path Parameters
accountId
required
integer <int64>

Responses

Retrieve accrual amount of an account

Retrieve fixed income balance protection of an account

Authorizations:
BearerAuth
path Parameters
accountId
required
integer <int64>

Responses

Retrieve list of account balance protection

Retrieve list of account balance protection

Authorizations:
BearerAuth
query Parameters
required
object (PageDto)

Responses

Retrieve list of account accrual

Retrieve list of account balance protection

Authorizations:
BearerAuth
query Parameters
required
object (PageDto)

Responses