3. Digital Profile¶
The digital profile is the main trak.e resource. Its goal is to consolidate all customer information to perform the KYC process: risk, transactional profile, contact details, tax information, etc.
In addition, its an extensible resource to handle customer-specific information not covered in trak.e model. A digital profile may represent information about a person of physical existence, or of people of ideal existence (legal persons and other organizations).
erDiagram
DigitalProfile ||--o{ Relation: has
DigitalProfile ||--o{ ContactInfo: has
DigitalProfile ||--o{ Tax: has
DigitalProfile ||--o{ Address: has
DigitalProfile ||--o{ EconomicActivity: has
DigitalProfile |o--o| TypePerson: is_one_of
TypePerson |o--o| NaturalPerson: is_one_of
TypePerson |o--o| LegalPerson: is_one_of
NaturalPerson |o--o| Name: has
DigitalProfile {
string id
int created_at
int modified_at
string created_by
string modified_by
int version
string tax_payer_id
string name
string person_type
string risk
int risk_calculated_at
string external_ref
string state
int transactional_profile_amount
int transactional_profile_calculated_at
int blacklists_checked_at
int last_due_diligence_at
int declared_income
}
NaturalPerson {
int birth_date
string birth_place
string id_number
string id_type
string id_country
string nationality
string civil_state
string classification
bool is_employee
}
Name {
string first
string middle
string last
}
LegalPerson {
string constitution
bool is_listed_on_stock_exchange
int foundation_date
string foundation_place
}
ContactInfo {
string contact_type
string value
string description
bool main
bool is_verified
}
Relation {
string profile_id
string relationship
}
Tax {
string code
string description
string inscription_date
string jurisdiction
string organization
}
Address {
string address_type
bool main
string country
string state
string city
string department
string zip_code
string street_name
string number
string building_name
string building_floor_number
string building_room_number
string formatted_address
string normalization_method
}
EconomicActivity {
string code
string description
bool main
string organization
}
3.1 Digital Profile Properties¶
3.1.1 Basic Information¶
A digital profile contains the following basic information:
- A unique identifier
id
which is used to reference this digital profile. - Timestamp of the profile creation:
created_at
. - Timestamp of the last update to the profile:
modified_at
. - Name of the user or application that created the profile:
created_by
. - Name of the user or application that last modified the profile:
modified_by
. - Profile version number:
version
. All changes made to the profile are saved for latter consultation and audit. For more information see History. - Tax payer id:
tax_payer_id
. For example, for Argentinian tax payer, this is the CUIT number. - Full name of the (physical or legal) person:
name
. - Person type:
person_type
. As mentioned above, the profiles can represent information of a natural or a legal person. Therefore, the posible values for this attribute are:natural_person
andlegal_person
. Risk level
associated with this profile:risk
. Trak.e addopts a risk-based approach to Anti-Money Laundering and Combating the Financing of Terrorism (PLA/CFT), as recommended by national and international regulators. The spirit of this approach is to address the practices of AML/CFT on a proportional way to the risk of each customer of engaging on those activities. Therefore, the client portfolio is classified in three classes (high, medium and low risk) and more or less strict continuous due diligence measures are applied depending of the specific risk of each customer. This risk may be injected by an external system, or can be assessed by trak.e from a given parametrization. For more information, see Risk Matrix.- Transactional profile associated with the profile:
transactional_profile_amount
. This amount represents the estimated behavior of the customer with the entity. It may be expressed annualy or monthly. This transactional profile may be injected by an external system or assessed by trak.e from a given parametrization. For more information, see Transactional Profile. - Timestamp of the last risk assessment made by trak.e:
risk_calculated_at
. - Timestamp of the last transactional profile assessment made by trak.e:
transactional_profile_calculated_at
. - Timestamp of the last Watchlists check against the predefined set of checks:
blacklists_checked_at
. - Timestamp of the last continuous due diligence conducted on the profile, if it applies:
last_due_diligence_at
. - An optional
external reference
, which allows to keep in trak.e the unique identifier of this customer in external systems:external_ref
. - The
state
of the profile:state
. The state of each profile allows defining workflows and interact with it. For more information, see Workflows. - Declared Income:
declared_income
. A number that represents the declared income, if it applies.
3.1.1.1 For natural persons¶
- Name: For natural persons, it is supported to add the name using its parts
first
,middle
andlast
. The general name, used for watchlist monitoring, will be formed by concatenating these parts. - Birth date:
birth_date
. - Birth place:
birth_place
. - Identification number:
id_number
. For example, in Argentina this is the National Document of Identity, but this vary greatly from country to country. - Identification type:
id_type
. - Identification country:
id_country
. Following ISO 3166-1 Alpha-2 standard. - Nationality:
nationality
. - Gender: The gender of the customer. Must be one of the following values:
male
,female
,other
. - Civil State:
civil_state
. Must be one of the following values:single
,married
,widowed
,divorced
,separated
,civil_union
,domestic_partnership
orother
. - Impositive Classification:
classification
. Classification for federal taxes. For example, "Sole Propietorship", "Employee", "Retired", etc. - In addition, a profile can be marked as an employee of the entity using
is_employee
. This allows taking special due diligence measures on customers that are also employees of the company.
Example
The following is an example of a basic profile of a natural person
{
"created_at":1624649377044,
"modified_at":1624649377290,
"created_by":"smart_operador",
"modified_by":"smart_operador",
"name":"John Doe",
"tax_payer_id":"20-39499655-9",
"person_type":"natural_person",
"natural_person":{
"name":{
"first":"John",
"middle":"",
"last":"Doe"
},
"birth_date":865987200000,
"birth_place":"Vicente López, Provincia de Buenos Aires, Argentina",
"id_number":"39499655",
"id_type":"national_identity_card",
"id_country":"ar",
"nationality":"Argentina",
"civil_state":"single",
"classification":"monotributista",
"gender":"male",
"is_employee":false
},
"version":2,
"state":"creating",
"blacklists_checked_at":1624649377278,
"last_due_diligence_at":1624573651797,
"id":"60d62ea15857d9d371b6d4d3"
}
3.1.1.2 For legal persons¶
- Constitution:
constitution
. For example, single owner, LLC, etc. - Foundation date:
foundation_date
. - Foundation Place:
foundation_place
. - Additionaly, it can be marked if the entity is listed on a stock exchange using the property:
is_listed_on_stock_exchange
.
Example
The following is an example of a basic profile corresponding to a legal person.
{
"created_at":1624650046220,
"modified_at":1624650046220,
"created_by":"smart_operador",
"modified_by":"smart_operador",
"name":"Araoz S.R.L.",
"tax_payer_id":"33-96669665-8",
"person_type":"legal_person",
"legal_person":{
"constitution":"society_limited_liability",
"is_listed_on_stock_exchange":false,
"foundation_date":1276041600000,
},
"version":1,
"state":"creating",
"last_due_diligence_at":1624573651797,
"id":"60d6313e5857d9d371b6d4fa"
}
3.1.1.3 Declared information¶
The digital profile contains a declaration
attribute where a summary of the mandatory sworn statement of each customer can be reported. This object supports 4 keys:
- PEP (
pep
). It should betrue
if the user reported that he is a politically exposed person during onboarding or at another time,false
if he reported that he is not a politically exposed person. It also supports the valuenull
which indicates that the information is not known. - Obligated Subject (
obligated_subject
). It should betrue
if the user reported that he is a supervised entity during onboarding or at another time,false
if he reported that he is not a reporter. It also supports the valuenull
which indicates that the information is not known. - FATCA (
fatca
): Indicates if the customer is a US resident who has investments outside that country (FATCA Law applies). As in the previous cases, it accepts a boolean or a null value to indicate that the information is not known. - OECD (
oecd
): No use currently - replaced by FATCA.
Additionally, it is allowed to report:
- Type of PEP (
pep_type
): Type of Politically Exposed Person. This field allows arbitrary strings but it is strongly recommended to define an enum during integration to limit the possible values. - Supervised Entity Type (
obligated_subject_type
): Type of Supervised Entity. This field allows arbitrary strings but it is strongly recommended to define an enum during integration to limit the possible values. - Date of registration of the supervised entity (
obligated_subject_date
): Date of registration of the supervised entity - if applicable. This should be an integer representing a date in milliseconds since epoch1. oecd_main_country
: Main country or jurisdiction of main residence for the purposes of applying the FATCA/OECD law, if applicable.oecd_main_tax_payer_id
: Taxpayer number in the main country if applicable.oecd_secondary_country
: Secondary country or additional jurisdiction of residence for the purposes of applying the FATCA/OECD law, if applicable.oecd_secondary_tax_payer_id
: Taxpayer number in the secondary country if applicable.fatca_ssn
: US social security number for citizens under FATCA/OECD law.
It should be noted that these attributes are at the top-level of the file and not within the declarations
object.
3.1.1.4 Information in lists.¶
Trak.e can store in the digital profile a summary of the watchlists monitoring (for more information see Lists). If you want this information to be updated automatically following the resolutions of list alert cases, you can configure a process automation rule to achieve this. The blacklist_found
object has one key per type of list supported in the service (pep
, obligated_subject
, sanctioned
, wanted
, terrorism
, etc.) and each key maps to an object with two keys :
hit
: It marks if it had a hit in any list of this type or not.confirmed
: Which marks if the hit was confirmed or not by a PLD analyst.
3.1.2 Contact details¶
Each profile can have one or several associated contacts. Valid contact types are email, mobile phone or landline. In addition to the value of the contact, a description of the contact can be saved if necessary.
Within the contacts associated with a profile, one of each type can be determined as the main contact. That is, you can have one primary email and one primary mobile phone, but you cannot have two primary emails. You can also mark if the contact has been verified.
Example
An example of a contact follows:
...
"contacts": [
{
"contact_type":"email",
"value":"administracion@araoz.com.ar",
"description":"Casilla de correo de administración de Araoz S.R.L.",
"main":true,
"is_verified":true
}
]
...
3.1.3 Address details¶
Each profile can have one or several associated addresses. At most one can be defined as the main address. An address can be:
- A personal address: The place where a natural person lives. (
address_type=personal
) - Fiscal or tax domicile: The headquarters of a legal entity. (
address_type=fiscal
) - Legal domicile: The place where the regulator presumes that a (natural or legal) person resides permanently to exercise their rights and fulfill their obligations, regardless of whether they are actually there or not. (
address_type=legal
)
The properties of each address are structured as follows:
Field | Key | Required |
---|---|---|
Country | country |
Yes |
State/Province | state |
Yes |
City | city |
Yes |
County / Department | department |
No |
Zip code | zip_code |
No |
Street | street_name |
Yes |
Heigth | number |
No |
Building name | building_name |
No |
Floor | building_floor_number |
No |
Apt number | building_room_number |
No |
Additionally, the address can be saved already formatted using some normalization method using the formatted_address
and normalization_method
pair of attributes. Additional relevant information can be stored in key-value format in the extra
attribute.
Example
An example of a valid adress is as follows:
...
"addresses": [
{
"address_type":"legal",
"main":true,
"building_name":"",
"building_floor_number":"",
"building_room_number":"",
"formatted_address":"",
"normalization_method":"",
"country":"Argentina",
"state":"Santa Fe",
"city":"Rosario",
"department":"Rosario",
"zip_code":"S2000",
"street_name":"Córdoba",
"number":"1748"
}
]
...
3.1.4 Economic Activity¶
A profile can be associated with one or more economic activities. Each economic activity is specified with the name of the regulatory organization, the economic activity code, and a description of the economic activity. The list of economic activities is configurable by tenant. An economic activity can be highlighted as the main one.
Example
An example of economic activity is as follows:
...
"activities": [
{
"code":"11501",
"organization":"AFIP",
"main":true,
"description":"Cultivo de algodón"
}
]
...
3.1.5 Tax information.¶
A profile can be associated with one or more taxes. Each tax is specified with the name of the regulatory organization, the tax code, and a description of the tax. Additionally, if applicable, the jurisdiction and the date of registration can be saved. The jurisdiction may be federal, non-federal, or local. The list of taxes to be used is configurable by each tenant.
Example
An example of tax information is as follows:
...
"taxes": [
{
"code":"20",
"jurisdiction":"country",
"organization":"AFIP",
"description":"MONOTRIBUTO",
"inscription_date":1529020800000
}
]
...
3.1.6 Associated documentation¶
See the chapter on Documentation Handling
3.1.7 Linked profiles¶
A profile can be linked to other profiles. To relate two profiles, an array of relations is saved under the property relations
. Each member of the array is an object with a profile_id
property, set to the unique identifier of the profile (as a string). This is useful for linking profiles that share certain transactionality, profiles of relatives of a politically exposed person, etc.
The type of the relation must be a valid relation type. Trak.e offers the following default relation types:
- Bussiness partner: Used to relate profiles of a legal person with the profiles of the natural personas who have an economic participation in it.
- Guarantor: Used to relate a profile with the profiles of people who have provided guarantees to it (normally used in the granting of loans).
- Legal representative: Used relate the profiles of a legal persons with the profiles of the eople who can operate on their behalf.
Trak.e services offers the possibility of expanding this enumeration with the types that each entity considers necessary to represent its bussiness.
In addition, the possibility of saving additional information (in key-value format) for each relation is offered.
3.1.8 Labels/Tags¶
A profile can be marked using arbitrary strings as tags. A label has a minumum length of 2 characters and a maximum of 20 characters.
3.1.9 Additional Information¶
All the additional information you want can be saved in the profile in key-value format. Trak.e allows each client to configure in a json schema2 the structure of this additional information. This specification will allow validation and standardization of the additional information.
For example, if we want to have information on a person's accounts we can define:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.com/product.schema.json",
"title": "ACME",
"description": "Additional Information for the profiles of ACME",
"type": "object",
"properties": {
"accounts": {
"description": "Customer's accounts",
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"uniqueItems": true
}
}
}
Note
The field $schema denotes the version of JSON Schema Draft, so its important to define it. Trak.e supports JSON Schema with a Draft version equal or greater than four.
After defining the schema, we can save and access the information on the profile using the property metadata.accounts
.
It should be noted that in the absence of a schema, the additional information can also be saved in the file, but no validation will be carried out nor will there be support for manual entry.
3.2 History¶
All the changes made to the profile are saved along with the moment and the user or application that made the change. The versions of the profile are numbered and start from 1. Each change is an object where the profile is referenced by its unique identifier (orig_id
), the version number immediately previous, and an array of changes. Each change in the profile is, in turn, an array of three components:
- Operation:
change
,add
,remove
. - Path of the modified property: When the modified property is at the top-level of the object, this is simply the string that identifies that key. For nested objects, it is a list of strings and integers, specifying the path to the property. The string must be represented as keys in (sub)objects, and the integers are indexes in arrays.
- Values: When the operation is a change, it is an array of two values (the old value first, and then the new value). In case of
add
andremove
operation, it shows first the key that was inserted or removed and then the value that was added/removed.
Exampe
For example, the following object represents that the profile was modified, going from version 1 to version 2, adding a new key to the object legal_person
named constitution
and whose value is horizontal_property_consortium
.
...
"changes": [
[
"change",
"modified_at",
[
1624648537726,
1624648551709
]
],
[
"change",
"modified_by",
[
"admin",
"operador"
]
],
[
"add",
"legal_person",
[
[
"constitution",
"horizontal_property_consortium"
]
]
],
[
"change",
"version",
[
1,
2
]
]
]
...
3.3 Workflows¶
The profiles have an attribute that specifies in which state they are in. The default states of trak.e, and their suggested semantics are:
- Creating (
creating
): The digital profile is in process of creating and the required information is not yet available. - Active (
active
): The digital profile has been completed y is an active customer of the entity. - Banned (
banned
): The digital profile has been banned by an operator or supervisor. - Inactive (
inactive
): The digital profile is an inactive customer of the entity. - Pending (
pending
): The profile needs to be reviewed by an operator. - Under review (
under_review
): The digital profile is being reviewed by an operator or supervisor.
You can additionally define all the states that the entity considers necessary. The semantics of each state are suggested because each entity can implement the workflow that best suits their needs.
3.3.1 Default Workflow¶
Trak.e has a default profile status workflow that can be tailored to the needs of each client.
graph TD
creating --> pending
pending --> under_review
under_review -- blacklist checked &<br> risk calculatded &<br> no open incidents --> active
under_review --> banned
under_review --> inactive
under_review --> creating
active --> pending
banned --> pending
inactive --> pending
This workflow can be achieved with the following parameters:
[
{ "source": "creating", "dest": "pending" },
{ "source": "pending", "dest": "under_review" },
{
"source": "under_review",
"dest": "active",
"condition": "dprofile.blacklists_checked_at != None and dprofile.risk != None and dprofile.open_cases == 0"
},
{ "source": "under_review", "dest": "banned" },
{ "source": "under_review", "dest": "inactive" },
{ "source": "under_review", "dest": "creating" },
{ "source": "active", "dest": "pending" },
{ "source": "banned", "dest": "pending" },
{ "source": "inactive", "dest": "pending" }
]
Each transition has a source
and destination
nodes representing the current state and the desired states respectively. In addition, it may have a condition that has to be met in orden to execute the transition (condition
). The available states after a given states depends on the transitions and the conditions that are assessed in that moment.
The conditions have two arguments, the current profile and the security context of the current operator. The condition must be a valid Python expression.3
Python
dict
objects may be accessed with Javascript dot syntax, in case of missing key the fieldNone
value would be returned.
The profile contains all the information discussed above.
For example:
...
{
"source": "under_review",
"dest": "active",
"condition": "dprofile.blacklists_checked_at != None and dprofile.risk != None and dprofile.open_cases == 0"
}
...
This transitions allows you to pass a profile from under_review
to active
if you have run the watchlists screening, assesed their risk and have no open alerts.
The security context includes the property scope
, that is a list of the scopes of the user/application that is using trak.e. In that way, we can define that only users with scope AML Supervisor
can transition from under_review
to banned
using the following condition:
...
{ "source": "under_review", "dest": "banned", "condition": "'tenant_aml_operator' in context.scope"},
...
Note
The keys for the default scopes are documented in Security
3.3.2 Example: Maker & Checker Workflow¶
For example, if we aim to implement a maker & checker schema if the risk is high o does not met some other condition, we can use the following workflow
graph TD
creating --> pending
pending --> under_review
pending -- blacklist checked &<br> risk calculated &<br> no open incidents &<br> risk not high --> active
under_review -- high risk or open cases --> pending_approval
pending_approval -- user is supervisor --> active
pending_approval -- user is supervisor --> banned
pending_approval -- user is supervisor --> inactive
pending_approval -- user is supervisor --> creating
active --> pending
banned --> pending
inactive --> pending
The following is the configuration for the maker & checker workflow
[
{ "source": "creating", "dest": "pending" },
{ "source": "pending", "dest": "under_review" },
{
"source": "under_review",
"dest": "active",
"condition": "dprofile.blacklists_checked_at != None and dprofile.risk != None and dprofile.risk != 'high' and dprofile.open_cases == 0"
},
{ "source": "under_review", "dest": "pending_approval" },
{
"source": "pending_approval",
"dest": "active",
"condition": "'tenant_backoffice_supervisor' in context.scope"
},
{
"source": "pending_approval",
"dest": "banned",
"condition": "'tenant_backoffice_supervisor' in context.scope"
},
{
"source": "pending_approval",
"dest": "inactive",
"condition": "'tenant_backoffice_supervisor' in context.scope"
},
{
"source": "pending_approval",
"dest": "creating",
"condition": "'tenant_backoffice_supervisor' in context.scope"
},
{ "source": "active", "dest": "pending" },
{ "source": "banned", "dest": "pending" },
{ "source": "inactive", "dest": "pending" }
]
3.4 Comments¶
Each user of Trak.e Web can add comments to the profile that you consider relevant. These comments are in rich text format. The comments are linked to the user who made them. In addition, the date and hour of the comment is saved. A user may edit or delete the comment that they have made, but can only see comments made by other people. The uses with the "Watcher" scope can see all the comments, but can't add new comments.
3.5 Web Research¶
From the data in the profile, web queries can be generated in search engines that help the KYC process.
3.6 Resources¶
Resources |
---|
dprofile_profile |
dprofile_comment |
dprofile_state |
dprofile_summary |
dprofile_websearch |