# Object Properties

The following sections describe the possible types of custom properties you can add to an object definition.

### Base Property Options

The following base options are available when defining properties, unless otherwise noted. See individual properties for additional property-specific options.

**\*Bold** options are required\*

| Name          | Type           | Default | Description                                                                                                                                                                                                                                                              |
| ------------- | -------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **name**      | String         |         | API name of property.                                                                                                                                                                                                                                                    |
| **label**     | String         |         | Property label that can be used in UI.                                                                                                                                                                                                                                   |
| **type**      | String         |         | The property type. See individual property type details for more info.                                                                                                                                                                                                   |
| description   | String         |         | Property description. This can be used for UI or for administrative purposes.                                                                                                                                                                                            |
| array         | Boolean        | false   | If true, this property is an array of this type rather than a single value. This option can only be set when creating the property and cannot be changed.                                                                                                                |
| uniqueValues  | Boolean        | false   | Applies only if `array: true`. If true, values in array are guaranteed to be unique.                                                                                                                                                                                     |
| minItems      | Integer        | 0       | Applies only if `array: true`. The minimum number of items required in the array. Set to `0` for no minimum.                                                                                                                                                             |
| maxItems      | Integer        | 100     | Applies only if `array: true`. The maximum number of items allowed in the array. Cannot be greater than 1000.                                                                                                                                                            |
| maxShift      | Boolean        | false   | Applies only if `array: true`. When true, shifts older items off of front of array when max items is reached rather than producing a `kMaxAllowed` fault.                                                                                                                |
| canPush       | Boolean        | true    | Applies only if `array: true`. If true, `POST` operations on the property can push values into the array.                                                                                                                                                                |
| canPull       | Boolean        | true    | Applies only if `array: true`. If true, `DELETE` operations on property can remove items from the array by value or by array element `_id`                                                                                                                               |
| writeOnCreate | Boolean        | true    | Applies only if `array: true`. Allow values to be written to property array on document create.                                                                                                                                                                          |
| readAccess    | Integer        | 4       | The access level require to read this property. See [Access Control ](https://docs.medable.com/cortex-api/access-control)for available values.                                                                                                                           |
| writeAccess   | Integer        | 6       | The access level require to write to this property. See [Access Control](#base-property-options) for available values.                                                                                                                                                   |
| acl           | Document Array |         | Allows additional ACL to be specified for property. This acl merges with runtime acl to increase access to this property. Additive only -- these acl entries cannot lessen access to this property.                                                                      |
| auditable     | Boolean        | false   | When true, changes to this property will result in a record in the audit logs.                                                                                                                                                                                           |
| readable      | Boolean        | true    | Allow this property to be read. When false, this property is not available through the API and is only available through scripts.                                                                                                                                        |
| writable      | Boolean        | true    | When true, this property is writable via the API. When false, this property is only writable through scripts.                                                                                                                                                            |
| creatable     | Boolean        | false   | When true, this property is only writable on document creation.                                                                                                                                                                                                          |
| removable     | Boolean        | false   | If true, this property can be removed from a document using `DELETE` method. Otherwise, property can only be nullified.                                                                                                                                                  |
| history       | Boolean        | false   | If true, changes to this property are recorded in a history collection and made available though an `audit.history` property on the object. Note that the `audit.history` property is optional and is not returned unless explicitly included with the `include` option. |
| optional      | Boolean        | false   | If true, this property is not included in read operations unless explicitly included with the `include` option.                                                                                                                                                          |
| indexed       | Boolean        | false   | If true, property is indexed and available for [querying](https://docs.medable.com/cortex-api/querying). There is a limit of 20 indexed properties per object.                                                                                                           |
| unique        | Boolean        | false   | If true, the property will be guaranteed unique. This option can only be set on property definition creation. There is a limit of 5 unique properties per object.                                                                                                        |
| validators    | Document Array |         | A list of validators applied to this property before writing. Failure to validate will result in a`kValidationError`. See [Property Validation Options](#base-property-options) for available validation options.                                                        |

### Property Validation Rules

When defining custom object properties, you can also specify validation rules to apply to your properties in the property definition `validators` option. You can specify multiple validation rules for a property.

When defined, these rules are evaluated prior to properties being written. Should validation fail for a property, the entire request will fail and a `kValidationError` [fault](https://docs.medable.com/reference-link/faults) will be returned for each validation error. When validations faults are returned, property paths are also returned with the faults. This is helpful when relaying validation errors to users in a client UI.

Validation rules take the form:

```
{
  "name": <validator name>,
  "description": <validator description>,
  "definition": { <validator definition> }
}
```

**\*Bold** options are required\*

| Name        | Type     | Description                                                                                                       |
| ----------- | -------- | ----------------------------------------------------------------------------------------------------------------- |
| **name**    | String   | The name of an available validator for the property. See individual property details for available validators.    |
| description | String   | A description of the validator                                                                                    |
| definition  | Document | A document specifying validator options (if available). See individual property validators for available options. |


---

# 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/objects-definition/object-properties.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.
