Skip to content

Portfolio Group Routes

The apps/v1 portfolio-group routes expose core msm portfolio group rows and their many-to-many membership relationship to PortfolioTable.

Portfolio groups are classification metadata. They do not own portfolio construction, weights, values, or signal generation. A portfolio can be in many groups, and a group can contain many portfolios.

Contracts

  • Groups use msm.api.portfolios.PortfolioGroup.
  • Membership rows use msm.api.portfolios.PortfolioGroupMembership.
  • Portfolio rows returned by group membership routes use msm.api.portfolios.Portfolio.
  • Deleting a group deletes only membership rows through database cascade; it does not delete portfolios.
  • Deleting a portfolio deletes only its group membership rows through database cascade; it does not delete groups.
+-----------------------------+        1..*        +-----------------------------------+
| PortfolioGroupTable         |------------------->| PortfolioGroupMembershipTable     |
|-----------------------------|                    |-----------------------------------|
| uid PK                      |                    | uid PK                            |
| unique_identifier unique    |                    | portfolio_group_uid FK cascade    |
| display_name                |                    | portfolio_uid FK cascade          |
| description                 |                    | unique(group, portfolio)          |
+-----------------------------+                    +------------------+----------------+
                                                                   |
                                                                   | *..1
                                                                   v
                                                        +-----------------------------+
                                                        | PortfolioTable              |
                                                        |-----------------------------|
                                                        | uid PK                      |
                                                        | unique_identifier unique    |
                                                        | calendar_uid FK NOT NULL    |
                                                        +-----------------------------+

List Portfolio Groups

GET /api/v1/portfolio-group/?response_format=frontend_list&search=&limit=50&offset=0

Returns PaginatedResponse[PortfolioGroup].

Create Or Upsert Group

POST /api/v1/portfolio-group/

The route is idempotent by unique_identifier:

{
  "unique_identifier": "core-portfolios",
  "display_name": "Core Portfolios",
  "description": "Core allocation mandates"
}

Update Group

PATCH /api/v1/portfolio-group/{uid}/

Updates mutable group fields: display_name, description, and metadata_json.

Delete Groups

DELETE /api/v1/portfolio-group/{uid}/
POST /api/v1/portfolio-group/bulk-delete/

Bulk delete accepts explicit group uids and/or unique_identifiers.

Add Portfolio To Group

POST /api/v1/portfolio-group/{uid}/portfolios/

The membership route accepts either a portfolio UID or portfolio unique identifier:

{
  "portfolio_uid": "portfolio-uid"
}
{
  "portfolio_unique_identifier": "example-equal-weight-portfolio"
}

Relationship Lists

GET /api/v1/portfolio-group/{uid}/portfolios/
GET /api/v1/portfolio-group/by-portfolio/{portfolio_uid}/

The first route returns all portfolios in a group. The second route returns all groups containing one portfolio. DELETE /api/v1/portfolio-group/{uid}/portfolios/{portfolio_uid}/ removes only the membership row.