Introduction
Welcome to the StratiFi API!
With our API you can manage your portfolios in StratiFi and get information on various risks and scores.
This page describe the available API endpoints. You will find some code examples in the dark area to the right. Also, if you are familiar with Postman, you can consult and import this collection and play with the API.
Before start using the API you need contact us at support@stratifi.com and request API access. We will provide you a CLIENT ID an a SECRET KEY required to complete the authorization process.
If you want to know more about how the information is organized in StratiFi or want to familiarize with the API structure go to the About section. If you are ready to start, go to the Authorization section.
Overview
Our API follows a REST pattern, where HTTP methods define the action to perform and the endpoint URL determines the object(s) scope.
| HTTP method | Usage |
|---|---|
| GET | List objects or Retrieve a particular object if the ID is provided in the URL. |
| POST | Create object. |
| PUT | Update entire object. |
| PATCH | Update only the provided attributes. |
| DELETE | Delete object. |
The result of the operations is well described by standard HTTP response codes.
| HTTP response code | Description |
|---|---|
| 20x | Success |
| 30x | Resource moved |
| 400 | Bad Request -- Your request is invalid. |
| 401 | Unauthorized -- Your API key is wrong. |
| 403 | Forbidden -- The resource requested is hidden for administrators only. |
| 404 | Not Found -- The specified resource could not be found. |
| 405 | Method Not Allowed -- You tried to access a uri with an invalid method. |
| 429 | Too Many Requests -- You're making too many requests. Please allow some time for our server to serve your previous requests. |
| 500 | Internal Server Error -- We had a problem with our server. Try again later. |
| 503 | Service Unavailable -- We're temporarily offline for maintenance. Please try again later. |
The StratiFi API uses the following error codes:
Domain
We offer a sandbox where you can test safely: https://sandbox.stratifi.com
Once you are ready, you will get access to the production domain https://backend.stratifi.com
About StratiFi
You can think about data in StratiFi as a hierarchical structure where a companies are at the higher level and accounts at the bottom level.

Each object is linked to another in the upper level, for instance, an account has an investor_id attribute that
contains the ID of the investor that owns that account.
(*) Households are optional. An investor can be linked directly to the advisor.
Search & Filtering
You can search and filter objects returned by an endpoint using URL parameters.
For searching, you need to include the search parameter in the URL. e.g.
/api/v1/households/?search=Smith
For filtering, you need to include the desired attribute in the URL parameters. Each section describes the allowed
Filtering Fields for that endpoint. For instance, if you want to list the accounts of the investor with ID 31 you can
use
/api/v1/accounts/?investor=31
Authorization
We use the OAuth 2.0 protocol with PKCE, an industry standard for authorization management.
Make sure you have the CLIENT ID an a SECRET KEY provided by our support team. If you don't have them contact us at support@stratifi.com.
Authorization Code Flow + PCKE
Following the steps below you will get an access token that can be used to access StratiFi on behalf of the advisor.
PCKE
import base64
import hashlib
import random
import string
# generate the code verifier
code_verifier = "".join(
random.choice(string.ascii_uppercase + string.digits)
for _ in range(random.randint(43, 128))
)
code_verifier = base64.urlsafe_b64encode(code_verifier.encode("utf-8"))
# generate the code challenge
code_challenge = hashlib.sha256(code_verifier).digest()
code_challenge = (
base64.urlsafe_b64encode(code_challenge).decode("utf-8").replace("=", "")
)
Generate an authentication code grant with PKCE (Proof Key for Code Exchange).
- Generate a random strng between 43 and 128 characters, encode it in base64 and save it as
code_verifier. - Hash the
code_verifierwith SHA-256, encode it in base64 and save it ascode_challenge.
- Generate a random strng between 43 and 128 characters, encode it in base64 and save it as
Redirect the advisor to the StratiFi authorization page:
https://{{ domain }}/o/authorize/?response_type=code&code_challenge={{ code_challenge }}&code_challenge_method=S256&client_id={{ client_id }}&scope={{ scope }}&state={{ state }}Parameter Description domain StratiFi sandbox or production domain. response_type "code" state Random string generated by your application. It will be returned along with the code in the response. code_challenge Random string between 43 and 128 characters encoded with SHA-256. We use it to validate the token request. code_challenge_method "S256" client_id Provided by StratiFi. scope Required scopes. You will want to use "read write". The advisor submits the StratiFi credentials.

The advisor allow your application access the resources in StratiFi.

We redirect the browser to your return url with a single-usage access code.
https://{{ callback-url }}code={{ code }}&state={{ state }}&iss={{ issuer }}Parameter Description callback-url URL provided by you when during the application setup code Single-usage code that can be exchanged by an access token. state Random string generated by your application included in the authorization URL. iss The authorization server that issued the code, https://backend.stratifi.com/o. Check it before using the code (RFC 9207).Your application backend exchange the access code by an access token.
curl -X POST "https://backend.stratifi.com/o/token/" \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=authorization_code' \
--data-urlencode 'client_id={{ client_id }}' \
--data-urlencode 'client_secret={{ secret_key }}' \
--data-urlencode 'redirect_uri={{ redirect_url }}' \
--data-urlencode 'code={{ code }}' \
--data-urlencode 'code_verifier={{ code_verifier }}'
{
"access_token": "{{ access_token }}",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "{{ refresh_token }}",
"scope": "openid read write",
"advisor_id": 1,
"session_token": "{{ session_token }}",
"id_token": "{{ id_token }}"
}
Request Parameters
| Parameter | Type | |
|---|---|---|
| grant_type | string | Always "authorization_code" |
| code | string | The single-usage code received in the callback |
| code_verifier | string | The random string generated in the first step |
| redirect_uri | string | The callback URL |
| client_id | string | Your application client id |
| client_secret | string | Your application secret key |
Response
| Parameter | Type | |
|---|---|---|
| token_type | string | Always "Bearer" |
| access_token | string | An access token valid to consult other endpoints on behalf of the user |
| expires_in | string | Expiration time of the access token in seconds |
| refresh_token | string | A refresh token valid to renew the access token. See Refresh Token Flow. |
| scope | string | The scopes with granted access for this token |
| advisor_id | int | The ID of the advisor associated to this user |
| session_token | string | A short-lived token used to start a session in stratifi.com |
| id_token | string | An OpenID Connect ID token used to start a session in stratifi.com |
6. Include the Authorization header in your requests as follows:
Authorization: Bearer {{ access-token }}
Refresh Token Flow
If your access token expired you can renew it using a valid refresh token.
curl -X POST "https://backend.stratifi.com/o/token/" \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'client_id={{ client_id }}' \
--data-urlencode 'client_secret={{ secret_key }}' \
--data-urlencode 'refresh_token={{ refresh_token }}'
{
"access_token": "{{ access_token }}",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "{{ refresh_token }}",
"scope": "openid read write",
"advisor_id": 1,
"session_token": "{{ session_token }}",
"id_token": "{{ id_token }}"
}
Request Parameters
| Parameter | Type | |
|---|---|---|
| grant_type | string | Always "refresh_token" |
| refresh_token | string | Your Refresh Token |
| client_id | string | Your application client id |
| client_secret | string | Your application secret key |
Response
| Parameter | Type | |
|---|---|---|
| token_type | string | Always "Bearer" |
| access_token | string | An access token valid to consult other endpoints on behalf of the user |
| expires_in | string | Expiration time of the access token in seconds |
| refresh_token | string | An refresh token valid to renew the access token |
| scope | string | The scopes with granted access for this token |
| advisor_id | int | The ID of the advisor associated to this user |
| session_token | string | A short-lived token used to start a session in stratifi.com |
| id_token | string | An OpenID Connect ID token used to start a session in stratifi.com |
Client Credentials Flow
Server-to-server integrations that act on their own behalf (not on behalf of a specific advisor) authenticate with the
OAuth 2.0 client credentials grant. There is no user, no browser redirect and no PKCE: your backend exchanges its
client_id and client_secret directly for an access token. Contact support@stratifi.com to be issued a service-account
client_id / client_secret for this grant.
curl -X POST "https://backend.stratifi.com/o/token/" \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'client_id={{ client_id }}' \
--data-urlencode 'client_secret={{ secret_key }}' \
--data-urlencode 'scope=read write'
{
"access_token": "{{ access_token }}",
"token_type": "Bearer",
"expires_in": 36000,
"scope": "read write"
}
Request Parameters
| Parameter | Type | |
|---|---|---|
| grant_type | string | Always "client_credentials" |
| client_id | string | Your service-account client id |
| client_secret | string | Your service-account secret key |
| scope | string | Required scopes. Use "read write". |
Response
| Parameter | Type | |
|---|---|---|
| token_type | string | Always "Bearer" |
| access_token | string | An access token valid to consult the API as the service account |
| expires_in | int | Expiration time of the access token in seconds. Honor this value rather than hard-coding it. |
| scope | string | The scopes granted for this token |
Use the token the same way as any other, in the Authorization header:
Authorization: Bearer {{ access-token }}
Starting a session in stratifi.com
OIDC Flow (Recommended)
You can start a session in stratifi.com using the OpenID Connect protocol. To do so, you need to include the openid scope
when requesting the authorization code. The response will include an id_token property that you can use to start a session in stratifi.com.
curl -X POST "https://backend.stratifi.com/o/sso/" \
-H "Authorization: Bearer {{ access-token }}" \
-d "{'starting_url': '/advisor/investors'}"
redirection to "https://advisors.stratifi.com/advisor/investors/"
Making an authenticated request to the /o/sso/ endpoint will redirect the user to stratifi.com and start a session.
You can include an optional starting_url property to specify the path where the user will be redirected after starting the session.
If not provided, the user will be redirected to the default dashboard.
Session Token Flow(Deprecated)
The authorization responses described above contain a session_token property. This token automatically authenticates advisors in stratifi.com, meaning that the advisor won't be required to fill the credentials when visiting Stratifi.
To build an authenticated URL you need 3 parts:
- Base domain:
advisors-sandbox.stratifi.com(sandbox) oradvisors.stratifi.com(production) - Session Token: Received during the authorization flow.
- Path: The path you want to visit. You may be particularly interested in the following ones:
| Description | URL |
|---|---|
| Clients list | /advisor/investors/ |
| Clients overview | /advisor/investors/<id>/ |
| Prospects list | /advisor/prospects/ |
| Prospects overview | /advisor/prospects/<id>/ |
| Households list | /advisor/households/ |
| Households overview | /advisor/households/<id>/ |
| Model Portfolios list | /advisor/models/ |
| Model Portfolios overview | /advisor/models/<id>/ |
Having these 3 elements, the full URL is: https://{{ base_domain }}{{ path }}?session={{ sesison_token }}
For instance, https://advisors.stratifi.com/advisor/investors/1/?session=abc123 will lead the user
to the details page of the client with id 1.
Note: The session token has a life of 5 minutes. After that, you will need to follow the refresh token flow to get a new one. If you use an expired token in an URL, the user will be redirected to the signin page in Stratifi.
Retrieving logged user information
You can get basic information about the user related to a token by consulting the /userinfo endpoint.
The response includes the advisor ID and the session_token described above.
curl -X GET "https://backend.stratifi.com/api/v1/userinfo/"
{
"first_name":"John",
"last_name":"Wick",
"email":"john.wick@example.com",
"advisor_id": 1,
"session_token": "{{ session_token }}"
}
Response
| Name | Type | Description |
|---|---|---|
| first_name | string | User first name |
| last_name | string | User last name |
| string | User email address | |
| advisor_id | int | The ID of the advisor associated to this user |
| session_token | string | A short-lived token used to start a session in stratifi.com |
Single Sign-On
StratiFi supports SAML 2.0 Single Sign-On so your platform can send an advisor straight into the StratiFi web app without a StratiFi login screen. StratiFi acts as the SAML Service Provider (SP); your platform is the Identity Provider (IdP). SSO is provisioned per firm — contact support@stratifi.com to set it up.
Service Provider endpoints
Your SP endpoints are templated by a short org slug assigned to your firm. Download the metadata document from the metadata URL to configure your IdP; the SP Entity ID is that same metadata URL.
| Endpoint | URL |
|---|---|
| Metadata (SP Entity ID) | https://backend.stratifi.com/sso/saml/{{ org_slug }}/metadata/ |
| ACS (assertion consumer) | https://backend.stratifi.com/sso/saml/{{ org_slug }}/acs/ |
| SLS (single logout) | https://backend.stratifi.com/sso/saml/{{ org_slug }}/sls/ |
IdP-initiated sign-in
Your IdP issues a signed SAML assertion for the advisor and your application POSTs it to the ACS, optionally with a
RelayState that deep-links the advisor to a specific page:
<form method="POST" action="https://backend.stratifi.com/sso/saml/{{ org_slug }}/acs/">
<input type="hidden" name="SAMLResponse" value="{{ base64_signed_saml_response }}"/>
<input type="hidden" name="RelayState" value="/advisor/investors/{{ investor_id }}"/>
</form>
RelayState deep-link
RelayState opens StratiFi on a specific page after sign-in. It must be a bare, same-origin path: it starts with
/ and has no scheme, host, query string or fragment (for example /advisor/investors/42). StratiFi prepends its own
app origin, so the advisor lands at https://advisors.stratifi.com/advisor/investors/42. A value that is not a bare
same-origin path is ignored and the advisor lands on the StratiFi home page; omit RelayState for a plain sign-in.
The id in the path is the StratiFi investor id, not your external id — resolve it first with
GET /investors/?external_id={{ your_id }}.
| Description | RelayState path |
|---|---|
| Clients list | /advisor/investors/ |
| Client overview | /advisor/investors/<id> |
| Prospects list | /advisor/prospects/ |
| Prospect overview | /advisor/prospects/<id> |
| Households list | /advisor/households/ |
| Model Portfolios list | /advisor/models/ |
Requirements
- IdP-initiated SSO must be enabled for your firm (StratiFi configures this during setup).
- The SAML assertion must be signed.
- The NameID carries the advisor's email (format
emailAddressorunspecified); StratiFi matches it to an advisor. - The advisor must already exist as an active advisor in StratiFi with a matching email — there is no just-in-time provisioning.
Companies
Company Object Definition
Company Object
{
"id": 1,
"name": "Company A, LLC"
}
| Name | Type | Description |
|---|---|---|
| id | int | ID of the company |
| external_id | string | Your company identifier |
| name | string | Name of the company |
List Companies
List Companies
curl "https://backend.stratifi.com/api/v1/companies/" -H "Authorization: Bearer {{ access-token }}"
{
"count": 10,
"next": "https://backend.stratifi.com/api/v1/companies/?page=2",
"previous": null,
"results": [
{
"id": 1,
"external_id": "co-1",
"name": "Companny A, LLC"
},
…
]
}
-request-type: GET
-request-url: /companies/
Response Fields
| Name | Type | Description |
|---|---|---|
| count | int | Total number of companies |
| next | string | Link to next page of companies |
| previous | string | Link to previous page of companies |
| results | Object | List of company objects |
Filtering Fields
| Name | Type | Description |
|---|---|---|
| external_id | string | Your company identifier |
Get Company
Get Company
curl "https://backend.stratifi.com/api/v1/companies/1/" -H "Authorization: Bearer {{ access-token }}"
{
"id": 1,
"external_id": "co-1",
"name": "Companny A, LLC"
}
-request-type: GET
-request-url: /companies/<id>/
Response: The requested company object.
Create Company
Create Company
curl -X POST "https://backend.stratifi.com/api/v1/companies/" -H "Authorization: Bearer {{ access-token }}" \
-d '{"name": "Company Z, LLC", "external_id": "co-1",}'
{
"id": 11,
"external_id": "co-1",
"name": "Companny Z, LLC"
}
-request-type: POST
-request-url: /companies/
Request Parameters
| Parameter | Type | |
|---|---|---|
| name | string | Required |
| external_id | string | Optional |
Response: The new company object.
Update Company
Update Company
curl -X PUT "https://backend.stratifi.com/api/v1/companies/11/"
-H "Authorization: Bearer {{ access-token }}" \
-d '{"name": "Company W, LLC", "external_id": "co-1"}'
{
"id": 11,
"external_id": "co-1",
"name": "Companny W, LLC"
}
-request-type: PUT/PATCH
-request-url: /companies/<id>/
Request Parameters
| Parameter | Type | |
|---|---|---|
| name | string | Required |
| external_id | string | Optional |
Company Prism Aggregation
Company Prism Aggregation
curl "https://backend.stratifi.com/api/v1/companies/11/prism_aggregation/" -H "Authorization: Bearer {{ access-token }}"
{
"scores": {…},
"media": {…},
}
-request-type: GET
-request-url: /companies/<id>/prism_aggregation/
Response Fields
| Name | Type | Description |
|---|---|---|
| scores | Scores Factors | Risk score factors |
| media | Scores Images | Risk score factors images |
Users
User Object Definition
| Name | Type | Description |
|---|---|---|
| first_name | string | User first name |
| last_name | string | User last name |
| string | User email address |
User Object
{
"first_name":"John",
"last_name":"Wick",
"email":"john.wick@example.com"
}
Advisors
Advisor Object Definition
Advisor Object
{
"id": 1,
"external_id": "adv-1",
"company": 1,
"default_investor": 101,
"phone": "5555555555",
"title": "Co-founder",
"user": {
"first_name":"John",
"last_name":"Wick",
"email":"john.wick@example.com"
}
}
| Name | Type | Description |
|---|---|---|
| id | int | Advisor ID |
| external_id | string | Your advisor identifier |
| company | int | Company ID |
| default_investor | int | ID of the default investor of this advisor * |
| phone | string | Advisor Phone |
| title | string | Advisor Job Title |
| user | User Object | User info |
(*) Sometimes the advisor owns accounts that are not attached to an investor or the investor information is not available. In these cases, you can use the advisor default investor to create link accounts to the advisor without an investor.
List Advisors
List Advisors
curl "https://backend.stratifi.com/api/v1/advisors/" -H "Authorization: Bearer {{ access-token }}"
{
"count": 10,
"next": "https://backend.stratifi.com/api/v1/advisors/?page=2",
"previous": null,
"results": [
{
"id": 1,
"external_id": "adv-1",
"company": 1,
"default_investor": 101,
"phone": "5555555555",
"title": "Co-founder",
"user": {
"first_name":"John",
"last_name":"Wick",
"email":"john.wick@example.com"
}
},
…
]
}
-request-type: GET
-request-url: /advisors/
Response Fields
| Name | Type | Description |
|---|---|---|
| count | int | Total number of advisors |
| next | string | Link to next page of advisors |
| previous | string | Link to previous page of advisors |
| results | Object | List of advisor objects |
Filtering Fields
| Name | Type | Description |
|---|---|---|
| company | int | Company ID |
| external_id | string | Your advisor identifier |
Get Advisor
Get Advisor
curl "https://backend.stratifi.com/api/v1/advisors/1/" -H "Authorization: Bearer {{ access-token }}"
{
"id": 1,
"external_id": "adv-1",
"company": 1,
"default_investor": 101,
"phone": "5555555555",
"title": "Co-founder",
"user": {
"first_name":"John",
"last_name":"Wick",
"email":"john.wick@example.com"
},
}
-request-type: GET
-request-url: /advisors/<id>/
Response: The requested advisor object.
Create Advisor
Create Advisor
curl -X POST "https://backend.stratifi.com/api/v1/advisors/" -H "Authorization: Bearer {{ access-token }}" \
-d '{
"external_id": "adv-1",
"company": 1,
"phone": "754-3010",
"title": "CEO",
"user": {
"first_name": "Doug",
"last_name": "Spencer",
"email": "doug.spencer@example.com"
}
}'
{
"id": 150,
"external_id": "adv-1",
"company": 1,
"default_investor": 102,
"phone": "754-3010",
"title": "CEO",
"user": {
"first_name": "Doug",
"last_name": "Spencer",
"email": "doug.spencer@example.com"
}
}
-request-type: POST
-request-url: /advisors/
Request Parameters
| Parameter | Type | |
|---|---|---|
| user | User Object | Required |
| company | int | Required |
| phone | string | Optional |
| title | string | Optional |
| external_id | string | Optional |
Response: The new advisor object.
Update Advisor
Update Advisor
curl -X PUT "https://backend.stratifi.com/api/v1/advisors/150/" -H "Authorization: Bearer {{ access-token }}" \
-d '{
"external_id": "adv-1",
"title": "CEO/Founder",
"company": 1,
"phone": "754-3010",
"user": {
"first_name": "Doug",
"last_name": "Spencer",
"email": "dspencer@example.com"
}
}'
{
"id": 150,
"external_id": "adv-1",
"company": 1
"phone": "754-3010",
"default_investor": 102,
"title": "CEO/Founder",
"user": {
"first_name": "Doug",
"last_name": "Spencer",
"email": "dspencer@example.com"
}
}
-request-type: PUT/PATCH
-request-url: /advisors/<id>/
Request Parameters
| Parameter | Type | |
|---|---|---|
| user | User Object | Required |
| company | int | Required |
| phone | string | Optional |
| title | string | Optional |
| external_id | string | Optional |
Advisor Stats
Individual Advisor Stats
curl "https://backend.stratifi.com/api/v1/advisors/11/stats/" -H "Authorization: Bearer {{ access-token }}"
{
"risk": {
"scores": {
"overall": …
},
"media": {
"overall": { … }
}
},
"tolerance": {
"scores": {
"overall": …
},
"media": {
"overall": { … }
}
},
"drift": …
}
All Advisors Stats
curl "https://backend.stratifi.com/api/v1/advisors/stats/" -H "Authorization: Bearer {{ access-token }}"
{
"10": {
"risk": {
"scores": {
"overall": …
},
"media": {
"overall": { … }
}
},
"tolerance": {
"scores": {
"overall": …
},
"media": {
"overall": { … }
}
},
"drift": …
},
<advisor_id>: { … },
…
}
-request-type: GET
-request-url: /advisors/stats/
-request-url: /advisors/<id>/stats/
Response Fields
| Name | Type | Description |
|---|---|---|
| risk.scores.overall | float | Advisor risk score overall |
| risk.media.overall | Scores Media | Advisor risk score images |
| tolerance.scores.overall | float | Advisor tolerance score overall |
| tolerance.media.overall | Scores Media | Advisor tolerance score images |
| drift | float | Advisor drift score |
Teams
TeamMembership object definition
Request TeamMembership
{
"advisor": 1,
"is_primary": true|false
}
| Parameter | Type | Description |
|---|---|---|
| advisor | int | Advisor id |
| is_primary | bool | Boolean value indicating if the advisor is the primary advisor for the team |
Response TeamMembership
{
"advisor": {
"id": 1,
"user": {
"id": 1,
"first_name": "First",
"last_name": "Last",
"email": "first_last@stratifi.com"
},
"company": 1,
"title": "",
"phone": "+11111111111",
"default_investor": 2,
"external_id": ""
},
"is_primary": true|false
}
| Name | Type | Description |
|---|---|---|
| advisor | object | Advisor object |
| is_primary | bool | Boolean value indicating if the advisor is the primary advisor for the team |
Team object definition
Team Object
{
"id": 1,
"name": "Some Team",
"external_id": "45912d",
"description": "Team description",
"company": 1,
"rep_codes": ["rep_code1", "rep_code2"],
"team_memberships": [
{...TeamMembership Object},
{...TeamMembership Object}
]
}
| Name | Type | Description |
|---|---|---|
| id | int | Team id |
| name | string | Team name |
| external_id | string | External id |
| description | string | Team description |
| company | int | Company id |
| rep_codes | string list | List of rep codes |
| team_memberships | object list | List of team memberships |
List Teams
List Teams
curl "https://backend.stratifi.com/api/v1/teams/" -H "Authorization
{
"count": 1,
"next": null,
"previous": null,
"results": [
{...Team Object},
{...Team Object},
]
}
-request-type: GET
-request-url: /teams/
Response Fields
| Name | Type | Description |
|---|---|---|
| count | int | Total number of advisors |
| next | string | Link to next page of advisors |
| previous | string | Link to previous page of advisors |
| results | object list | List of team objects |
Filtering Fields
| Name | Type | Description |
|---|---|---|
| company | int | Company ID |
| external_id | string | Your advisor identifier |
Get team by id
Get team by id
curl "https://backend.stratifi.com/api/v1/teams/1/" -H "Authorization
{...Team Object}
-request-type: GET
-request-url: /teams/<team_id>
Response: The requested team object.
Create team
Create team
curl -X POST "https://backend.stratifi.com/api/v1/teams/" -H "Authorization
-d '{
"name": "Some Team",
"company": 1,
"team_memberships": [
{
"advisor": 1,
"is_primary": true
}
],
"external_id": "45912d",
"description": "Team description",
"rep_codes": ["rep_code1", "rep_code2"]
}'
{...New Team Object}
-request-type: POST
-request-url: /teams/
Request Parameters
| Parameter | Type | |
|---|---|---|
| name | string | Required |
| company | int | Required |
| team_memberships | team-memberships list | Optional |
| external_id | string | Optional |
| description | string | Optional |
| rep_codes | string list | Optional |
Response: The new team object.
Update team
Update team
curl -X PATCH "https://backend.stratifi.com/api/v1/teams/1/" -H "Authorization
-d '{
"name": "Some Team",
"company": 1,
"team_memberships": [
{
"advisor": 1,
"is_primary": true
}
]
}'
{...Updated Team Object}
-request-type: PUT/PATCH
-request-url: /teams/<id>/
Request Parameters
| Parameter | Type | PUT | PATCH |
|---|---|---|---|
| name | string | Required | Optional |
| company | int | Required | Optional |
| team_memberships | team-memberships list | Optional | Optional |
| external_id | string | Optional | Optional |
| description | string | Optional | Optional |
| rep_codes | string list | Optional | Optional |
The provided team_memberships list replaces the existing list. If not provided, no changes are made.
Response: The updated team object.
Delete team
Delete team
curl -X DELETE "https://backend.stratifi.com/api/v1/teams/1/" -H "Authorization
-request-type: DELETE
-request-url: /teams/<id>/
Households
Household Object Definition
Household Object
{
"id": 1,
"external_id": "hou-1",
"name": "Smith Family",
"advisor": 1,
"investment_objective": "Growth",
"investment_objective_custom": "",
"advisory_fee": 1.250,
"exceptions_enabled": true,
"created_at": "2026-01-15T14:02:11.482000Z",
"updated_at": "2026-10-09T18:30:45.120000Z",
"integration_link_updated_at": null,
"risk": {
"scores": {
"overall": 8.1,
"concentrated": 3.0,
"correlation": 3.0,
"tail": 2.0,
"volatility": 4.0
}
},
"tolerance": {
"scores": {
"overall": 3.0,
"concentrated": 3.0,
"correlation": 3.0,
"tail": 2.0,
"volatility": 4.0
}
},
"drift": 5.1,
"sources": […]
}
| Name | Type | Description |
|---|---|---|
| id | int | Household ID |
| external_id | string | Your household identifier |
| name | string | Household Name |
| advisor | int | Advisor ID |
| investment_objective | string | Name of one of your firm's standardized investment objectives (the firm of the household's advisor), exact match; "" when unset. Exclusive with investment_objective_custom: sending both is a 400, and writing one clears the other. |
| investment_objective_custom | string | Free-text investment objective for firms without standardized objectives |
| advisory_fee | decimal | Advisory fee, percent (for example 1.250) |
| exceptions_enabled | bool | Surveillance exceptions are raised for this household (default true) |
| created_at | datetime | Read only. When the household was created |
| updated_at | datetime | Read only. Last change to the household |
| integration_link_updated_at | datetime | Read only. Last time an integration updated the household |
| risk.scores | Scores Factors | Household aggregated risk scores |
| risk.media | Scores Media | Household aggregated risk scores images |
| tolerance.scores | Scores Factors | Household aggregated tolerance scores |
| tolerance.media | Scores Media | Household aggregated tolerance scores images |
| drift | float | Household drift score |
| sources | List of Sources Objects | List of sources that are associated with the household |
Households Source Object Definition
Source Object
{
{
"id": "",
"provider": "Stratifi API",
"provider_id": "0",
"created": "2024-07-08T09:39:07.103365Z",
"modified": "2024-07-08T09:44:35.463377Z"
}
}
| Name | Type | Description |
|---|---|---|
| id | string | ID of the source |
| provider | string | Source provider |
| provider_id | string | Source provider ID |
| created | string | Source created date |
| modified | string | Source modified date |
List Households
List Households
curl "https://backend.stratifi.com/api/v1/households/" -H "Authorization: Bearer {{ access-token }}"
{
"count": 10,
"next": "https://backend.stratifi.com/api/v1/households/?page=2",
"previous": null,
"results": [
{
"id": 1,
"external_id": "hou-1",
"name": "Smith Family"
"advisor": 1,
"risk": {…},
"tolerance": {…},
"drift": 5.1,
"sources": […]
},
…
]
}
-request-type: GET
-request-url: /households/
Response Fields
| Name | Type | Description |
|---|---|---|
| count | int | Total number of households |
| next | string | Link to next page of households |
| previous | string | Link to previous page of households |
| results | Object | List of household objects |
Filtering Fields
| Name | Type | Description |
|---|---|---|
| advisor | int | Advisor ID |
| external_id | string | Your household identifier |
| source_id | int | Source ID |
| source_provider | int | Source provider ID |
| source_provider_name | str | Source provider Name |
Get Household
Get Household
curl "https://backend.stratifi.com/api/v1/households/1/" -H "Authorization: Bearer {{ access-token }}"
{
"id": 1,
"external_id": "hou-1",
"name": "Smith Family"
"advisor": 1,
"risk": {…},
"tolerance": {…},
"drift": 5.1,
"sources": […]
}
-request-type: GET
-request-url: /households/<id>/
Response: The requested household object.
Create Household
Create Household
curl -X POST "https://backend.stratifi.com/api/v1/households/" -H "Authorization: Bearer {{ access-token }}" \
-d '{
"external_id": "hou-1",
"name": "Smith-Pinkett Family",
"advisor": 2,
"investment_objective": "Growth",
"advisory_fee": 1.25
}'
{
"id": 11,
"external_id": "hou-1",
"name": "Smith-Pinkett Family",
"advisor": 2,
"risk": {…},
"tolerance": {…},
"drift": 5.1,
"sources": […]
}
-request-type: POST
-request-url: /households/
Request Parameters
| Parameter | Type | |
|---|---|---|
| name | string | Required |
| advisor | int | Required |
| external_id | string | Optional |
| investment_objective, investment_objective_custom | string | Optional. Sending both is a 400 |
| advisory_fee | decimal | Optional |
| exceptions_enabled | bool | Optional |
Response: The new household object.
Update Household
Update Household
curl -X PUT "https://backend.stratifi.com/api/v1/households/2/"
-H "Authorization: Bearer {{ access-token }}" \
-d '{
"external_id": "hou-1",
"name": "Pinkett Family",
"advisor": 2
}'
{
"id": 11,
"external_id": "hou-1",
"name": "Pinkett Family",
"advisor": 2,
"risk": {…},
"tolerance": {…},
"drift": 5.1,
"sources": […]
}
-request-type: PUT/PATCH
-request-url: /households/<id>/
Request Parameters
| Parameter | Type | |
|---|---|---|
| name | string | Required |
| advisor | int | Required |
| external_id | string | Optional |
| investment_objective, investment_objective_custom | string | Optional. Sending both is a 400 |
| advisory_fee | decimal | Optional |
| exceptions_enabled | bool | Optional |
Household Prism Aggregation
Household Prism Aggregation
curl "https://backend.stratifi.com/api/v1/households/11/prism_aggregation/" -H "Authorization: Bearer {{ access-token }}"
{
"scores": {…},
"media": {…},
}
-request-type: GET
-request-url: /households/<id>/prism_aggregation/
Response Fields
| Name | Type | Description |
|---|---|---|
| scores | Scores Factors | Risk score factors |
| media | Scores Images | Risk score factors images |
| status | Scores Status | Risk score status |
Investors
Investor Object Definition
Investor Object
{
"id": 1,
"external_id": "inv-1",
"advisor": 1,
"household": 1,
"phone": "5555555555",
"is_prospect": false,
"user": {
"first_name":"John",
"last_name":"Wick",
"email":"john.wick@example.com"
},
"date_of_birth": "1980-05-17",
"marital_status": "married",
"dependants": 2,
"employment_status": "employed",
"occupation": "Architect",
"mailing_address": "1 Main St",
"city": "Austin",
"state": "TX",
"zip": "78701",
"country_of_citizenship": "US",
"country_of_residence": "US",
"investment_objective": "Growth",
"investment_objective_custom": "",
"investment_experience": 12,
"investment_experience_level": "moderate",
"time_horizon": null,
"time_horizon_bucket": "10_to_20",
"liquidity_needs": 25000.00,
"annual_income": 185000.00,
"annual_expenses": 90000.00,
"special_expenses": 15000.00,
"net_worth": 1250000.00,
"liquid_net_worth": 400000.00,
"investable_assets": 650000.00,
"advisory_fee": 1.250,
"tax_rate": 32.500,
"tax_bracket": "high",
"exceptions_enabled": true,
"clients_review_enabled": true,
"checkins_enabled": true,
"created_at": "2026-01-15T14:02:11.482000Z",
"updated_at": "2026-10-09T18:30:45.120000Z",
"next_review_date": "2027-01-15",
"integration_link_updated_at": null,
"risk": {
"scores": {
"overall": 8.1,
"concentrated": 3.0,
"correlation": 3.0,
"tail": 2.0,
"volatility": 4.0
}
},
"tolerance": {
"scores": {
"overall": 3.0,
"concentrated": 3.0,
"correlation": 3.0,
"tail": 2.0,
"volatility": 4.0
}
},
"drift": 5.1,
"sources": […]
}
| Name | Type | Description |
|---|---|---|
| id | int | Investor ID |
| external_id | string | Your investor identifier |
| advisor | int | Advisor ID |
| household | int | Household ID |
| is_prospect | bool | true for a prospect, false (default) for a client. Adding a prospect requires your firm's permission to add prospects; turning a prospect into a client excludes its accounts, as in the StratiFi app |
| phone | string | Phone of the investor |
| user | User Object | User info |
| date_of_birth | date | Date of birth (YYYY-MM-DD), not in the future |
| marital_status | string | One of single, married, divorced, widowed, domestic_partner |
| dependants | int | Number of dependants |
| employment_status | string | One of employed, self_employed, retired, unemployed, student, homemaker |
| occupation | string | Occupation |
| mailing_address | string | Street address |
| city | string | City |
| state | string | State or region |
| zip | string | Postal code |
| country_of_citizenship | string | ISO 3166-1 alpha-2 country code, upper case (for example US) |
| country_of_residence | string | ISO 3166-1 alpha-2 country code, upper case (for example US) |
| investment_objective | string | Name of one of your firm's standardized investment objectives (the firm of the investor's advisor), exact match; "" when unset. Exclusive with investment_objective_custom |
| investment_objective_custom | string | Free-text investment objective for firms without standardized objectives. Exclusive with investment_objective |
| investment_experience | int | Years of investing experience |
| investment_experience_level | string | One of none, limited, moderate, extensive |
| time_horizon | int | Investment time horizon in exact years. Exclusive with time_horizon_bucket |
| time_horizon_bucket | string | One of under_5, 5_to_10, 10_to_20, over_20. Exclusive with time_horizon |
| liquidity_needs | decimal | Dollar amount the investor needs to keep liquid |
| annual_income | decimal | Annual income |
| annual_expenses | decimal | Annual expenses |
| special_expenses | decimal | Planned special expenses |
| net_worth | decimal | Total net worth |
| liquid_net_worth | decimal | Liquid net worth |
| investable_assets | decimal | Investable assets |
| advisory_fee | decimal | Advisory fee, percent (for example 1.250) |
| tax_rate | decimal | Income tax rate, percent |
| tax_bracket | string | One of low, medium, high, top |
| exceptions_enabled | bool | Read only. Surveillance exceptions are raised for this investor; switched in the StratiFi app |
| clients_review_enabled | bool | Read only. The investor is included in client reviews; switched in the StratiFi app |
| checkins_enabled | bool | Read only. Check-ins are sent to the investor; switched in the StratiFi app |
| created_at | datetime | Read only. When the investor was created |
| updated_at | datetime | Read only. Last change to the investor |
| next_review_date | date | Read only. Earliest next review date across the investor's accounts |
| integration_link_updated_at | datetime | Read only. Last time an integration updated the investor |
| risk.scores | Scores Factors | Investor aggregated risk scores |
| risk.media | Scores Media | Investor aggregated risk scores images |
| tolerance.scores | Scores Factors | Investor aggregated tolerance scores |
| tolerance.media | Scores Media | Investor aggregated tolerance scores images |
| drift | float | Investor drift score |
| sources | List of Sources Objects | List of sources that are associated with the investor |
Investor Source Object Definition
Source Object
{
{
"id": "",
"provider": "Stratifi API",
"provider_id": "0",
"created": "2024-07-08T09:39:07.103365Z",
"modified": "2024-07-08T09:44:35.463377Z"
}
}
| Name | Type | Description |
|---|---|---|
| id | string | ID of the source |
| provider | string | Source provider |
| provider_id | string | Source provider ID |
| created | string | Source created date |
| modified | string | Source modified date |
List Investors
List Investors
curl "https://backend.stratifi.com/api/v1/investors/" -H "Authorization: Bearer {{ access-token }}"
{
"count": 10,
"next": "https://backend.stratifi.com/api/v1/investors/?page=2",
"previous": null,
"results": [
{
"id": 1,
"external_id": "inv-1",
"advisor": 1,
"household": 1,
"phone": "5555555555",
"user": {
"first_name":"John",
"last_name":"Wick",
"email":"john.wick@example.com"
},
"risk": {…},
"tolerance": {…},
"drift": 5.1,
"sources": […]
},
…
]
}
-request-type: GET
-request-url: /investors/
Response Fields
| Name | Type | Description |
|---|---|---|
| count | int | Total number of investors |
| next | string | Link to next page of investors |
| previous | string | Link to previous page of investors |
| results | Object | List of investor objects |
Filtering Fields
| Name | Type | Description |
|---|---|---|
| advisor | int | Advisor ID |
| household | int | Household ID |
| external_id | string | Your investor identifier |
| is_prospect | bool | true lists prospects, false lists clients (1/0 also accepted). Without it the list returns clients only, as before |
| source_id | int | Source ID |
| source_provider | int | Source provider ID |
| source_provider_name | str | Source provider Name |
Get Investor
Get Investor
curl "https://backend.stratifi.com/api/v1/investors/1/" -H "Authorization: Bearer {{ access-token }}"
{
"id": 1,
"external_id": "inv-1",
"advisor": 1,
"household": 1,
"phone": "5555555555",
"user": {
"first_name":"John",
"last_name":"Wick",
"email":"john.wick@example.com"
},
"risk": {…},
"tolerance": {…},
"drift": 5.1,
"sources": […]
}
-request-type: GET
-request-url: /investors/<id>/
Response: The requested investor object.
Create Investor
Create Investor
curl -X POST "https://backend.stratifi.com/api/v1/investors/" -H "Authorization: Bearer {{ access-token }}" \
-d '{
"external_id": "inv-1",
"advisor": 1,
"household": 1,
"phone": "754-3010",
"user": {
"first_name": "Brian",
"last_name": "May",
"email": "brian.may@example.com"
},
"date_of_birth": "1947-07-19",
"employment_status": "self_employed",
"investment_objective": "Growth",
"time_horizon_bucket": "over_20",
"net_worth": 1250000,
"tax_bracket": "high"
}'
{
"id": 150,
"external_id": "inv-1",
"advisor": 1,
"household": 1,
"phone": "754-3010",
"user": {
"first_name": "Brian",
"last_name": "May",
"email": "brian.may@example.com"
},
"risk": {…},
"tolerance": {…},
"drift": 5.1,
"sources": […]
}
-request-type: POST
-request-url: /investors/
Request Parameters
| Parameter | Type | |
|---|---|---|
| user | User Object | Required |
| advisor | int | Required |
| household | int | Optional |
| phone | string | Optional |
| external_id | string | Optional |
| is_prospect | bool | Optional |
| date_of_birth, marital_status, dependants, employment_status, occupation, mailing_address, city, state, zip, country_of_citizenship, country_of_residence | see Investor Object | Optional |
| investment_objective, investment_objective_custom, investment_experience, investment_experience_level, time_horizon, time_horizon_bucket, liquidity_needs | see Investor Object | Optional. Sending both halves of an exclusive pair returns a 400 |
| annual_income, annual_expenses, special_expenses, net_worth, liquid_net_worth, investable_assets, advisory_fee, tax_rate, tax_bracket | see Investor Object | Optional |
The objective and the time horizon are exclusive pairs: sending both halves in one request returns a 400, and setting one clears the other.
Response: The new investor object.
Update Investor
Update Investor
curl -X PUT "https://backend.stratifi.com/api/v1/investors/150/" -H "Authorization: Bearer {{ access-token }}" \
-d '{
"external_id": "inv-1",
"advisor": 1,
"household": 1,
"phone": "754-3010",
"user": {
"first_name": "Brian",
"last_name": "May",
"email": "b.may@example.com"
}
}'
{
"id": 150,
"external_id": "inv-1",
"advisor": 1
"phone": "754-3010",
"user": {
"first_name": "Brian",
"last_name": "May",
"email": "b.may@example.com"
},
"risk": {…},
"tolerance": {…},
"drift": 5.1,
"sources": […]
}
-request-type: PUT/PATCH
-request-url: /investors/<id>/
Request Parameters
| Parameter | Type | |
|---|---|---|
| user | User Object | Required |
| advisor | int | Required |
| household | int | Optional |
| phone | string | Optional |
| external_id | string | Optional |
| is_prospect | bool | Optional |
| date_of_birth, marital_status, dependants, employment_status, occupation, mailing_address, city, state, zip, country_of_citizenship, country_of_residence | see Investor Object | Optional |
| investment_objective, investment_objective_custom, investment_experience, investment_experience_level, time_horizon, time_horizon_bucket, liquidity_needs | see Investor Object | Optional. Sending both halves of an exclusive pair returns a 400 |
| annual_income, annual_expenses, special_expenses, net_worth, liquid_net_worth, investable_assets, advisory_fee, tax_rate, tax_bracket | see Investor Object | Optional |
A prospect is reachable by id like a client, so it can be read, updated and deleted. Fields set from the client's paperwork by OperationsIQ cannot be changed through the API: sending a different value, or the other half of its exclusive pair, returns a 400 naming the field. Sending the stored value back is accepted.
Investor Prism Aggregation
Investor Prism Aggregation
curl "https://backend.stratifi.com/api/v1/investors/11/prism_aggregation/" -H "Authorization: Bearer {{ access-token }}"
{
"scores": {…},
"media": {…},
}
-request-type: GET
-request-url: /investors/<id>/prism_aggregation/
Response Fields
| Name | Type | Description |
|---|---|---|
| scores | Scores Factors | Risk score factors |
| media | Scores Images | Risk score factors images |
| status | Scores Status | Risk score status |
Risk and Tolerance
Risk statuses
Calculating scores for a portfolio might take some time (from a few seconds to a few minutes). In order to make our system more responsive, we calculate the scores in asynchronously. That means that when an account is created or updated, we will be able to provide an immediate answer to the request and, at the same time, queue the score calculation. In the response, we provide a readable status that indicates what is happening in background. The available statuses are:
| Name | Type | Description |
|---|---|---|
| pending (Default) | string | The risk score calculation has not started |
| processing | string | The risk score calculation is in progress or the existing score is outdated |
| error | string | The last risk score calculation failed |
| ready | string | The risk score calculation is completed and is up to date |
Scores Factors
Scores Factors
{
"overall": 8.1,
"concentrated": 1.0,
"correlation": 8.0,
"tail": 9.0,
"volatility": 8.0
}
| Name | Type | Description |
|---|---|---|
| overall | float | Overall score |
| concentrated | float | Concentrated score |
| correlation | float | Correlation score |
| tail | float | Tail score |
| volatility | float | Volatility score |
Scores Media
Scores Images
{
"overall": {
"large": "https://scores-media.stratifi.com/10/large/81.png",
"medium": "https://scores-media.stratifi.com/10/medium/81.png",
"compact": "https://scores-media.stratifi.com/10/compact/81.png"
},
"concentrated": {
"large": "https://scores-media.stratifi.com/10/large/10.png",
"medium": "https://scores-media.stratifi.com/10/medium/10.png",
"compact": "https://scores-media.stratifi.com/10/compact/10.png"
},
"correlation": {
"large": "https://scores-media.stratifi.com/10/large/80.png",
"medium": "https://scores-media.stratifi.com/10/medium/80.png",
"compact": "https://scores-media.stratifi.com/10/compact/80.png"
},
"tail": {
"large": "https://scores-media.stratifi.com/10/large/90.png",
"medium": "https://scores-media.stratifi.com/10/medium/90.png",
"compact": "https://scores-media.stratifi.com/10/compact/90.png"
},
"volatility": {
"large": "https://scores-media.stratifi.com/10/large/80.png",
"medium": "https://scores-media.stratifi.com/10/medium/80.png",
"compact": "https://scores-media.stratifi.com/10/compact/80.png"
}
}
| Name | Type | Description |
|---|---|---|
| overall | string | Overall score image URLs |
| concentrated | string | Concentrated score image URLs |
| correlation | string | Correlation score image URLs |
| tail | string | Tail score image URLs |
| volatility | string | Volatility score image URLs |
Notice that we provide 3 image versions for each one of the score factors. You can use the version that better adjust to your site layout.
- large:

- medium:

- compact:

Risk Object Definition
Risk Object
{
"scores": {
"overall": 8.1,
"concentrated": 1.0,
"tail": 9.0,
"correlation": 8.0,
"volatility": 8.0
},
"media": {
"overall": {
"large": "https://scores-media.stratifi.com/10/large/81.png",
"medium": "https://scores-media.stratifi.com/10/medium/81.png",
"compact": "https://scores-media.stratifi.com/10/compact/81.png"
},
"concentrated": {
"large": "https://scores-media.stratifi.com/10/large/10.png",
"medium": "https://scores-media.stratifi.com/10/medium/10.png",
"compact": "https://scores-media.stratifi.com/10/compact/10.png"
},
"correlation": {
"large": "https://scores-media.stratifi.com/10/large/80.png",
"medium": "https://scores-media.stratifi.com/10/medium/80.png",
"compact": "https://scores-media.stratifi.com/10/compact/80.png"
},
"tail": {
"large": "https://scores-media.stratifi.com/10/large/90.png",
"medium": "https://scores-media.stratifi.com/10/medium/90.png",
"compact": "https://scores-media.stratifi.com/10/compact/90.png"
},
"volatility": {
"large": "https://scores-media.stratifi.com/10/large/80.png",
"medium": "https://scores-media.stratifi.com/10/medium/80.png",
"compact": "https://scores-media.stratifi.com/10/compact/80.png"
}
},
"status": "processing",
"created": "2021-04-21T15:11:37.564188",
"top_risk_attributions": [
{
"ticker_name": "VANGUARD TARGET 2045",
"ticker": "OPPI",
"risk": 0.9997862976486193,
"weight": 99.763225
},
{
"ticker_name": "Fha Non Int Bearing",
"ticker": "UNTB",
"risk": 0.00021370235138087705,
"weight": 0.236775
}
],
"scenarios": [
{
"risk": 8.8,
"name": "Global Financial Crisis",
"end_date": "2009-2-1",
"start_date": "2007-2-1"
},
{
"risk": 8.8,
"name": "2011 Euro Credit Crisis",
"end_date": "2012-1-1",
"start_date": "2010-1-1"
},
{
"risk": 8.1,
"name": "2013 Taper Tantrum",
"end_date": "2014-6-1",
"start_date": "2012-6-1"
},
{
"risk": 7.7,
"name": "2015-16 Market Selloff",
"end_date": "2017-1-1",
"start_date": "2015-1-1"
}
]
}
| Name | Type | Description |
|---|---|---|
| scores | Scores Factors | Risk score factors |
| media | Scores Images | Risk score factors images |
| status | Risk Status | Risk score status |
| created | date | Score timestamp |
| top_risk_attributions[].ticker | string | Risk attribution ticker |
| top_risk_attributions[].ticker_name | string | Risk attribution ticker description |
| top_risk_attributions[].risk | float | Risk attribution overall score |
| top_risk_attributions[].weight | float | Risk attribution weight |
| scenarios[].name | string | Scenario name |
| scenarios[].start_date | string | Scenario start date |
| scenarios[].end_date | string | Scenario end date |
| scenarios[].risk | float | Scenario overall risk |
Tolerance Object Definition
Tolerance Object
{
"scores": {
"overall": 6.4,
"concentrated": 5.0,
"correlation": 5.0,
"tail": 5.0,
"volatility": 8.0
},
"media": {
"overall": {
"large": "https://scores-media.stratifi.com/10/large/64.png",
"medium": "https://scores-media.stratifi.com/10/medium/64.png",
"compact": "https://scores-media.stratifi.com/10/compact/64.png"
},
"concentrated": {
"large": "https://scores-media.stratifi.com/10/large/50.png",
"medium": "https://scores-media.stratifi.com/10/medium/50.png",
"compact": "https://scores-media.stratifi.com/10/compact/50.png"
},
"correlation": {
"large": "https://scores-media.stratifi.com/10/large/50.png",
"medium": "https://scores-media.stratifi.com/10/medium/50.png",
"compact": "https://scores-media.stratifi.com/10/compact/50.png"
},
"tail": {
"large": "https://scores-media.stratifi.com/10/large/50.png",
"medium": "https://scores-media.stratifi.com/10/medium/50.png",
"compact": "https://scores-media.stratifi.com/10/compact/50.png"
},
"volatility": {
"large": "https://scores-media.stratifi.com/10/large/80.png",
"medium": "https://scores-media.stratifi.com/10/medium/80.png",
"compact": "https://scores-media.stratifi.com/10/compact/80.png"
}
}
}
| Name | Type | Description |
|---|---|---|
| scores | Scores Factors | Tolerance score factors |
| media | Scores Images | Tolerance score factors images |
Positions
Positions are the holdings of an account and the target allocation of a model portfolio. They are sent and returned inside the positions list of their parent; there is no positions endpoint.
Sending positions on create or update replaces the whole list: holdings that are not sent are removed. A position is matched to the one it replaces by ticker, then by cusip.
Account Position Object Description:
{
"id": 98213,
"ticker": "GOOGL",
"ticker_name": "ALPHABET INC CLASS A",
"cusip": "02079K305",
"isin": "US38259P5089",
"type": "Equity",
"subtype": "US",
"sector": "Large Cap",
"security_type": "Common Stock",
"value": 36275.50,
"quantity": 780,
"price": 46.5070,
"unit": "shares",
"cost_basis": 44473.96,
"unrealized_gains": -8198.46,
"purchase_date": "2021-03-15",
"excluded": false,
"created_at": "2026-01-05T14:12:09.120000Z",
"updated_at": "2026-10-10T09:30:00.000000Z"
}
| Name | Type | Description | - |
|---|---|---|---|
| id | int | Position ID. Stable while the holding keeps its ticker or cusip; a holding sent under a new identifier gets a new id | Read-only |
| ticker | string | Asset symbol | Required |
| ticker_name | string | Asset description | Optional |
| cusip | string | Asset cusip | Optional |
| isin | string | ISIN identifier | Optional |
| type | string | Position type | Read-only |
| subtype | string | Position subtype | Read-only |
| sector | string | Position sector | Read-only |
| security_type | string | Security type | Read-only |
| value | number | Value | Required |
| quantity | number | Number of units of the security held | Optional |
| price | number | Price per unit of the security (value / quantity) |
Read-only |
| unit | string | Denomination of each unit of the security | Optional |
| cost_basis | number | The total cost of the position | Optional |
| unrealized_gains | number | Unrealized gains of the position. Kept when an update leaves it out | Optional |
| purchase_date | date | Purchase date (YYYY-MM-DD). Kept when an update leaves it out |
Optional |
| excluded | bool | Left out of risk monitoring and PRISM. See excluded positions. | Optional |
| created_at | datetime | When the position was created | Read-only |
| updated_at | datetime | When one of the position's values last changed; sending the same values again does not move it | Read-only |
Excluded positions
Excluded positions are returned with the rest of the holdings, with excluded: true. Since sending positions replaces the whole list, send them back when you update an account, or they are removed.
- A position sent without
excludedkeeps the state of the holding it replaces (falsefor a new holding). - Changing
excludedon an existing holding, or sending a new holding withexcluded: true, follows the same rule as the StratiFi app: managers and above can always do it, advisors only when their company allows advisors to exclude positions. Otherwise the request is rejected with a400that lists the holdings. - When the same holding appears in more than one row, the rows are merged and the last row that states
excludeddecides.
id, created_at and updated_at are ignored when sent, so positions can be sent back as they were read.
Model portfolio positions
Model Position Object Description:
{
"id": 5521,
"ticker": "VTI",
"ticker_name": "VANGUARD TOTAL STOCK MARKET ETF",
"cusip": "922908769",
"isin": "US9229087690",
"type": "Equity",
"subtype": "US",
"sector": "Large Cap",
"security_type": "ETF",
"value": 60.0,
"created_at": "2026-01-05T14:12:09.120000Z",
"updated_at": "2026-10-10T09:30:00.000000Z"
}
Model positions carry id, ticker, ticker_name, cusip, isin, type, subtype, sector, security_type, value (the weight, a percentage), created_at and updated_at, with the same rules as account positions. They have no quantity, price, cost basis or exclusion.
Accounts
Account Object Definition
Account Object
{
"id": 1,
"external_id": "act-1",
"name": "John Doe Trust",
"value": "1234567.89",
"type": "100",
"tax_status": "taxable",
"number": "987654321",
"investor": 1,
"advisor": 1,
"matching_model": 1,
"strategy": 1,
"nickname": "Mom's brokerage",
"inception_date": "2019-03-01",
"close_date": null,
"relationship_type": "advisory",
"retirement_category": "non_retirement",
"held_away": false,
"excluded": false,
"custodian": "Charles Schwab",
"investment_objective": "Growth",
"investment_objective_custom": "",
"exceptions_enabled": true,
"clients_review_enabled": true,
"created_at": "2026-01-15T14:02:11.482000Z",
"updated_at": "2026-10-09T18:30:45.120000Z",
"provider": "Charles Schwab",
"integration_link_updated_at": "2026-10-09T18:30:45.120000Z",
"sync_status": "ready",
"sync_status_changed": "2026-10-09T18:30:45.120000Z",
"next_review_date": "2027-01-15",
"display_name": "Mom's brokerage",
"display_number": "******4321",
"positions": […],
"risk": {…},
"tolerance": {…},
"drift": 1.7,
"sources": […],
"teams": […]
}
| Name | Type | Description |
|---|---|---|
| id | int | Account ID |
| external_id | string | Your account identifier |
| name | string | Account name |
| value | string | Account value |
| type | string | Account type . |
| tax_status | string | Account tax status. One of these values. |
| number | string | Account number |
| matching_model | int | Account strategy represented as Model Portfolio Id. You can find the desired model portfolio using the list or get endpoint. null when the account has no strategy. |
| strategy | int | Alias of matching_model, kept for integrations built on the original field name. It is returned with the same value and accepted on create and update. If both names are sent they must carry the same value, otherwise the request is rejected with a 400. |
| investor | int | Investor ID. A new account needs an investor or an advisor; an update cannot clear it. |
| advisor | int | Advisor ID. Ideally, you would provide the investor ID. However, if you don't have that information but you know who is the advisor that owns this account then you can pass the advisor ID. We will assign the account to the default_investor of the selected advisor. |
| positions[] | List of Positions Objects | Account holdings |
| risk | Risk Object | Account risk |
| tolerance | Tolerance Object | Account tolerance |
| drift | float | Drift between the risk and the tolerance overall scores |
| sources | List of Sources Objects | List of sources that are associated with the account |
| teams | List of Teams Ids | List of teams ids that are associated with the account |
| nickname | string | Advisor-facing display name. name is fed by the custodian and may be overwritten on sync; use nickname to rename. |
| inception_date | date | Date the account was opened (YYYY-MM-DD) |
| close_date | date | Date the account was closed; null while open |
| relationship_type | string | One of brokerage, advisory; "" or null clears it |
| retirement_category | string | Read only. One of non_retirement, ira, qualified, education, retirement_other, derived from type on create and whenever type changes. |
| held_away | bool | The account is not managed by the firm |
| excluded | bool | Left out of aggregations and PRISM rollups. Defaults to the value of held_away on create. |
| custodian | string | Custodian name from the StratiFi catalogue. The whole name or one of its alternative names must match, ignoring case (a fragment does not match); the canonical name is returned. "" or null clears it; an unknown name is a 400. |
| investment_objective | string | Name of one of your firm's standardized investment objectives; "" when unset. Exclusive with investment_objective_custom: sending both is a 400, and writing one clears the other. |
| investment_objective_custom | string | Free-text investment objective for firms without standardized objectives |
| exceptions_enabled | bool | Surveillance exceptions are raised for this account (default true) |
| clients_review_enabled | bool | The account is included in client reviews (default true) |
| created_at | datetime | Read only. When the account was created |
| updated_at | datetime | Read only. Last change to the account |
| provider | string | Read only. Integration that created the account (for example Stratifi API, Orion, Charles Schwab); null for accounts created in the app |
| integration_link_updated_at | datetime | Read only. Last time an integration updated the account |
| sync_status | string | Read only. Synchronisation state: ready, syncing or error (status is the PRISM score status) |
| sync_status_changed | datetime | Read only. When sync_status last changed |
| next_review_date | date | Read only. Next client review date for the account |
| display_name | string | Read only. nickname when set, otherwise the name with the number |
| display_number | string | Read only. Account number, masked when the firm masks numbers |
Account Source Object Definition
Source Object
{
{
"id": "",
"provider": "Stratifi API",
"provider_id": "0",
"created": "2024-07-08T09:39:07.103365Z",
"modified": "2024-07-08T09:44:35.463377Z"
}
}
| Name | Type | Description |
|---|---|---|
| id | string | ID of the source |
| provider | string | Source provider |
| provider_id | string | Source provider ID |
| created | string | Source created date |
| modified | string | Source modified date |
Account Tax Statuses
| Value | Description |
|---|---|
| taxable | Taxable accounts |
| exempt | Tax Exempt accounts |
| deferred | Tax Deferred accounts |
List Accounts
-request-type: GET
-request-url: /accounts/
List Accounts
curl "https://backend.stratifi.com/api/v1/accounts/" -H "Authorization: Bearer {{ access-token }}"
{
"count": 10,
"next": "https://backend.stratifi.com/api/v1/accounts/?page=2",
"previous": null,
"results": [
{
"id": 1,
"external_id": "act-1",
"name": "John Doe Trust",
"value": "1234567.89",
"type": "100",
"tax_status": "taxable",
"number": "987654321",
"investor": 1,
"advisor": 1,
"matching_model": 1,
"strategy": 1,
"positions": [ … ],
"risk": { … },
"tolerance": { … },
"drift": 1.0,
"sources": […],
"teams": […]
},
…
]
}
Response Fields
| Name | Type | Description |
|---|---|---|
| count | int | Total number of accounts |
| next | string | Link to next page of accounts |
| previous | string | Link to previous page of accounts |
| results | Object | List of account objects |
Filtering Fields
| Name | Type | Description |
|---|---|---|
| external_id | string | Your account identifier |
| investor | int | Investor ID |
| household | int | Household ID |
| source_id | int | Source ID |
| source_provider | int | Source provider ID |
| source_provider_name | str | Source provider Name |
Get Account
Get Account
curl "https://backend.stratifi.com/api/v1/accounts/1/" -H "Authorization: Bearer {{ access-token }}"
{
"id": 1,
"external_id": "act-1",
"name": "John Doe Trust",
"value": "1234567.89",
"type": "100",
"tax_status": "tax-exempt",
"number": "987654321",
"investor": 1,
"advisor": 1,
"matching_model": 1,
"strategy": 1,
"positions": [ … ],
"risk": { … },
"tolerance": { … },
"drift": 1.0,
"sources": […],
"teams": […]
}
-request-type: GET
-request-url: /accounts/<id>/
Response: The requested account object.
Create Account
Create Account
curl -X POST "https://backend.stratifi.com/api/v1/accounts/" -H "Authorization: Bearer {{ access-token }}" \
-d '{
"external_id": "act-1",
"name": "John Doe Trust",
"value": "1234567.89",
"type": "100",
"tax_status": "tax-exempt",
"number": "987654321",
"investor": 1,
"nickname": "Mom's brokerage",
"custodian": "Schwab",
"relationship_type": "advisory",
"investment_objective": "Growth",
"positions": [
{
"ticker": "SPY",
"ticker_name": "SPDR S&P 500",
"value": "823045.26"
},
{
"ticker": "IBM",
"ticker_name": "IBM",
"value": "411522.63"
},
…
],
"teams": [1]
}'
{
"id": 1,
"external_id": "act-1",
"name": "John Doe Trust",
"value": "1234567.89",
"type": "100",
"tax_status": "tax-exempt",
"number": "987654321",
"investor": 1,
"advisor": 1,
"matching_model": 1,
"strategy": 1,
"positions": [ … ],
"risk": { … },
"tolerance": { … },
"drift": 1.0,
"sources": […],
"teams": [1]
}
-request-type: POST
-request-url: /accounts/
Request Parameters
| Parameter | Type | |
|---|---|---|
| name | string | Required |
| positions[] | List of Positions Objects | Required |
| value | string | Optional |
| type | string | Optional |
| tax_status | string | Optional |
| number | string | Optional |
| investor | int | Required unless advisor is sent |
| advisor | int | Required unless investor is sent |
| matching_model | int | Optional |
| strategy | int | Optional, alias of matching_model |
| external_id | string | Optional |
| nickname, inception_date, close_date, relationship_type, held_away, excluded | see Account Object | Optional |
| custodian | string | Optional, custodian name |
| investment_objective, investment_objective_custom | string | Optional. Sending both is a 400 |
| exceptions_enabled, clients_review_enabled | bool | Optional |
Response: The new account object.
Update Account
Update Account
curl -X PUT "https://backend.stratifi.com/api/v1/accounts/1/" -H "Authorization: Bearer {{ access-token }}" \
-d '{
"external_id": "act-1",
"name": "John Doe 401k",
"value": "1234567.89",
"type": "401",
"tax_status": "tax-deferred",
"number": "987654321",
"investor": 1,
"matching_model": 1,
"positions": [
{
"ticker": "SPY",
"ticker_name": "SPDR S&P 500",
"value": "823045.26"
},
{
"ticker": "IBM",
"ticker_name": "IBM",
"value": "411522.63"
},
…
],
"teams": [1]
}'
{
"id": 1,
"external_id": "act-1",
"name": "John Doe Trust",
"value": "1234567.89",
"type": "100",
"tax_status": "tax-deferred",
"number": "987654321",
"investor": 1,
"advisor": 1,
"matching_model": 1,
"strategy": 1,
"positions": [ … ],
"risk": { … },
"tolerance": { … },
"drift": 1.0,
"sources": […],
"teams": [1]
}
-request-type: PUT/PATCH
-request-url: /accounts/<id>/
Request Parameters
| Parameter | Type | |
|---|---|---|
| name | string | Required |
| positions[] | List of Positions Objects | Required |
| value | string | Optional |
| type [1] | string | Optional |
| tax_status [2] | string | Optional |
| number | string | Optional |
| investor | int | Optional |
| advisor [3] | int | Optional |
| matching_model [4] | int | Optional |
| strategy [4] | int | Optional, alias of matching_model |
| external_id | string | Optional |
| nickname, inception_date, close_date, relationship_type, held_away, excluded | see Account Object | Optional |
| custodian | string | Optional, custodian name |
| investment_objective, investment_objective_custom | string | Optional. Sending both is a 400 |
| exceptions_enabled, clients_review_enabled | bool | Optional |
Account Prism Score
Account Prism Score
curl "https://backend.stratifi.com/api/v1/accounts/11/prism_score/" -H "Authorization: Bearer {{ access-token }}"
{
"scores": {…},
"media": {…},
}
-request-type: GET
-request-url: /accounts/<id>/prism_score/
Response Fields
| Name | Type | Description |
|---|---|---|
| scores | Scores Factors | Risk score factors |
| media | Scores Images | Risk score factors images |
Model Portfolios
Model Portfolio Object Definition
Model Portfolio Object
{
"id": 1,
"external_id": "mp-1",
"name": "80% Equities / 20% Fixed Income",
"value": 100.0,
"type": "Aggressive",
"is_strategy": false,
"is_benchmark": false,
"visibility": "private",
"company": 1,
"created_at": "2026-01-15T14:02:11.482000Z",
"updated_at": "2026-10-09T18:30:45.120000Z",
"display_name": "80% Equities / 20% Fixed Income",
"sync_status": "ready",
"sync_status_changed": "2026-01-15T14:02:11.482000Z",
"integration_link_updated_at": null,
"is_security_origin": false,
"security_origin": null,
"source_account": null,
"positions": [
{
"ticker": "AGG",
"ticker_name": "iShares Core US Aggregate Bond",
"value": 20.0
},
{
"ticker": "SPY",
"ticker_name": "SPDR S&P500 ETF Trust",
"value": 80.0
}
],
"risk": {…},
"sources": […],
"teams": […]
}
| Name | Type | Description |
|---|---|---|
| id | int | Model Portfolio ID |
| external_id | string | Your model identifier |
| name | string | Model Portfolio name |
| value | string | Model Portfolio value |
| type | string | Model Portfolio type |
| is_strategy | bool | Is this model a strategy? |
| is_benchmark | bool | The model is used as a benchmark (default false) |
| visibility | string | public shares the model with the whole firm; private (default) limits it to its owner and teams. Managers see every model of the firm |
| company | int | Company ID. An advisor can use their own company when they may add models |
| created_at | datetime | Read only. When the model was created |
| updated_at | datetime | Read only. Last change to the model |
| display_name | string | Read only. Name shown in the app |
| sync_status | string | Read only. Integration sync state: ready, syncing or error |
| sync_status_changed | datetime | Read only. When sync_status last changed |
| integration_link_updated_at | datetime | Read only. Last change to any of the model's integration links; null without links |
| is_security_origin | bool | Read only. The model was generated from a security (for example an ETF or mutual fund) |
| security_origin | string | Read only. Ticker of the security the model was generated from; null otherwise |
| source_account | int | Read only. ID of the account the model was replicated from; null otherwise |
| positions[] | List of Positions Objects | Model Portfolio holdings |
| risk | Risk Object | Model Portfolio risk |
| sources | List of Sources Objects | List of sources that are associated with the Model Portfolio |
| teams | List of Teams Ids | Team the model is shared with while private (at most one id) |
Model Portfolios Source Object Definition
Source Object
{
{
"id": "",
"provider": "Stratifi API",
"provider_id": "0",
"created": "2024-07-08T09:39:07.103365Z",
"modified": "2024-07-08T09:44:35.463377Z"
}
}
| Name | Type | Description |
|---|---|---|
| id | string | ID of the source |
| provider | string | Source provider |
| provider_id | string | Source provider ID |
| created | string | Source created date |
| modified | string | Source modified date |
List Model Portfolios
List Model Portfolios
curl "https://backend.stratifi.com/api/v1/models/" -H "Authorization: Bearer {{ access-token }}"
{
"count": 10,
"next": "https://backend.stratifi.com/api/v1/models/?page=2",
"previous": null,
"results": [
{
"id": 1,
"external_id": "mp-1",
"name": "80% Equities / 20% Fixed Income",
"value": 100.0,
"type": "Aggressive",
"is_strategy": false,
"company": 1,
"positions": [ … ],
"risk": { … },
"sources": […],
"teams": […]
},
…
]
}
-request-type: GET
-request-url: /models/
Response Fields
| Name | Type | Description |
|---|---|---|
| count | int | Total number of models |
| next | string | Link to next page of models |
| previous | string | Link to previous page of models |
| results | Object | List of model objects |
Filtering Fields
| Name | Type | Description |
|---|---|---|
| external_id | string | Your model identifier |
| source_id | int | Source ID |
| source_provider | int | Source provider ID |
| source_provider_name | str | Source provider Name |
Get Model Portfolio
Get Model Portfolio
curl "https://backend.stratifi.com/api/v1/models/1/" -H "Authorization: Bearer {{ access-token }}"
{
"id": 1,
"external_id": "mp-1",
"name": "80% Equities / 20% Fixed Income",
"value": 100.0,
"type": "Aggressive",
"is_strategy": false,
"company": 1,
"positions": [ … ],
"risk": { … },
"sources": […],
"teams": […]
}
-request-type: GET
-request-url: /models/<id>/
Response: The requested model object.
Create Model Portfolio
Create Model Portfolio
curl -X POST "https://backend.stratifi.com/api/v1/models/" -H "Authorization: Bearer {{ access-token }}" \
-d '{
"external_id": "mp-1",
"name": "80% Equities / 20% Fixed Income",
"value": 100.0,
"type": "Aggressive",
"is_strategy": false,
"company": 1,
"positions": [
{
"ticker": "AGG",
"ticker_name": "iShares Core US Aggregate Bond",
"value": 20.0
},
{
"ticker": "SPY",
"ticker_name": "SPDR S&P500 ETF Trust",
"value": 80.0
}
],
"visibility": "private",
"teams": [1]
}'
{
"id": 1,
"external_id": "mp-1",
"name": "80% Equities / 20% Fixed Income",
"value": 100.0,
"type": "Aggressive",
"is_strategy": false,
"company": 1,
"positions": [ … ],
"risk": { … },
"sources": […],
"teams": [1]
}
-request-type: POST
-request-url: /models/
Request Parameters
| Parameter | Type | |
|---|---|---|
| name | string | Required |
| positions[] | List of Positions Objects | Required |
| value | string | Optional |
| type | string | Optional |
| is_strategy | bool | Optional |
| is_benchmark | bool | Optional |
| visibility | string (public or private) |
Optional |
| teams | List of Teams Ids (at most one) | Optional |
| company | int | Required |
| advisor | int | Optional. Defaults to the caller for advisor tokens; a manager can name a colleague |
| external_id | int | Optional |
Response: The new model object.
Update Model Portfolio
Update Model Portfolio
curl -X PUT "https://backend.stratifi.com/api/v1/models/1/" -H "Authorization: Bearer {{ access-token }}" \
-d '{
"external_id": "mp-1",
"name": "70% Equities / 30% Fixed Income",
"value": 100.0,
"type": "Moderate",
"is_strategy": true,
"company": 1,
"positions": [
{
"ticker": "AGG",
"ticker_name": "iShares Core US Aggregate Bond",
"value": 30.0
},
{
"ticker": "SPY",
"ticker_name": "SPDR S&P500 ETF Trust",
"value": 70.0
}
],
"visibility": "private",
"teams": [1]
}'
{
"id": 1,
"external_id": "mp-1",
"name": "80% Equities / 20% Fixed Income",
"value": 100.0,
"type": "Moderate",
"is_strategy": true,
"company": 1,
"positions": [ … ],
"risk": { … },
"sources": […],
"teams": [1]
}
-request-type: PUT/PATCH
-request-url: /models/<id>/
Request Parameters
| Parameter | Type | |
|---|---|---|
| name | string | Required |
| positions[] | List of Positions Objects | Required |
| value | string | Optional |
| type * | string | Optional |
| is_strategy | bool | Optional |
| is_benchmark | bool | Optional |
| visibility | string (public or private) |
Optional |
| teams | List of Teams Ids (at most one) | Optional |
| company | int | Optional |
| external_id | int | Optional |
Model Portfolio Prism Score
Model Portfolio Prism Score
curl "https://backend.stratifi.com/api/v1/models/11/prism_score/" -H "Authorization: Bearer {{ access-token }}"
{
"scores": {…},
"media": {…},
}
-request-type: GET
-request-url: /models/<id>/prism_score/
Response Fields
| Name | Type | Description |
|---|---|---|
| scores | Scores Factors | Risk score factors |
| media | Scores Images | Risk score factors images |
| status | Scores Status | Risk score status |
Securities
Securities are read-only: look one up by ticker or by cusip; the lookup ignores case. You only find the securities you can see in the StratiFi app:
- every market security, and public or company-wide custom securities;
- with an advisor's token, the custom securities and SMAs the advisor's firm shares with them;
- with an integration token, the custom securities of the firms the integration serves.
A custom security you cannot see answers 404, the same as an unknown symbol.
Security Object
{
"id": 10423,
"ticker": "VFIAX",
"cusip": "922908710",
"isin": "US9229087104",
"figi": "BBG000BHTMY7",
"ticker_name": "Vanguard 500 Index Admiral",
"description": "Tracks the S&P 500 index.",
"type": "Equity",
"subtype": "US",
"sector": "Large Cap",
"security_type": "Mutual Fund",
"share_class": "Admiral",
"is_retirement": false,
"fund_family": "Vanguard",
"is_custom": false,
"is_sma": false,
"expense_ratio": 0.0004,
"expense_ratio_updated_at": "2026-09-01T06:00:00Z",
"distribution_yield": 0.0125,
"distribution_yield_updated_at": "2026-09-01T06:00:00Z",
"management_fee": null,
"minimum_purchase_amount": 3000.0,
"beta": 1.0,
"marketcap": null,
"price_to_book": null,
"prism_score": {
"concentrated": 10,
"overall": 9.3,
"tail": 9,
"correlation": 6,
"volatility": 10,
"upside_capture_ratio": 1.33886097996,
"downside_capture_ratio": 0.863528362089
},
"created": "2019-04-02T17:21:05Z",
"modified": "2026-10-01T06:00:00Z"
}
| Name | Type | Description |
|---|---|---|
| id | int | Security ID |
| ticker | string | Asset symbol |
| cusip | string | Asset cusip |
| isin | string | ISIN identifier |
| figi | string | OpenFIGI identifier confirmed when the security was classified |
| ticker_name | string | Asset name |
| description | string | Long description; "" when unknown |
| type | string | Asset type |
| subtype | string | Asset subtype |
| sector | string | Asset sector |
| security_type | string | Security type |
| share_class | string | Share class; "" when unknown |
| is_retirement | bool | The share class is a retirement share class |
| fund_family | string | Fund family name, null when unknown |
| is_custom | bool | Custom security created by a firm |
| is_sma | bool | Represents a separately managed account |
| expense_ratio | number | Expense ratio as a decimal fraction (0.0004 is 0.04%) |
| expense_ratio_updated_at | datetime | When the expense ratio last changed, null if it never did |
| distribution_yield | number | Distribution yield as a decimal fraction |
| distribution_yield_updated_at | datetime | When the distribution yield last changed, null if it never did |
| management_fee | number | Management fee as a decimal fraction |
| minimum_purchase_amount | number | Minimum initial investment |
| beta | number | Beta |
| marketcap | int | Market capitalization |
| price_to_book | number | Price to book ratio |
| prism_score | object | PRISM score summary, null while the security is unscored |
| prism_score.overall | float | Overall risk score |
| prism_score.concentrated | float | Concentrated risk score |
| prism_score.tail | float | Tail risk score |
| prism_score.volatility | float | Volatility risk score |
| prism_score.correlation | float | Correlation risk score |
| prism_score.downside_capture_ratio | float | Asset downside capture vs the market |
| prism_score.upside_capture_ratio | float | Asset upside capture vs the market |
| created | datetime | When the security was added to StratiFi |
| modified | datetime | When the security was last changed |
Get security by ticker
Get security by ticker
curl "https://backend.stratifi.com/api/v1/securities/ticker/GOOGL" \
-H "Authorization: Bearer {{ access-token }}"
-request-type: GET
-request-url: /securities/ticker/<ticker>
Get security by cusip
Get security by cusip
curl "https://backend.stratifi.com/api/v1/securities/cusip/02079K305" \
-H "Authorization: Bearer {{ access-token }}"
-request-type: GET
-request-url: /securities/cusip/<cusip>
Surveillance Exceptions
Surveillance exceptions are the monitoring alerts StratiFi raises on accounts, investors and households: drift, share class, cash concentration, portfolio concentration, trading activity and IPS drift. They are read-only through the API.
You see the same exceptions as in the StratiFi app: an advisor token sees the exceptions on the accounts, investors and households visible to that advisor; an API-user token sees the exceptions on the objects it owns.
Surveillance Exception object definition
Surveillance Exception Object
{
"id": 81234,
"cause": "share_class",
"cause_id": 2,
"status": "to_do",
"status_changed": "2026-10-01T06:00:00Z",
"target_type": "account",
"target_type_id": 38,
"target_id": 51234,
"trigger_type": "position",
"trigger_type_id": 41,
"trigger_id": 98213,
"extra_data": {"newest_position_data": {…}},
"created": "2026-10-01T06:00:00Z",
"modified": "2026-10-01T06:00:00Z",
"start": "2026-10-01T06:00:00Z",
"end": null,
"age": 9,
"snoozed_until": null
}
| Name | Type | Description |
|---|---|---|
| id | int | Surveillance exception ID |
| cause | string | One of these causes |
| cause_id | int | Numeric id of the cause |
| status | string | One of these statuses |
| status_changed | datetime | When the status last changed |
| target_type | string | Kind of object the exception is on: account, investor or household |
| target_type_id | int | Numeric id of that kind of object. It differs between environments; use target_type in your logic |
| target_id | int | ID of the account, investor or household |
| trigger_type | string | Kind of object that triggered it: position for share class exceptions (see positions), otherwise the target itself |
| trigger_type_id | int | Numeric id of that kind of object. It differs between environments; use trigger_type in your logic |
| trigger_id | int | ID of the triggering object |
| extra_data | object | Cause-specific metrics recorded when the exception was raised |
| created | datetime | When the exception was created |
| modified | datetime | When the exception was last changed |
| start | datetime | When the exception opened |
| end | datetime | When it was snoozed, resolved or closed; null while open |
| age | int | Days open (from start to end, or to now while open) |
| snoozed_until | datetime | When a snoozed exception returns to to_do; null otherwise |
Surveillance Exception causes
| cause | cause_id |
|---|---|
| drift | 1 |
| share_class | 2 |
| cash_concentration | 3 |
| portfolio_concentration | 4 |
| trading_activity | 5 |
| ips_drift | 6 |
Surveillance Exception statuses
| status | Description |
|---|---|
| to_do | Open, not yet worked on |
| in_progress | Open, an advisor is working on it |
| snoozed | Open, hidden until snoozed_until |
| resolved | Finished by StratiFi: the object is healthy again |
| closed | Finished by an advisor, who dismissed it |
List surveillance exceptions
List Surveillance Exceptions
curl "https://backend.stratifi.com/api/v1/surveillance-exceptions/?status=to_do,in_progress&target_type=account" \
-H "Authorization: Bearer {{ access-token }}"
{
"count": 42,
"next": "https://backend.stratifi.com/api/v1/surveillance-exceptions/?page=2&status=to_do,in_progress&target_type=account",
"previous": null,
"total_pages": 3,
"results": [
{...Surveillance Exception Object},
{...Surveillance Exception Object}
]
}
-request-type: GET
-request-url: /surveillance-exceptions/
Results are paginated: page and page_size (default 20, at most 100). There is no option to return every result at once.
Response Fields
| Name | Type | Description |
|---|---|---|
| count | int | Total number of exceptions |
| next | string | Link to the next page |
| previous | string | Link to the previous page |
| total_pages | int | Number of pages |
| results | object list | List of surveillance exception objects |
Filtering Fields
| Name | Type | Description |
|---|---|---|
| status | string | One or more statuses, comma separated (to_do,in_progress,snoozed are the open ones) |
| target_type | string | account, investor or household |
| target_id | int | ID of the target (use with target_type) |
| trigger_type | string | account, investor, household or position |
| trigger_id | int | ID of the trigger (use with trigger_type) |
| created_after, created_before | datetime | Created at or after / at or before (ISO 8601) |
| start_after, start_before | datetime | Opened at or after / at or before |
| end_after, end_before | datetime | Finished at or after / at or before |
| status_changed_after, status_changed_before | datetime | Status changed at or after / at or before |
| ordering | string | id, created, modified, status_changed, start, end or age; prefix - for descending. Default -id (newest first) |
An unknown status, target_type or trigger_type value is rejected with a 400.
Get surveillance exception by id
Get Surveillance Exception by id
curl "https://backend.stratifi.com/api/v1/surveillance-exceptions/81234/" \
-H "Authorization: Bearer {{ access-token }}"
-request-type: GET
-request-url: /surveillance-exceptions/<exception_id>/
Returns a surveillance exception object, or 404 when it does not exist or is not visible to you.
Changelog
- 1.23.0 (2026-10-23)
- Add read-only
/surveillance-exceptions/(list and get by id) with cause, status, target, trigger,extra_data, timestamps and age; filters by status, target, trigger and date ranges; at most 100 per page. Advisors see the exceptions on the accounts, investors and households the app shows them; integration tokens see those on the objects they own.
- Add read-only
- 1.22.0 (2026-10-23)
- Security lookups only find the securities visible to the caller: market securities and public custom securities, the custom securities an advisor's firm shares with them, and for integration tokens the custom securities of the firms they serve. Other firms' private custom securities now answer
404. - Add read-only
id,description,figi,share_class,is_retirement,fund_family,is_custom,is_sma,expense_ratio,expense_ratio_updated_at,distribution_yield,distribution_yield_updated_at,management_fee,minimum_purchase_amount,beta,marketcap,price_to_book,createdandmodifiedto the security object.
- Security lookups only find the securities visible to the caller: market securities and public custom securities, the custom securities an advisor's firm shares with them, and for integration tokens the custom securities of the firms they serve. Other firms' private custom securities now answer
- 1.21.0 (2026-10-23)
- Account positions now include excluded holdings, returned with
excluded: true;excludedis writable, and a position sent without it keeps its current state. See excluded positions. - Updating a holding the account already has now applies
purchase_dateandunrealized_gainswhen they are sent, and keeps them when they are not. - Add read-only
id(stable while the holding keeps its identifier),created_atandupdated_at(moves only when a value changes) to account and model portfolio positions.
- Account positions now include excluded holdings, returned with
- 1.20.0 (2026-10-23)
- Add
is_benchmarkandvisibility(publicorprivate) to/models/, writable on create and update, plus read-onlycreated_at,updated_at,display_name,sync_status,sync_status_changed,integration_link_updated_at,is_security_origin,security_origin(ticker) andsource_account(account id). - Advisors who are not managers follow the StratiFi app's rules: they update and delete only their own models, see private models only when they own them or share a team, and share models, or manage benchmarks and strategies, only when the firm allows it.
companyis required on create;advisorcan be sent by a manager.
- Add
- 1.19.0 (2026-10-23)
- Add
investment_objective,investment_objective_custom,advisory_feeandexceptions_enabledto/households/, writable on create and update, plus read-onlycreated_at,updated_atandintegration_link_updated_at.
- Add
- 1.18.0 (2026-10-23)
- Add account details to
/accounts/:nickname,inception_date,close_date,relationship_type,held_away,excluded,custodian(by name),investment_objective,investment_objective_custom,exceptions_enabledandclients_review_enabled, writable on create and update. - Add read-only
retirement_category(derived fromtype),created_at,updated_at,provider,integration_link_updated_at,sync_status,sync_status_changed,next_review_date,display_nameanddisplay_numberto the account object. - Creating an account without an
investoror anadvisorreturns a400. A custodian must match its whole name or an alternative name.
- Add account details to
- 1.17.0 (2026-10-23)
- Add the investor suitability profile to
/investors/: personal details (date_of_birth,marital_status,dependants,employment_status,occupation, mailing address and countries), investment profile (investment_objective,investment_objective_custom,investment_experience,investment_experience_level,time_horizon,time_horizon_bucket,liquidity_needs) and financials (annual_income,annual_expenses,special_expenses,net_worth,liquid_net_worth,investable_assets,advisory_fee,tax_rate,tax_bracket), writable on create and update. - Add read-only
created_at,updated_at,next_review_date,integration_link_updated_atand theexceptions_enabled,clients_review_enabled,checkins_enabledtoggles to the investor object. - Country codes must be upper-case ISO 3166-1 alpha-2, and the date of birth cannot be in the future. Fields set from the client's paperwork cannot be changed through the API.
- Prospects: reachable by id, listed with
is_prospect=true; adding one requires the firm's permission, and turning a prospect into a client excludes its accounts.
- Add the investor suitability profile to
- 1.16.0 (2026-10-16)
- Document the OAuth2 client-credentials grant for server-to-server integrations. These tokens are API-only and cannot start a web session.
- Add Single Sign-On: SAML service-provider endpoints per org slug, IdP-initiated sign-in,
RelayStatedeep-linking and the setup requirements.
- 1.15.1 (2026-10-11)
- The authorization callback includes the
issparameter (RFC 9207). - Refresh tokens rotate on every refresh. Reusing a spent refresh token revokes the chain, and a refresh token not used within 30 days of its access token expiring expires.
- The authorization callback includes the
- 1.15.0 (2026-10-09)
- Document
matching_modelas the account field that holds the strategy (Model Portfolio id). The field was renamed fromstrategyin the API but the docs kept the old name. strategystays accepted on create and update and is returned alongsidematching_modelas an alias; sending both with different values returns a400.
- Document
- 1.14.0 (2025-11-06)
- session token deprecation notice
- adds OIDC support
- adds '/o/sso/' for starting a session on stratifi.com
- adds filtering for provider_name on sources field for household, investor, account and model_portfolio endpoints
- 1.13.0 (2024-07-08)
- Modify
sourcesfield inhousehold,investor,accountandmodel_portfolio, now returns an object with the fieldsid,provider,provider_id,createdandmodified. - Add
source_idandsource_providerfilters tohousehold,investor,accountandmodel_portfolio. - Adds
teamsfield tomodel_portfolioandaccount.
- Modify
- 1.12.0 (2024-06-20)
- Add sources field to
household,investor,accountandmodel_portfolio
- Add sources field to
- 1.11.0 (2024-05-21)
- Add
/teams/endpoint
- Add
- 1.10.0 (2023-03-27)
- Add
quantity,price,unitsandcost_basisfields to the account positions.
- Add
- 1.9.0 (2023-03-27)
- Remove
risk,toleranceanddriftattributes from the advisor list and detail. - Remove
/advisors/<id>/prism_aggregation/endpoint. - Add
/advisors/stats/and/advisors/<id>/stats/endpoints
- Remove
- 1.8.0 (2023-02-28)
- Allow setting model portfolios as strategies.
- 1.7.0 (2022-11-22)
- Allow Proof Key for Code Exchange.
- 1.6.1 (2022-03-19)
- Fix accepted values for tax status
- 1.6.0
- Enhance the risk and tolerance objects with score factors and media.
- 1.5.1
- Remove restrictions to the account type field.
- 1.5.0
- Add tax status field to accounts
- Add strategy field to accounts
- Fix /o/token/ examples
- 1.4.0
- Add the aggregated risk, tolerance and drift to the investor, household and advisor.
- 1.3.0
- Add userinfo endpoint
- 1.2.0
- Add security endpoints
- 1.1.0
- Add oauth endpoints