private (owner only), team, and org — so you can share scoring results across your workspace.
GET /api/v1/locus/portfolios
Requires session authentication.
| Field | Type | Description |
|---|---|---|
member_count | int | Number of locations in the portfolio. |
weighted_composite | float | null | Weight-adjusted composite score across all locations. |
formula | object | null | Active scoring formula applied to this portfolio. |
metrics.weighted_delta_30d | float | null | 30-day score movement (positive = improving). |
metrics.coverage_pct | float | Percentage of locations with scoring data. |
metrics.severe_exposure_pct | float | Weighted percentage of locations scoring below 30. |
metrics.elevated_exposure_pct | float | Weighted percentage of locations scoring 30–50. |
metrics.stable_exposure_pct | float | Weighted percentage of locations scoring 50+. |
POST /api/v1/locus/portfolios
Requires session authentication.
asset_class, Locus automatically assigns the matching system scoring formula.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
name | string | ✓ | Portfolio name. |
description | string | Human-readable description. | |
asset_class | string | Asset class (e.g. qsr, retail, office, industrial, self_storage, data_center). Auto-assigns the system formula. | |
visibility | string | private (default), team, or org. | |
org_id | string | Workspace org id. Required when visibility is team or org. | |
team_id | string | Workspace team id. Optional, used with team visibility. |
Portfolio locations
Manage the H3 cell locations within a portfolio. Each location is identified by anh3_index and profile pair.
GET /api/v1/locus/portfolios/{portfolioId}/locations
Requires session authentication.
| Field | Type | Description |
|---|---|---|
weight | float | Relative importance of this location in portfolio aggregations (default 1). |
source | string | How the location was added: manual or import. |
composite | float | null | Score computed with the active formula, or the default composite if no formula is set. |
POST /api/v1/locus/portfolios/{portfolioId}/locations
Requires session authentication.
h3_index and profile already exists, it is updated (upsert).
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
h3_index | string | ✓ | H3 cell id at resolution 8. |
profile | string | Scoring profile (default general). | |
weight | number | Relative weight for portfolio aggregation (default 1). | |
asset_class | string | Asset class label for this location. | |
address_input | string | Original address for reference. | |
latitude | number | Latitude for display. | |
longitude | number | Longitude for display. |
PATCH /api/v1/locus/portfolios/{portfolioId}/locations
Requires session authentication.
| Name | Type | Required | Description |
|---|---|---|---|
h3_index | string | ✓ | H3 cell id to update. |
profile | string | Scoring profile (default general). | |
weight | number | New weight value (must be positive). | |
asset_class | string | New asset class label. |
DELETE /api/v1/locus/portfolios/{portfolioId}/locations
Requires session authentication.
| Name | Type | Required | Description |
|---|---|---|---|
h3_index | string | ✓ | H3 cell id to remove. |
profile | string | Scoring profile (default general). |
Bulk import
POST /api/v1/locus/portfolios/{portfolioId}/locations/import
Requires session authentication.
h3_index + profile) are updated; new ones are created.
Request body
Scoring refresh
GET /api/v1/locus/portfolios/{portfolioId}/refresh
Requires session authentication.
| Name | Type | Required | Description |
|---|---|---|---|
limit | number | Max runs to return (default 20, max 100). |
POST /api/v1/locus/portfolios/{portfolioId}/refresh
Requires session authentication.
| Status | Description |
|---|---|
queued | Waiting for the next processing cycle. |
running | Scoring is in progress. |
completed | All locations have been rescored. |
failed | An error occurred. Check error_message. |