Attribute types define the fields displayed on object types. Features are flags that control how attributes render, index, and behave. Choosing the right attribute types and features determines whether your package works as expected.

Core Attribute Types

The core package ships 50+ attribute types covering common metadata fields. Reuse these before creating custom attribute types.

KeyPurpose
core#nameObject name
core#descriptionRich text description (is_html enabled)
core#abbreviationShort code or acronym
core#notePlain text note
core#urlExternal URL (is_url_link enabled)
core#date_createdCreation timestamp
core#date_modifiedLast modification timestamp
core#external_idIdentifier from an external system
core#classificationClassification tag reference
core#countNumeric count value
core#statusStatus label

These cover URLs, dates, counts, IDs, classifications, and general-purpose text. The full set spans 50+ attribute types.

Tip

Create a custom attribute type only when no core attribute fits the need. Custom attributes increase maintenance cost and reduce interoperability between packages.

Feature Catalog

Features are key-value flags attached to attribute types. They control rendering, search indexing, and data constraints.

Rendering Features

FeatureTypeEffect
is_htmlboolEnables the rich text editor for this attribute
is_url_linkboolRenders the value as a clickable hyperlink
is_yes_noboolRenders a checkbox toggle
is_yes_no_iconboolRenders a boolean with an icon indicator
is_dateboolRenders a date picker
is_numberboolRenders a numeric input field
sort_by_numberboolSorts values as integers instead of lexicographic strings
is_markdownboolRenders a Markdown editor

Use sort_by_number together with is_number. Without it, numeric values sort lexicographically (“10” appears before “2”).

Search Features

Search features control how Elasticsearch indexes the attribute values.

FeatureTypeEffect
is_search_type_textboolFull-text search with analysis and stemming
is_search_type_termboolExact matching and facet filtering
is_search_type_boolboolBoolean facet in search filters
is_token_textboolKeyword tokenization for tags and labels
is_search_default_result_textboolIncludes this attribute in search result snippets

An attribute without any is_search_type_* feature is not indexed. It will not appear in search results or facet filters, regardless of its content.

Data Features

FeatureTypeEffect
is_translatableboolSupports values in multiple languages
has_multiple_valuesboolAllows multiple values (default is single value)
is_mandatoryboolRequires a value before the object can be saved
is_parent_inheritableboolInherits value from parent object

The property acceptableCodetableValues (top-level on attribute type, not a feature) links to a codetable object type key for dropdown options.

Concept Features

Concept features apply to business glossary attributes where attributes map to semantic concepts.

FeaturePatternPurpose
is_attribute_type_concept_*boolMaps the attribute to a specific concept role (definition, example, scope)

These features are relevant for glossary and data catalog packages. Most custom packages do not need them.

For the complete list of all feature keys, see the package schema (package-schema-attributeTypes.json). The features listed above cover the most common use cases — the schema defines 60+ feature keys including script language variants (is_script_javascript, is_script_python, etc.) and specialized search variants.

Feature Type Safety

Features have explicit value types: boolean, integer, or string. The system does not coerce types.

{
  "key": "is_html",
  "value": true
}
Warning

Silent type mismatch. Setting is_html with the string "true" instead of boolean true causes silent failure. The feature stores without error, but the rich text editor never renders. Always match the expected type exactly.

Codetable Attributes

A codetable attribute creates a dropdown selector linked to a codetable object type. Each entry in the codetable has two fields:

FieldPurpose
labelDisplay text shown in the UI dropdown
valueInternal identifier used in filters and automations

Configure the link by setting the acceptableCodetableValues feature on the attribute type:

{
  "key": "acceptableCodetableValues",
  "value": "my_package#country_list"
}

The referenced codetable object type must exist and contain entries before the dropdown renders options.

Warning

Label vs. value in automation filters. Automation filters match against value, not label. A filter condition using the display label matches nothing. Always use the internal value field in filter expressions and API queries.

Conditions on Attributes

Conditions restrict attribute visibility or editability based on the user’s relation to the object and the current workflow state.

{
  "conditions": [
    {
      "userRelationTypeKey": "core_business_owner",
      "workflowStateKey": "draft",
      "editable": true,
      "visible": true
    }
  ]
}

Both userRelationTypeKey and workflowStateKey must reference valid entities declared in the package or its dependencies. An invalid key causes the condition to silently fail, making the attribute invisible to all users in that state.

Condition Evaluation

  • Multiple conditions combine with OR logic. If any condition matches, the attribute is visible/editable.
  • A condition with only userRelationTypeKey (no workflowStateKey) applies in all workflow states.
  • A condition with only workflowStateKey (no userRelationTypeKey) applies to all users.
  • An attribute with no conditions is visible and editable by default.

Decision Tree: Choosing Features

NeedFeatureNotes
Rich text editingis_htmlEnables WYSIWYG editor
Clickable linkis_url_linkRenders as <a> element
Yes/No toggleis_yes_noCheckbox control
Yes/No with iconis_yes_no_iconVisual indicator instead of checkbox
Dropdown selectionacceptableCodetableValuesReference a codetable objectType
Full-text searchableis_search_type_textAnalyzed, stemmed, ranked by relevance
Exact-match filteris_search_type_termFacet filtering, exact value matching
Boolean filteris_search_type_boolBoolean facet in search sidebar
Tag-style keywordsis_token_textTokenized keyword matching
Date inputis_dateCalendar date picker
Numeric inputis_number + sort_by_numberNumeric field with correct sort order
Markdown editoris_markdownMarkdown rendering and editing
Multi-languageis_translatableOne value per configured language
Multiple valueshas_multiple_valuesAllows adding more than one value
Required fieldis_mandatoryObject cannot be saved without this value

Combining Features

Multiple features can apply to the same attribute type. Common combinations:

  • is_number + sort_by_number + is_search_type_term — numeric field, sorted correctly, filterable as a facet
  • is_html + is_search_type_text + is_search_default_result_text — rich text, full-text searchable, shown in search snippets
  • is_translatable + is_search_type_text — multi-language text, each language indexed separately
  • is_yes_no + is_search_type_bool — boolean toggle with a boolean facet filter
Warning

Conflicting features. Do not combine is_html with is_number or is_date. The rendering engine uses the first recognized feature and ignores the rest. No error is raised.

Gotchas

Warning

Missing sort_by_number. A numeric attribute without sort_by_number sorts values as strings. The sequence “1, 2, 10, 20” sorts as “1, 10, 2, 20”. Add sort_by_number to every is_number attribute.

Warning

No search features = invisible to search. An attribute type without any is_search_type_* feature is excluded from the Elasticsearch index entirely. The data exists in the database but is not discoverable through search. This is the most common cause of “missing” attribute values in search results.

Warning

Codetable must exist before reference. The acceptableCodetableValues feature references a codetable object type by key. If that object type does not exist at installation time, the attribute installs without error, but the dropdown renders empty.

Warning

Condition keys must be valid. A condition referencing a nonexistent userRelationTypeKey or workflowStateKey does not raise an error. The condition evaluates to false for all users in all states, effectively hiding the attribute.

Complete Attribute Type Example

An attribute type with rendering, search, and data features:

{
  "key": "business_definition",
  "name": "Business Definition",
  "features": [
    { "key": "is_html", "value": true },
    { "key": "is_translatable", "value": true },
    { "key": "is_mandatory", "value": true },
    { "key": "is_search_type_text", "value": true },
    { "key": "is_search_default_result_text", "value": true }
  ],
  "conditions": [
    {
      "userRelationTypeKey": "core_business_owner",
      "workflowStateKey": "draft",
      "editable": true,
      "visible": true
    },
    {
      "userRelationTypeKey": "core_steward",
      "editable": true,
      "visible": true
    }
  ]
}

This attribute renders as a rich text editor, supports translations, is required, full-text searchable, and appears in search result snippets. Business owners can edit it only in draft state. Stewards can edit it in any state.

For a complete guide on conditions — including standalone condition assets, evaluation logic, and when to use inline vs standalone conditions — see Conditional Visibility.