Tumelo API (0.174.0)

Download OpenAPI specification:Download

Tumelo Support: support@tumelo.com

This is Tumelo's API. It drives increased shareholder engagement by providing transparency of the organizations owned by investors and giving them a voice by allowing them to vote on important issues at these organizations.

The main uses of this API are:

  • Transparency - To provide a breakdown to an investor of the organizations in which they are invested.
  • Voting - To provide the ability for an investor to vote on a poll concerning organizations in which they are invested.

Status

This API is currently available as a closed BETA. We invite interested parties to give us feedback on this API, its documentation, or anything else about Tumelo's transparency service prior to the API becoming generally available.

Changelog

A changelog for the api can be found here.

Access

The API is available at the following URL:

https://api.prod.tumelo.com/v1

For information on how to obtain access to the API, please contact us.

Development vs Production Habitats

Development and Production environments are separated into their own habitats. Please contact us when you're ready to go into production and require access to your company's live habitat.

Using the API

Case Sensitivity

URLs, headers, path parameters, query parameter names, and query parameter values are all case sensitive. Be careful to use the correct case when constructing requests.

Error Handling

Requests may return an error indicating that there was a problem responding. The response will contain an HTTP status code as well as a JSON object in the following format which describes the error in more detail:

{
  "message": "Resource not found"
}

Pagination

Requests that return lists and describe pagination parameters support paginated results. Results are separated into multiple pages, where the size of each page is determined by the pageSize query parameter. If omitted, pageSize defaults to 50 records. When a response includes a nextPageToken in the response body, this token value should be passed as a query parameter nextPageToken to the same endpoint in order to retrieve the next page of results. This process should be repeated until the response doesn’t include a nextPageToken, indicating that the end of the results has been reached.

When passing the nextPageToken parameter, all other filter and query parameters present in the previous request, must be filled. Filter parameters must not be changed while paginating since this will result in an error or an incorrect overall list. The nextPageToken will not be present in the response body if the end of the list has been reached and no further results are available.

String Formats

The following string formats are used throughout this API.

date-time

The valid format is date-time notation as defined by RFC 3339, section 5.6.

For example: 2020-11-30T10:45:28Z

Support

If you have any technical questions relating to the Tumelo API, please contact us, explaining your question or issue in as much detail as possible, including the operation you were performing and the ISIN or Organization ID you were querying, as well as the results you expected and the actual results or error message you observed. You can expect a response within one business day.

Data Issues

During development and testing in your development habitat we make available a test data set that includes some sample data constructed to illustrate functionality. It is not intended to be used for any purpose other than testing and/or demonstrating functionality, and should not be relied upon to be an accurate reflection of the underlying holdings of any real fund.

If you have any questions or concerns about the data accuracy or completeness of the data in the production environment, please report the matter to us, giving as much information as possible about the issue.

Compositions and Breakdowns

An instrument may have a composition, this means it is a fund invested in other instruments.

A breakdown is the bottom level components of a composite instrument or account. By this, we mean organizations and cash that a particular composite instrument or account is invested into either directly or through funds.

Breakdowns also have an other listing, this is for funds that only have partial information available, or where an instrument is not mapped to an organization.

Authentication

All requests to the Tumelo API must be authenticated using an access token. You will be given a username, password and habitatId to access the API. To obtain an access token, call the authenticate endpoint and provide these details. A token will be returned which can be used to access the API for a particular amount of time. When the access token expires you will need to call the endpoint again to acquire a new token.

If you wish to change your password for security purposes you can use the changePassword endpoint to do so.

Advanced Usage

Amazon's AWS Cognito Identity Provider Service is the identity provider responsible for issuing the token(s). If you wish you can communicate with AWS Cognito directly. You obtain API access tokens by authenticating with Cognito using the credentials issued to your company by Tumelo. You then use the IdToken issued by Cognito in each subsequent request to the Tumelo API.

This process of authenticating directly with cognito is described in detail in the Authentication Developer Guide.

Acquire an access token

This is the only request which can be made without an access token.

Acquires an access token which the API user can use to authenticate with the API. This token should be used in an Authorization header in subsequent requests using the format Bearer <token>.

The token has a limited validity, typically 1 hour.

Request Body schema: application/json
username
required
string

The username of the API user

password
required
string

The password of the API user

Responses

Request samples

Content type
application/json
{
  • "username": "string",
  • "password": "string"
}

Response samples

Content type
application/json
{
  • "token": "string",
  • "expirationTime": "2019-08-24T14:15:22Z"
}

Change API user password

Changes the password of the API user.

To keep your login secure, use a complex password and don't use passwords that have been used elsewhere.

The new password must meet the following criteria:

  • between 8 and 99 characters
  • contain at least 1 uppercase character
  • contain at least 1 lowercase character
  • contain at least 1 number
  • contain only uppercase and lowercase letters, numbers and the symbols ^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~ `
Request Body schema: application/json
newPassword
required
string

The desired new password for the API user account

Responses

Request samples

Content type
application/json
{
  • "newPassword": "string"
}

Response samples

Content type
application/json
{
  • "message": "string"
}

Instruments

Instruments are financial assets that can be traded on the world's financial markets. The classes of asset that we are most concerned with for the purposes of investor transparency include stocks and shares, bonds, cash and tradeable funds of any kind. These are typically the types of asset used by fund managers to make up pensions and other investment products that retail investors and employees invest in, either directly or via a pension scheme.

The Tumelo Transparency API makes it easy to discover the underlying instruments making up a fund. We distinguish two main classes of instrument, depending on whether the instrument represents a simple share in a company or it represents a fund such as an ETF that is made up of many underlying instruments. We refer to instruments that can't be broken down or decomposed into constituent instruments as atomic, and those that can be decomposed as composite.

All instruments on the Tumelo platform are identified by their ISIN (International Securities Identification Number).

Organizations

Organizations represent public companies and other institutions such as governments that issue shares or bonds which are then traded on the world's financial markets.

Organization Identifiers

In order to be able to unambiguously refer to a specific company or other organization, we make use of Organization Identifiers. Any given organization will have at least one identifier associated with it. The majority of organizations have an associated Legal Entity Identifier (LEI), which is a 20-character alpha-numeric code based on the ISO 17442 standard. LEIs are managed by the Global Legal Entity Identifier Foundation (GLEIF) which describes itself as a supra-national not-for-profit organization headquartered in Switzerland.

LEI is a relatively new standard, but companies involved in settling trades within the EU are required by regulation to have an LEI. Some organizations, particularly those outside the EU may not have an LEI yet, so we also support other identification schemes. Currently this includes D-U-N-S numbers, issued by Dunn & Bradstreet.

When using the Transparency API, organization identifiers are prefixed by the name of the identification scheme, separated from the identifier itself by an underscore _ character, for example LEI_HWUPKR0MPOU8FGXBT394 or DUNS_152618153.

Whilst most organizations will have a single associated identifier, it is possible for an organization to have more than one identifier. When the information relating to a specific organization returned, all known identifiers are included.

List organizations

Returns a list of organizations, including the information available on each one. Without any pagination parameters, a maximum of 50 organizations will be returned.

If information is required for a list of specific organizations, the issuedIsins, externalIdentifiers, and ids query parameters may be used to define a filter for the response such that only organizations matching one defined by the query parameters will be included. For example:

/organizations?issuedIsins=GB00BN7CG237,USG50027AE42

The request returns only organizations for which a match can be found. Any duplicate organizations are returned just once. The order of organizations returned is not determined by the filters.

Note; the filters are additive, so if 2 or more query parameters are provided returned organizations must match both of them.

query Parameters
ids
Array of strings

A comma separated list of organization ids.

externalIdentifiers
Array of strings (OrganizationIdentifier)

A comma separated list of organization identifiers.

search
string

A case insensitive filter that can be used to search by display title, legal title or an organization identifier. It may have a maximum character length of 50.

issuedIsins
Array of strings (ISIN)

A comma separated list of ISINs.

pageSize
integer (PageSize) [ 1 .. 100 ]
Default: 50

The maximum number of elements to return.

nextPageToken
string

Passing a nextPageToken will cause the next page of results to be retrieved.

Responses

Response samples

Content type
application/json
{
  • "organizations": [
    ],
  • "nextPageToken": "string"
}

Get organization

Returns the organization based on its identifier.

path Parameters
organizationId
required
string

An identifier of the organization for which information is required.

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "externalIdentifiers": [
    ],
  • "displayName": "string",
  • "legalName": "string",
  • "websiteUrl": "string",
  • "logoUrl": "string",
  • "bio": {
    },
  • "issuedIsins": [
    ],
  • "headquarters": {
    },
  • "industry": {
    }
}

List general meetings

Lists the general meetings for an organization.

If you wish to list general meetings for any organization, provide a - for the organizationId part of the url.

e.g organizations/-/generalMeetings

To get a list of general meetings from a list of ids, pass a list of ids in the 'generalMeetingIds' field and provide a '-' for the organizationId part of the url.

General meetings are ordered by ascending date of general meeting.

path Parameters
organizationId
required
string

An identifier of the organization for which information is required.

query Parameters
pageSize
integer (PageSize) [ 1 .. 100 ]
Default: 50

The maximum number of elements to return.

dateAfter
string <date>

Passing a general meeting after date will return general meetings that have a date on or after the specified date.

dateBefore
string <date>

Passing a general meeting before date will return general meetings that have a date before the specified date.

generalMeetingIds
Array of strings

Passing a list of general meeting ids will return general meetings that match the ids.

nextPageToken
string

Passing a nextPageToken will cause the next page of results to be retrieved.

Responses

Response samples

Content type
application/json
{
  • "generalMeetings": [
    ],
  • "nextPageToken": "string"
}

Get general meeting

Returns the general meeting based on its identifier.

path Parameters
organizationId
required
string

An identifier of the organization for which information is required.

generalMeetingId
required
string

An identifier of the general meeting for which information is required.

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "organizationId": "string",
  • "generalMeetingType": "annual",
  • "date": "2019-08-24",
  • "url": "string",
  • "announcementTime": "2019-08-24",
  • "announcementUrl": "string",
  • "proxyNoticeUrl": "string",
  • "resultsUrl": "string",
  • "recordDate": "2019-08-24"
}

List proposals

Returns the proposals for a general meeting.

path Parameters
organizationId
required
string

An identifier of the organization for which information is required.

generalMeetingId
required
string

An identifier of the general meeting for which information is required.

query Parameters
hasOutcome
boolean

Filter by whether the proposal has an outcome.

Responses

Response samples

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

Habitats

Habitats represent a private view or slice of the Tumelo platform as seen by a service user. A habitat provides an environment to manage distinct sets of investors with varying accout configurations. Typically, a customer will be assigned two distinct habitats:

  • Test
  • Production

The unique identifier for each habitat will be communicated to the user as part of the onboarding process.

Subscribed Instruments

Each habitat has a set of subscribed instruments. Only subscribed instruments can:

  • be added to the account of an investor
  • have have an organization breakdown computed

You can see the full list of instruments to which your habitat is subscribed using the Get Subscribed Instruments endpoint (/habitats/{habitatId}/instruments).

Adding or removing subscribed instruments

If you wish to add or remove instruments from your subscribed instrument set please email support@tumelo.com.

Get Subscribed Instruments

Returns a habitat's list of subscribed instruments.

path Parameters
habitatId
required
string

The habitat identifier.

Responses

Response samples

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

Compute breakdown for a CompositeInstrument

Returns the breakdown of the composite instrument in terms of the organizations, non-composite instruments and composite instruments that make up the latest composition.

The endpoint will return a 400 Bad Request error when the security identifier is malformed or not supplied.

The endpoint will return a 404 Not Found error when the breakdown cannot be computed due to either the requested fund not belonging to the supplied habitat, the fund containing no composition or the latest composition being empty.

path Parameters
habitatId
required
string

The habitat identifier.

Request Body schema: application/json
required
object (InstrumentReference2)

An instrument reference object.

Properties idType and idValue will always be filled in responses.

depth
integer <int32>

Optional max depth to get fund compositions. A value of 0 or lower will get the full breakdown.

Responses

Request samples

Content type
application/json
{
  • "instrument": {
    },
  • "depth": 0
}

Response samples

Content type
application/json
{
  • "rootNodeId": "string",
  • "nodes": [
    ],
  • "edges": [
    ],
  • "organizationDetails": [
    ],
  • "compositeInstrumentDetails": [
    ],
  • "nonCompositeInstrumentDetails": [
    ]
}

Get instrument breakdown

Returns the breakdown of the instrument in terms of the instruments that are the underlying stocks, shares and bonds. The top level 'readTime' represents the time this computation was made, the 'validAt's within the 'basedOn' section represent the valid time for the compositions of the isins they're paired with.

path Parameters
habitatId
required
string

The habitat identifier.

isin
required
string (ISIN) ^[A-Z]{2}[A-Z0-9]{10}$

The ISIN of the fund or composite instrument for which information is required.

Responses

Response samples

Content type
application/json
{
  • "readTime": "2019-08-24T14:15:22Z",
  • "basedOn": {
    },
  • "components": {
    }
}

Get organization breakdown

Returns the breakdown of the instrument in terms of the organizations that issued the underlying stocks, shares and bonds. The top level 'readTime' represents the time this computation was made, the 'validAt's within the 'basedOn' section represent the valid time for the compositions of the isins they're paired with.

path Parameters
habitatId
required
string

The habitat identifier.

isin
required
string (ISIN) ^[A-Z]{2}[A-Z0-9]{10}$

The ISIN of the fund or composite instrument for which information is required.

Responses

Response samples

Content type
application/json
{
  • "readTime": "2019-11-01T13:02:30.000Z",
  • "basedOn": {
    },
  • "components": {
    }
}

Investors

Investors hold investments in financial assets. Each investor can have a number of accounts providing access to a variety of investment portfolios.

Investors are associated with a habitat and each habitat has its own distinct set of investors.

All investor operations must be performed within your assigned habitat, otherwise a response of 403 Forbidden is returned.

Create investor

Creates an investor within the specified habitat. An error will be returned if an investor already exists with the same externalId.

path Parameters
habitatId
required
string

The habitat identifier.

Request Body schema: application/json
externalId
string (ExternalId) [ 1 .. 250 ] characters ^[0-9a-zA-Z ._\-:]{1,250}$

An object identifier assigned by the provider. This is not a Tumelo identifier.

Responses

Request samples

Content type
application/json
{
  • "externalId": "string"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "externalId": "string"
}

List investors

Returns a list of all the investors in the habitat.

Additionally a list of either Tumelo or external identifiers can be provided to filter the results.

Either one of these two query parameters can be provided, but not both in the same request:

  • ids
  • externalIds

Requests that include both query parameters return a 400 Bad Request response code.

Here is an example of the format for each query parameter:

/habitats/<habitatId>/investors?ids=<value1>,<value2>

/habitats/<habitatId>/investors?externalIds=<value1>,<value2>

The request returns only investors for which a match can be found. Any duplicate investors are returned just once. The order of investors returned is not determined by the ids and externalIds filters.

The request is paginated if there are more investors to list than the pageSize. When passing a nextPageToken, the same filter query parameters must be set for each page request.

path Parameters
habitatId
required
string

The habitat identifier.

query Parameters
ids
Array of strings

A comma separated list of Tumelo investor identifiers.

externalIds
Array of strings (ExternalId)

A comma separated list of external investor identifiers.

pageSize
integer (PageSize) [ 1 .. 100 ]
Default: 50

The maximum number of elements to return.

nextPageToken
string

Passing a nextPageToken will cause the next page of results to be retrieved.

Responses

Response samples

Content type
application/json
{
  • "investors": [
    ],
  • "nextPageToken": "string"
}

Get investor

Returns the requested investor.

path Parameters
habitatId
required
string

The habitat identifier.

investorId
required
string

The investor identifier.

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "externalId": "string"
}

Delete investor

Deletes the investor, the investor accounts and compositions. Ballots with an expirationTime in the future:

  • are deleted and therefore will not be included in poll tallies. Ballots with an expiration time in the past:
  • are anonymised so that they are no longer associated with the investor.
  • will not be included in calls to ListBallots.
  • are still counted in poll tallies. Warning - this action is not reversible.
path Parameters
habitatId
required
string

The habitat identifier.

investorId
required
string

The investor identifier.

Responses

Response samples

Content type
application/json
{
  • "message": "Unauthorized - check you have included a valid Authorization header in this request."
}

Accounts

The account is the entity that holds the investor's investment funds. An investor may hold multiple accounts to support the separation of investment choices, such as ISAs or pensions.

The configuration of an account is represented by a composition entity which describes the account's components in terms of weighted investment instruments, cash and others.

Create investor account

Creates an account for an investor. An error will be returned if an account already exists with the same externalId within the habitat.

path Parameters
habitatId
required
string

The habitat identifier.

investorId
required
string

The investor identifier.

Request Body schema: application/json
externalId
string (ExternalId) [ 1 .. 250 ] characters ^[0-9a-zA-Z ._\-:]{1,250}$

An object identifier assigned by the provider. This is not a Tumelo identifier.

title
string [ 1 .. 250 ] characters ^[0-9a-zA-ZÀ-ú ._\-,'&()\/:]{1,250}$

Title of the account.

accountTags
Array of strings

Array of account tag IDs, which is the UUID generated for the account tag on its creation.

Responses

Request samples

Content type
application/json
{
  • "externalId": "string",
  • "title": "string",
  • "accountTags": [
    ]
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "externalId": "string",
  • "title": "string",
  • "accountTags": [
    ]
}

List investor accounts

Returns a list of investor accounts with details of each account.

path Parameters
habitatId
required
string

The habitat identifier.

investorId
required
string

The investor identifier.

Responses

Response samples

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

Delete investor account

Delete investor account.

path Parameters
habitatId
required
string

The habitat identifier.

investorId
required
string

The investor identifier.

accountId
required
string

The investor account identifier.

Responses

Response samples

Content type
application/json
{
  • "message": "Unauthorized - check you have included a valid Authorization header in this request."
}

Create investor account composition

Creates an account composition to describe its components. A composition is a snapshot of the account makeup at a specified point in time (the value of the validTime property).

The composition with the latest validTime is the current composition for the account. A composition at a particular point in time can be overridden by posting another with the same validTime.

This time based approach to the creation of account compositions allows the recording of compositions over time.

path Parameters
habitatId
required
string

The habitat identifier.

investorId
required
string

The investor identifier.

accountId
required
string

The account identifier.

Request Body schema: application/json
validTime
required
string <date-time>

The valid date and time for the composition. This cannot be a time in the future.

The valid format is date-time notation as defined by RFC 3339, section 5.6.

object (TotalSettledValue)

The monetary value of all assets held in the composition at the time described by the validAt property.

object (InvestorAccountCompositionComponents)

The weighted components of the composition at the time described by the validTime property.

Responses

Request samples

Content type
application/json
{
  • "validTime": "2019-08-24T14:15:22Z",
  • "totalSettledValue": {
    },
  • "components": {
    }
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "createTime": "2019-08-24T14:15:22Z",
  • "validTime": "2019-08-24T14:15:22Z",
  • "totalSettledValue": {
    },
  • "components": {
    }
}

List investor account compositions

List all account compositions in chronological order. The composition with the latest validAt time is listed first. For compositions with the same validAt times, the one with the latest createdAt time is listed first. Without any pagination parameters, a maximum of 50 compositions will be returned.

path Parameters
habitatId
required
string

The habitat identifier.

investorId
required
string

The investor identifier.

accountId
required
string

The account identifier.

query Parameters
pageSize
integer (PageSize) [ 1 .. 100 ]
Default: 50

The maximum number of elements to return.

nextPageToken
string

Passing a nextPageToken will cause the next page of results to be retrieved.

Responses

Response samples

Content type
application/json
{
  • "compositions": [
    ],
  • "nextPageToken": "string"
}

Get organization breakdown for an investor account

Returns the breakdown of the investor account in terms of the organizations that issued the underlying stocks, shares and bonds. The top level 'readTime' represents the time this computation was made, the 'validAt's within the 'basedOn' section represent the valid time for the compositions of the isins they're paired with. The endpoint will return a 400 Bad Request error when the organization breakdown cannot be computed due to either the account containing no composition or the latest composition being empty.

path Parameters
habitatId
required
string

The habitat identifier.

investorId
required
string

The investor identifier.

accountId
required
string

The account identifier.

Responses

Response samples

Content type
application/json
{
  • "readTime": "2019-11-01T13:02:30.000Z",
  • "basedOn": {
    },
  • "components": {
    }
}

Create an Account Tag

Creates an Account Tag.

path Parameters
habitatId
required
string

The habitat identifier.

Request Body schema: application/json
id
string

The account tag identifier, which is the UUID generated for this account tag on its creation.

title
string

The name of the account tag.

externalId
string (ExternalId) [ 1 .. 250 ] characters ^[0-9a-zA-Z ._\-:]{1,250}$

An object identifier assigned by the provider. This is not a Tumelo identifier.

createTime
string <date-time>

The time the account tag was created in the Tumelo storage.

The valid format is date-time notation as defined by RFC 3339, section 5.6.

updateTime
string <date-time>

The time the account tag was updated in the Tumelo storage.

The valid format is date-time notation as defined by RFC 3339, section 5.6.

Responses

Request samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "externalId": "string",
  • "createTime": "2019-08-24T14:15:22Z",
  • "updateTime": "2019-08-24T14:15:22Z"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "externalId": "string",
  • "createTime": "2019-08-24T14:15:22Z",
  • "updateTime": "2019-08-24T14:15:22Z"
}

List Account Tags

Returns a list of all the account tags in the habitat.

Additionally a list of either ids or external identifiers can be provided to filter the results.

Either one of these two query parameters can be provided, but not both in the same request:

  • ids
  • externalIds

Requests that include both query parameters return a 400 Bad Request response code.

Here is an example of the format for each query parameter:

/habitats/<habitatId>/accountTag?ids=<value1>,<value2>

/habitats/<habitatId>/accountTags?externalIds=<value1>,<value2>

The request returns only accounts tags for which a match can be found.

The response is paginated if there are more account tags to list than the pageSize. When passing a nextPageToken, the ids and externalIds query parameters must also be set.

path Parameters
habitatId
required
string

The habitat identifier.

query Parameters
ids
Array of strings

A comma-separated list of Tumelo account tag identifiers.

externalIds
Array of strings (ExternalId)

A comma-separated list of external account tag identifiers.

pageSize
integer (PageSize) [ 1 .. 100 ]
Default: 50

The maximum number of elements to return.

nextPageToken
string

Passing a nextPageToken will cause the next page of results to be retrieved.

Responses

Response samples

Content type
application/json
{
  • "accountTags": [
    ],
  • "nextPageToken": "string"
}

Model Portfolios

The modelPortfolio is an entity that can hold compositions defined by the API user. Its intended uses are:

  • computing breakdowns for user defined portfolios
  • assigning to a user account where it can represent an investment portfolio that is shared by multiple investors

List model portfolios

Returns the model portfolios that are associated with this habitat.

path Parameters
habitatId
required
string

The habitat identifier.

query Parameters
pageSize
integer (PageSize) [ 1 .. 100 ]
Default: 50

The maximum number of elements to return.

nextPageToken
string

Passing a nextPageToken will cause the next page of results to be retrieved.

Responses

Response samples

Content type
application/json
{
  • "modelPortfolios": [
    ],
  • "nextPageToken": "string"
}

List model portfolio compositions

List all model portfolio compositions in chronological order. The composition with the latest validAt time is listed first. For compositions with the same validAt times, the one with the latest createdAt time is listed first. Without any pagination parameters, a maximum of 50 compositions will be returned.

path Parameters
habitatId
required
string

The habitat identifier.

modelPortfolioId
required
string

The model portfolio identifier.

query Parameters
pageSize
integer (PageSize) [ 1 .. 100 ]
Default: 50

The maximum number of elements to return.

nextPageToken
string

Passing a nextPageToken will cause the next page of results to be retrieved.

Responses

Response samples

Content type
application/json
{
  • "compositions": [
    ],
  • "nextPageToken": "string"
}

Create model portfolio composition

Create a model portfolio composition.

path Parameters
habitatId
required
string

The habitat identifier.

modelPortfolioId
required
string

The model portfolio identifier.

Request Body schema: application/json
validAt
required
string <date-time>

The valid date and time for the composition. This cannot be a time in the future.

The valid format is date-time notation as defined by RFC 3339, section 5.6.

required
object (ModelPortfolioCompositionComponents2)

The weighted components of the composition at the time described by the validAt property.

Responses

Request samples

Content type
application/json
{
  • "validAt": "2019-08-24T14:15:22Z",
  • "components": {
    }
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "createdAt": "2019-08-24T14:15:22Z",
  • "validAt": "2019-08-24T14:15:22Z",
  • "components": {
    }
}

Get organization breakdown for a model portfolio

Returns the breakdown of the model portfolio in terms of the organizations that issued the underlying stocks, shares and bonds. The top level 'readTime' represents the time this computation was made, the 'validAt's within the 'basedOn' section represent the valid time for the compositions of the isins they're paired with.

path Parameters
habitatId
required
string

The habitat identifier.

modelPortfolioId
required
string

The model portfolio identifier.

Responses

Response samples

Content type
application/json
{
  • "readTime": "2019-11-01T13:02:30.000Z",
  • "basedOn": {
    },
  • "components": {
    }
}

Voting

Polls represent an opportunity for an investor to respond to a specific question, referred to here as a proposal (also known as a resolution), being asked at an organization's shareholder meeting, typically an AGM (Annual General Meeting) or EGM (Extraordinary General Meeting).

A poll will close before (generally two weeks) the shareholder meeting so there is time to communicate the results of the poll to the fund manager before the shareholder meeting occurs.

List investor ballots

Returns a list of ballots for a particular investor.

For the investor id, a wildcard - may be supplied. In that particular case, all ballots for all the users within a habitat are returned. This endpoint is paginated. To fetch the next page, pass the filter and query params from the previous request along with the nextPageToken received in the previous response, in the next request.

path Parameters
habitatId
required
string

The habitat identifier.

investorId
required
string

The investor identifier.

query Parameters
pollIds
Array of strings

includes only ballots that relate to the requested poll IDs

expireAfter
string <date-time>

includes only ballots that expire on or after a given time

expireBefore
string <date-time>

includes only ballots that expire before a given time

latestVotingDeadlineAfter
string <date-time>

includes only ballots that have a latest voting deadline on or after a given time

latestVotingDeadlineBefore
string <date-time>

includes only ballots that have a latest voting deadline before a given time

createdAfter
string <date-time>

includes only ballots that were created on or after the ballot's create time

createdBefore
string <date-time>

includes only ballots that were created before the ballot's create time

hasVoted
boolean

optional filter to based on whether the investor has used the ballot to vote already

nextPageToken
string

Passing a nextPageToken will cause the next page of results to be retrieved.

pageSize
integer (PageSize) [ 1 .. 100 ]
Default: 50

The maximum number of ballots to return.

Responses

Response samples

Content type
application/json
{
  • "ballots": [
    ],
  • "nextPageToken": "string"
}

Get investor ballot

Returns a ballot given the habitat, investor and ballot IDs.

path Parameters
habitatId
required
string

The habitat identifier.

investorId
required
string

The investor identifier.

ballotId
required
string

The ballot identifier.

Responses

Response samples

Content type
application/json
{
  • "ballot": {
    }
}

Cast a vote

Cast a vote on a poll. This endpoint resolves to a Task resource that expresses the action of responding to a ballot and subsequently voting on a poll.

A vote will only be accepted if all the following are true:

  • The ballot has not expired.
  • The investor has not responded with a different response already.
path Parameters
habitatId
required
string

The habitat identifier.

investorId
required
string

The investor identifier.

ballotId
required
string

The ballot identifier.

Request Body schema: application/json

The request body to cast a vote on a ballot. Includes the response the investor gave to the ballot.

response
required
string (VoteOptions)
Enum: "for" "against" "abstain" "withhold" "no_action"

The valid response options to cast a vote on a ballot. Note that these options are not always valid for all polls. We might tighten our validation in the future to restrict the set of valid VoteOptions for a given poll. If we do so we will also provide a mechanism to understand what options are valid in advance of voting.

Responses

Request samples

Content type
application/json
{
  • "response": "for"
}

Response samples

Content type
application/json
{
  • "id": "string",
  • "investorId": "string",
  • "pollId": "string",
  • "createTime": "2019-08-24T14:15:22Z",
  • "expirationTime": "2019-08-24T14:15:22Z",
  • "earliestVotingDeadline": "2019-08-24T14:15:22Z",
  • "latestVotingDeadline": "2019-08-24T14:15:22Z",
  • "investorVote": {
    }
}

List polls in habitat

Lists all polls in a habitat. Polls are ordered by their close date, ascending.

This endpoint is paginated. To fetch the next page, pass the filter and query params from the previous request along with the nextPageToken received in the previous response, in the next request.

path Parameters
habitatId
required
string

The habitat identifier.

query Parameters
nextPageToken
string

Passing a nextPageToken will cause the next page of results to be retrieved.

pageSize
integer (PageSize) [ 1 .. 100 ]
Default: 50

The maximum number of polls to return.

pollIds
Array of strings

A comma separated list of poll IDs. When provided, the endpoint will only return polls associated with any of the provided IDs.

closeTimeBefore
string <date-time>

Passing a close time before date will return polls that have a close time before the specified date.

closeTimeAfter
string <date-time>

Passing a close time after date will return polls that have a close time after the specified date.

publishedBefore
string <date-time>

Passing a published before date will return polls that have a published time before the specified point.

publishedAfter
string <date-time>

Passing a published after date will return polls that have a published time after the specified point.

organizationIds
Array of strings

A comma separated list of organization IDs. When provided, the endpoint will only return polls associated with any of the provided IDs.

Responses

Response samples

Content type
application/json
{
  • "polls": [
    ],
  • "nextPageToken": "string"
}

Get a poll in a habitat

Returns the poll that has the specified ID.

path Parameters
habitatId
required
string

The habitat identifier.

pollId
required
string

The poll identifier.

Responses

Response samples

Content type
application/json
{
  • "poll": {
    }
}

List poll tags

Returns a list of all poll tags, including the poll tag identifier and the title.

query Parameters
pageSize
integer (PageSize) [ 1 .. 100 ]
Default: 50

The maximum number of elements to return.

nextPageToken
string

Passing a nextPageToken will cause the next page of results to be retrieved.

Responses

Response samples

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

Fetch fund manager votes related to a ballot

Fund manager votes are the votes placed by fund managers relating to a proposal.

As a convenience the API allows the listing of fund manager votes related to a ballot.

There may be multiple fund manager votes for a ballot since a ballot may exist due to the ownership of a non-composite instrument by multiple funds which the investor has in their account composition.

There may also be no fund manager votes for a ballot in the following cases:

  • The AGM has not occurred yet so the fund manager hasn't had the opportunity to vote.
  • The fund manager did not vote.
  • The fund manager voted but has not yet reported their vote to Tumelo
path Parameters
habitatId
required
string

The habitat identifier.

investorId
required
string

The investor identifier.

ballotId
required
string

The ballot identifier.

Responses

Response samples

Content type
application/json
{
  • "fundManagerVotes": [
    ],
  • "fundManagers": [
    ]
}

Fetch fund manager votes related to an investor account

Fund manager votes are the votes placed by fund managers relating to a proposal.

As a convenience the API allows the listing of fund manager votes for a list of proposals based on the fund managers of instruments in the latest composition of this account.

There may be multiple fund manager votes for a proposal because the user might have multiple fund managers managing instruments in their account and many of these fund managers might have voted.

There may also be no fund manager votes in the following cases:

  • The AGM has not occurred yet so fund managers haven't had the opportunity to vote.
  • No fund managers voted.
  • Fund managers voted but have not yet reported their vote to Tumelo.
  • The user's current composition doesn't currently contain any instruments managed by fund managers which did vote on the proposal.
path Parameters
habitatId
required
string

The habitat identifier.

investorId
required
string

The investor identifier.

accountId
required
string

The account identifier.

Request Body schema: application/json
proposalIds
required
Array of strings

The ids of the proposals fund manager votes are wanted for.

Responses

Request samples

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

Response samples

Content type
application/json
{
  • "fundManagerVotes": [
    ],
  • "fundManagers": [
    ]
}

Fund Managers

A fund manager manages instruments and can vote on proposals.

List fund managers

Returns a list of fund managers, including the information available on each one. Without any pagination parameters, a maximum of 50 fund managers will be returned.

If information is required for a list of specific fund managers, the ids query parameter may be used to define a filter for the response such that only fund managers matching the query parameter will be included. For example:

/fundManagers?ids=1cb935ce-b361-4a02-b68e-8a717e2fd653,c54ada83-a5fa-427f-ab57-3494582b534e

The request returns only fund managers for which a match can be found, and which the API client has access. Any duplicate fund managers are returned just once. The order of fund managers returned is not determined by the filters.

query Parameters
ids
Array of strings

A comma separated list of fund manager ids.

pageSize
integer (PageSize) [ 1 .. 100 ]
Default: 50

The maximum number of elements to return.

nextPageToken
string

Passing a nextPageToken will cause the next page of results to be retrieved.

Responses

Response samples

Content type
application/json
{
  • "fundManagers": [
    ],
  • "nextPageToken": "string"
}

Get fund manager

Returns the fund manager based on its identifier.

path Parameters
fundManagerId
required
string

An identifier of the fund manager for which information is required.

Responses

Response samples

Content type
application/json
{
  • "id": "string",
  • "title": "string",
  • "websiteUrl": "string",
  • "logoUrl": "string",
  • "logoThumbnailUrl": "string"
}

Fund Variants

A fund variant wraps a fund. It allows a single fund to be represented by a variety of titles and security IDs