Limits

Limits encode a client's investment-policy statement. They're rules like "no more than 30% in equities," "minimum 10% in cash across the family trust's reporting entity," "never hold more than 5% of a single private fund." Aleta evaluates every limit against the current reporting entity state on every data update, and surfaces breaches (and near-misses) through the dashboard and the webhook stream.

Types of limit

A limit is either proportional (percentage of AUM) or absolute (a currency amount). Most policy statements are expressed in proportions; absolute limits are useful for hard currency caps on single-position exposure.

  • Name
    Proportional
    Type
    percentage
    Description

    Bounded by a min, a max, or both, expressed as a fraction of the reporting entity's total market value.

  • Name
    Absolute
    Type
    currency amount
    Description

    Bounded by a cash number in the reporting entity's reference currency. Same min / max semantics.

Filters — what the limit applies to

The interesting bit of the limits model is the filter expression. Filters can target any subset of holdings — a single instrument, a class, a geography, a custom tag — and can be composed with and / or operators to express complex IPS rules.

  • Name
    ConditionFilter
    Type
    leaf
    Description

    A single predicate: instrument class equals X, issuer country equals Y, custom tag contains Z. The building block.

  • Name
    AndFilter
    Type
    composite
    Description

    Matches holdings that satisfy every inner filter. Use for intersections: "equities AND emerging markets."

  • Name
    OrFilter
    Type
    composite
    Description

    Matches holdings that satisfy at least one inner filter. Use for unions: "hedge funds OR private equity."

The three types compose freely, which is what lets the model express IPS rules that would otherwise require a rule engine.


GET/v2/clients/{id}/limits

List limits

Returns every limit configured on the client, with their filter expressions expanded. The response is compact enough to fetch eagerly when loading a limits editor UI.

Request

GET
/v2/clients/{id}/limits
curl https://api.aleta.io/v2/clients/{client_id}/limits \
  -H "Authorization: Bearer {token}"

POST/v2/limits

Create a limit

Creates a new limit. Pick proportional or absolute via the kind field; the filter expression can be a single condition or a deeply nested and/or composition.

Request

POST
/v2/limits
curl -X POST https://api.aleta.io/v2/limits \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "client_id": "...",
    "kind": "proportional",
    "max_pct": 0.30,
    "filter": {
      "kind": "condition",
      "field": "instrument_class.path",
      "operator": "starts_with",
      "value": ["equity"]
    }
  }'

GET/v2/limits/{id}/status

Status of a single limit

Returns the current value and the distance to the threshold — headroom in either units or a percentage depending on whether the limit is proportional or absolute.

Request

GET
/v2/limits/{id}/status
curl https://api.aleta.io/v2/limits/{id}/status \
  -H "Authorization: Bearer {token}"

GET/v2/clients/{id}/limits-status

Status of every limit

Batch version — walks every limit configured across the client's reporting entities and returns current compliance in one call. Prefer this over fanning out per-limit requests in a dashboard.

Request

GET
/v2/clients/{id}/limits-status
curl https://api.aleta.io/v2/clients/{client_id}/limits-status \
  -H "Authorization: Bearer {token}"