You can create a person entity to represent a person of interest to your LUSID domain, for example a portfolio manager, trader or sales representative. See a list of the built-in entity types.
Note the following:
A person entity must have at least one user-specified identifier. Under the hood, an identifier is defined as a custom property with a
constraintStyle
ofIdentifier
and a 3-stage property key in thePerson
domain.LUSID automatically generates a
LusidPersonId
internal identifier for every person entity that is guaranteed to be unique and never change. This is identical in concept and structure to an instrument's LUID.A person entity only has two data fields:
displayName
anddescription
.You can add custom properties to a person entity in the normal way to extend the information stored about them.
You can create relationships between a person entity and certain other types of entity, for example between a portfolio manager and the portfolios they manage.
You can apply access metadata to an identifier of a person entity. This may be a more effective way of restricting access to data stored about people in LUSID.
Providing you have appropriate access control permissions, you can interact with a person entity (and any relationships they might have):
Using the LUSID API endpoints in the Persons collection.
If you have a Luminesce license, using dedicated read and write providers.
Note you cannot interact via the LUSID web app at this time.
Understanding identifiers
A person entity must have at least one user-specified identifier. Consider the following JSON fragment defining John Doe, who is active in LUSID as both a portfolio manager and a trader, and so has an identifier for each context:
"displayName": "John Doe",
"description": "A portfolio manager and trader in US investments",
"lusidPersonId": "LUID_00003D6X",
"identifiers": {
"Person/PortfolioManagers/ManagerId": {
"key": "Person/PortfolioManagers/ManagerId",
"value": {
"labelValue": "PortMan1"
}
},
"Person/Traders/TraderId": {
"key": "Person/Traders/TraderId",
"value": {
"labelValue": "Trader5"
}
}
},
...
Note: LUSID automatically generates the
LUID_00003D6X
value for theLusidPersonId
identifier, which is guaranteed to be unique and never change.
An identifier consists of three components: an idTypeScope
, idTypeCode
and code
. The values you assign to these components combine to uniquely identify John Doe in each of the contexts in which he operates. In this example:
To uniquely identify John Doe as a ... | idTypeScope | idTypeCode | code |
Portfolio manager |
|
|
|
Trader |
|
|
|
For each identifier you intend to give a person entity, you must obtain an API access token and call the CreatePropertyDefinition API for your LUSID domain to create a property definition with the following mandatory characteristics:
A
domain
ofPerson
.A
constraintStyle
ofIdentifier
.A
lifeTime
ofPerpetual
.
Note you can call the SearchProperties API with a suitable filter to find all the property definitions that have been created as identifiers for person entities, in case a suitable definition already exists:
curl -X GET "https://<your-domain>.lusid.com/api/api/search/propertydefinitions?filter=constraintStyle%20eq%20%27Identifier%27%20and%20domain%20eq%20%27Person%27"
-H "Authorization: Bearer <your-API-access-token>"
Creating a property definition to constitute a 'trader' identifier
The following call creates a property definition with a 3-stage property key of Person/Traders/TraderId
:
curl -X POST "https://<your-domain>.lusid.com/api/api/propertydefinitions"
-H "Content-Type: application/json-patch+json"
-H "Authorization: Bearer <your-API-access-token>"
-d '{
"domain": "Person",
"scope": "Traders",
"code": "TraderId",
"valueRequired": true,
"displayName": "Trader identifier for Person entities",
"dataTypeId": { "scope": "system", "code": "string" },
"lifeTime": "Perpetual",
"constraintStyle": "Identifier",
}'
Creating a property definition to constitute a 'portfolio manager' identifier
The following call creates a property definition with a 3-stage property key of Person/PortfolioManagers/ManagerId
:
curl -X POST "https://<your-domain>.lusid.com/api/api/propertydefinitions"
-H "Content-Type: application/json-patch+json"
-H "Authorization: Bearer <your-API-access-token>"
-d '{
"domain": "Person",
"scope": "PortfolioManagers",
"code": "ManagerId",
"valueRequired": true,
"displayName": "Portfolio manager identifier for Person entities",
"dataTypeId": { "scope": "system", "code": "string" },
"lifeTime": "Perpetual",
"constraintStyle": "Identifier",
}'
Creating a person entity with a unique identifier value
You can now call the UpsertPerson API to create a person entity for John Doe with a trader identifier (you can add the portfolio manager identifier retrospectively).
Note the following:
The
key
of the trader identifier must be the 3-stage property key for the underlying property definition, in this casePerson/Traders/TraderId
.The
labelValue
you give the trader identifier must be unique among all traders represented in LUSID, in this caseTrader5
.
curl -X POST "https://<your-domain>.lusid.com/api/api/persons"
-H "Content-Type: application/json-patch+json"
-H "Authorization: Bearer <your-API-access-token>"
-d '{
"identifiers": {
"Person/Traders/TraderId": {
"key": "Person/Traders/TraderId",
"value": {
"labelValue": "Trader5"
}
}
},
"displayName": "John Doe",
"description": "A portfolio manager and trader in US investments"
}'
Providing the request is successful, the response is as follows:
{
"displayName": "John Doe",
"description": "A portfolio manager and trader in US investments",
"lusidPersonId": "LUID_00003D6X",
"identifiers": {
"Person/Traders/TraderId": {
"key": "Person/Traders/TraderId",
"value": {
"labelValue": "Trader5"
},
"effectiveFrom": "0001-01-01T00:00:00.0000000+00:00",
"effectiveUntil": "9999-12-31T23:59:59.9999999+00:00"
}
},
"properties": {},
"version": {
"effectiveFrom": "2022-09-08T14:55:17.1582910+00:00",
"asAtDate": "2022-09-08T14:55:17.3857390+00:00"
},
...
}
Adding and removing identifiers retrospectively
Once a person entity exists, you can call the SetPersonIdentifiers API to add additional identifier(s), specifying an identifier value (that is, code
) unique to the context.
For example, to retrospectively add a portfolio manager identifier to John Doe (assuming the underlying property definition already exists), and give it the value PortMan1
:
curl -X POST "https://<your-domain>.lusid.com/api/api/persons/Traders/TraderId/Trader5/identifiers"
-H "Content-Type: application/json-patch+json"
-H "Authorization: Bearer <your-API-access-token>"
-d '{
"identifiers": {
"Person/PortfolioManagers/ManagerId": {
"key": "Person/PortfolioManagers/ManagerId",
"value": {
"labelValue": "PortMan1"
}
}
}
}'
To remove an identifier (providing it is not the last one), call the DeletePersonIdentifiers API.
Retrieving person entities and their relationships
You can retrieve:
Every person entity using the ListAllPersons API.
Every person entity with a particular identifier (for example, all the portfolio managers or all the traders) using the ListPersons API.
A particular person entity using the LUSID GetPerson API.
For the first two operations, you can perform a filter operation to retrieve just a matching set, for example on the values of a particular identifier:
Identifiers[Person/PortfolioManagers/ManagerId] startswith 'Port'
You can retrieve relationships created between a person entity and other types of entity using the GetPersonRelationships API.