View as Markdown

Investment managers

An investment manager is a firm that manages assets for your clients, internal or external. Custody accounts and cash accounts name the investment manager that runs them. The register has two parts: Aleta's shared list of investment managers with a public identifier (an LEI or a CRD number), owner: aleta, and your own investment managers on top, owner: tenant. Investment managers have no link to a client, so everyone with read access sees all of them. Reads need structure:read or access:read; writes need structure:write or access:write. Every write takes ?dry_run=true and an optional Idempotency-Key header, and a write that changes an investment manager is logged in the change history.

You write your own investment managers only. Aleta's shared list is changed by Aleta. The investment managers copied from the legacy platform count as Aleta's (owner: aleta) until they are sorted into the shared list or yours. While your tenant has not moved from the legacy platform, every investment manager copied from it is read-only: while it is owner: aleta a change is 403 aleta_owned, otherwise 409 legacy_managed. The 403 comes first.

Data model

idstring

Stable identifier for the investment manager. A UUID.

namestring

The investment manager's name.

external_reference_idstring or null

Your own reference for the investment manager.

leistring or null

The Legal Entity Identifier (ISO 17442): 18 upper-case letters or digits, then two check digits.

crdstring or null

The CRD number, digits only.

typestring or null

internal (your firm's own) or external.

originstring

legacy (copied from the legacy platform) or v1.

ownerstring

aleta (Aleta's shared list, or a copy from the legacy platform not yet sorted into yours) or tenant (yours).

created_attimestamp

RFC 3339, UTC, whole seconds.


GET/v1/investment-managers

List investment managers

Returns Aleta's shared list and your investment managers together, ordered by name, then id, one page at a time. Names sort by their bytes: digits before upper case, upper case before lower case, letters outside A-Z last. An unknown query parameter is a 400.

Query parameters

limitinteger

Page size. Default 100; a value below 1 or above 1000 is clamped to that range.

cursorstring

The next_cursor of the previous page; next_cursor is null on the last page. A malformed cursor is a 400 bad_request.

Request
GET/v1/investment-managers
curl https://api.aleta.ai/v1/investment-managers \
  -H "Authorization: Bearer {access_token}"
Response
{
  "data": [
    {
      "id": "4f6a2c1e-8b3d-4e5f-9a7b-1c2d3e4f5a6b",
      "name": "Nordic Asset Management",
      "external_reference_id": "mgr-1",
      "lei": "529900T8BM49AURSDO55",
      "crd": null,
      "type": "external",
      "origin": "v1",
      "owner": "tenant",
      "created_at": "2026-10-17T06:12:00Z"
    }
  ],
  "next_cursor": null,
  "limit": 100
}

GET/v1/investment-managers/{id}

Retrieve an investment manager

Returns one investment manager, yours or from Aleta's shared list, with the number of custody accounts and cash accounts that name it and are open today, counted over the ones you can see. An unknown id, or one that is not a UUID, is a 404 not_found.

Extra fields

custody_account_countinteger

Open custody accounts you can see that name this investment manager.

cash_account_countinteger

Open cash accounts you can see that name this investment manager.

Request
GET/v1/investment-managers/{id}
curl https://api.aleta.ai/v1/investment-managers/4f6a2c1e-8b3d-4e5f-9a7b-1c2d3e4f5a6b \
  -H "Authorization: Bearer {access_token}"
Response
{
  "id": "4f6a2c1e-8b3d-4e5f-9a7b-1c2d3e4f5a6b",
  "name": "Nordic Asset Management",
  "external_reference_id": "mgr-1",
  "lei": "529900T8BM49AURSDO55",
  "crd": null,
  "type": "external",
  "origin": "v1",
  "owner": "tenant",
  "created_at": "2026-10-17T06:12:00Z",
  "custody_account_count": 3,
  "cash_account_count": 2
}

POST/v1/investment-managers

Create an investment manager

Creates one of your own investment managers (owner: tenant, origin: v1) and returns 201 with it, without custody_account_count and cash_account_count. name, lei, crd and external_reference_id are trimmed; a blank lei, crd or external_reference_id is left out.

The answers: 400 bad_request for a missing or blank name, an lei that is not 18 upper-case letters or digits followed by valid check digits, a crd with anything but digits, an unknown type or an unknown field. 409 already_exists for an lei or crd that Aleta's shared list already has, naming that investment manager, with next_action ask_aleta on GET /v1/investment-managers/{id}: use it instead of a copy. 409 already_exists for an lei, crd or external_reference_id an investment manager in your tenant already has, with next_action update on PATCH /v1/investment-managers/{id} of that investment manager.

Body

namestringRequired

The investment manager's name.

typestring or null

internal or external.

leistring or null

The investment manager's LEI.

crdstring or null

The investment manager's CRD number.

external_reference_idstring or null

Your own reference for the investment manager.

Request
POST/v1/investment-managers
curl -X POST https://api.aleta.ai/v1/investment-managers \
  -H "Authorization: Bearer {access_token}" \
  -H "Idempotency-Key: {uuid}" \
  -H "Content-Type: application/json" \
  -d '{"name": "Nordic Asset Management", "type": "external", "lei": "529900T8BM49AURSDO55", "external_reference_id": "mgr-1"}'
Response
{
  "id": "4f6a2c1e-8b3d-4e5f-9a7b-1c2d3e4f5a6b",
  "name": "Nordic Asset Management",
  "external_reference_id": "mgr-1",
  "lei": "529900T8BM49AURSDO55",
  "crd": null,
  "type": "external",
  "origin": "v1",
  "owner": "tenant",
  "created_at": "2026-10-17T06:12:00Z"
}

PATCH/v1/investment-managers/{id}

Update an investment manager

Renames one of your investment managers or sets its type, and returns 200 with it as the GET shows it, with custody_account_count and cash_account_count. name is trimmed; type: null clears the type. lei, crd and external_reference_id are set when the investment manager is created and cannot be changed.

The answers: 400 bad_request for a body without name or type, a blank name, an unknown type or an unknown field. 404 not_found for an unknown id. 403 forbidden for an investment manager on Aleta's shared list. For one copied from the legacy platform: 403 aleta_owned while it is owner: aleta, before and after your move; once it is yours, 409 legacy_managed while your tenant has not moved from the legacy platform, and a normal update after.

Body

namestring

The investment manager's new name.

typestring or null

internal, external or null.

Request
PATCH/v1/investment-managers/{id}
curl -X PATCH https://api.aleta.ai/v1/investment-managers/4f6a2c1e-8b3d-4e5f-9a7b-1c2d3e4f5a6b \
  -H "Authorization: Bearer {access_token}" \
  -H "Idempotency-Key: {uuid}" \
  -H "Content-Type: application/json" \
  -d '{"name": "Nordic AM", "type": "internal"}'
Response
{
  "id": "4f6a2c1e-8b3d-4e5f-9a7b-1c2d3e4f5a6b",
  "name": "Nordic AM",
  "external_reference_id": "mgr-1",
  "lei": "529900T8BM49AURSDO55",
  "crd": null,
  "type": "internal",
  "origin": "v1",
  "owner": "tenant",
  "created_at": "2026-10-17T06:12:00Z",
  "custody_account_count": 3,
  "cash_account_count": 2
}