# Object Types

Sub-classing objects&#x20;

In your data modeling, you may find that you want to define an object class that inherits all properties from another. For example, you might have a generic `c_assessment` class with properties like `c_patient` and more specific classes like `c_blood_test` that has all the properties of `c_assessment` but also a set of more specific properties like `c_blood_type`.

To create an object type, you simply add the object type definitions into the `objectTypes` array of an object's definition. These types will inherit all the properties from the super-class (or super-type).

The properties that define an object type are as follows:

### Object Type Properties

| Name       | Type                      | Description                                                                   |
| ---------- | ------------------------- | ----------------------------------------------------------------------------- |
| name       | String                    | The API name for the object type                                              |
| label      | String                    | The human readable label for the object type                                  |
| properties | Property Definition Array | The array of property definitions for properties specific to this object type |

{% hint style="info" %}
Once an object type is defined, the `type` property becomes required when creating instances of the object. The `type` property is populated with the name of the object type you are creating.
{% endhint %}

### Examples

In this example, we've created the object class `c_assessment` and set the proper ACL's. We've also added a property to this object that all of this object's types will share: `c_patient`. This is because all assessments will be made on a particular patient, no matter what kind of assessment it is.

{% tabs %}
{% tab title="Request" %}

```
GET /objects/5951719d514ef101000216cf
```

{% endtab %}

{% tab title="Assessment Object Definition" %}

```javascript
{
    "_id": "5951719d514ef101000216cf",
    "access": 7,
    "allowConnections": true,
    "allowTransfers": true,
    "connectionOptions": {
        "requireAccept": true,
        "requiredAccess": 5,
        "sendNotifications": true
    },
    "createAcl": [
        {
            "_id": "5951719dfc65ed0100e62068",
            "allow": 1,
            "target": "000000000000000000000003",
            "type": 1
        }
    ],
    "created": "2017-06-26T20:42:05.183Z",
    "creator": {
        "_id": "5771495a1d0c03a53ce83f1a",
        "object": "account",
        "path": "/accounts/5771495a1d0c03a53ce83f1a"
    },
    "defaultAcl": [
        {
            "_id": "5951719dfc65ed0100e62069",
            "allow": 7,
            "target": null,
            "type": 4
        }
    ],
    "favorite": false,
    "feedDefinition": [],
    "label": "Assessment",
    "lookup": "5951719d514ef101000216cf",
    "name": "c_assessment",
    "object": "object",
    "objectTypes": [],
    "pluralName": "c_assessments",
    "properties": [
        {
            "_id": "595171e811f6710100683480",
            "acl": [],
            "auditable": false,
            "autoCreate": false,
            "cascadeDelete": true,
            "creatable": false,
            "expandable": true,
            "grant": 0,
            "indexed": true,
            "label": "Patient",
            "name": "c_patient",
            "optional": false,
            "pacl": [],
            "paths": [],
            "readAccess": 4,
            "readable": true,
            "referenceAccess": 5,
            "removable": false,
            "sourceObject": "account",
            "type": "Reference",
            "unique": false,
            "validators": [
                {
                    "_id": "595171e811f6710100683481",
                    "name": "required"
                }
            ],
            "writable": true,
            "writeAccess": 6
        }
    ],
    "shareChain": [
        5,
        4,
        2
    ],
    "updated": "2017-06-26T20:43:21.022Z",
    "updater": {
        "_id": "5771495a1d0c03a53ce83f1a",
        "object": "account",
        "path": "/accounts/5771495a1d0c03a53ce83f1a"
    }
}
```

{% endtab %}
{% endtabs %}

You'll notice that the `objectTypes` value in the JSON result above is an empty array. We're going to add a `c_blood_test` object type to this array.

{% tabs %}
{% tab title="Request" %}

```
POST /objects/5951719d514ef101000216cf/objectTypes
```

{% endtab %}

{% tab title="Object Type Request Body" %}

```javascript
{
    "label":"Blood Test",
    "name":"c_blood_test",
    "properties": [
        {
            "label":"Blood Type",
            "name":"c_blood_type",
            "type": "String",
            "validators": [
                {
                    "name": "required"
                }
            ]
        }
    ]
}
```

{% endtab %}
{% endtabs %}

Now, the objectTypes array contains the `c_blood_test` definition we just created.

{% tabs %}
{% tab title="Request" %}

```
GET /objects/5951719d514ef101000216cf/objectTypes
```

{% endtab %}

{% tab title="objectTypes array" %}

```javascript
{
    "data": [
        {
            "_id": "5951751611f6710100683fdc",
            "label": "Blood Test",
            "name": "c_blood_test",
            "properties": [
                {
                    "_id": "5951751611f6710100683fdd",
                    "acl": [],
                    "array": false,
                    "auditable": false,
                    "canPull": true,
                    "canPush": true,
                    "creatable": false,
                    "indexed": false,
                    "label": "Blood Type",
                    "lowercase": false,
                    "maxItems": 100,
                    "maxShift": false,
                    "minItems": 0,
                    "name": "c_blood_type",
                    "optional": false,
                    "readAccess": 4,
                    "readable": true,
                    "removable": false,
                    "trim": false,
                    "type": "String",
                    "unique": false,
                    "uniqueValues": false,
                    "uppercase": false,
                    "validators": [
                        {
                            "_id": "5951751611f6710100683fde",
                            "name": "required"
                        }
                    ],
                    "writable": true,
                    "writeAccess": 6,
                    "writeOnCreate": true
                }
            ]
        }
    ],
    "hasMore": false,
    "object": "list"
}
```

{% endtab %}
{% endtabs %}

We can now create a `c_assessment` object instance of type `c_blood_test`:

{% tabs %}
{% tab title="Request" %}

```
POST /c_assessments
```

{% endtab %}

{% tab title="Request Body" %}

```
{
    "c_patient":"5771495a1d0c03a53ce83f1a",
    "type":"c_blood_test",
    "c_blood_type":"Type A"
}
```

{% endtab %}
{% endtabs %}

The resulting instance of `c_assessment` is of `type: c_blood_test` and contains both the base property of `c_patient` and the `c_blood_test` type property `c_blood_type`.Request&#x20;

{% tabs %}
{% tab title="Result" %}

```javascript
{
    "_id": "59517718cfc40501006da501",
    "access": 7,
    "c_blood_type": "Type A",
    "c_patient": {
        "_id": "5771495a1d0c03a53ce83f1a",
        "object": "account",
        "path": "/accounts/5771495a1d0c03a53ce83f1a"
    },
    "created": "2017-06-26T21:05:28.068Z",
    "creator": {
        "_id": "5771495a1d0c03a53ce83f1a",
        "object": "account",
        "path": "/accounts/5771495a1d0c03a53ce83f1a"
    },
    "favorite": false,
    "object": "c_assessment",
    "owner": {
        "_id": "5771495a1d0c03a53ce83f1a",
        "object": "account",
        "path": "/accounts/5771495a1d0c03a53ce83f1a"
    },
    "shared": false,
    "type": "c_blood_test"
}
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.medable.com/cortex-api/object-types.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
