{"templateId":"../@theme/Templates/BlogWithAuthors","sharedDataIds":{"sidebar":"sidebar-blog/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"What SmartenContent does","description":"Developer documentation for the Caraer platform. REST API reference, Bearer authentication, tutorials, and guides for records, forms, webpages, webhooks, and automations.","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["SmartenContent"]}," is the runtime placeholder engine that resolves dynamic values"," ","inside content structures using a record context."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-smartencontent-does","__idx":0},"children":["What SmartenContent does"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["It traverses nested content and replaces ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{{...}}"]}," expressions in strings."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This allows dynamic text in CMS blocks, filters, and query-like structures."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"supported-notation-styles","__idx":1},"children":["Supported notation styles"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["{{property=firstname&object=user&relation=owner&defaultValue=John}}"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Common parameters include:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["property"]},": The name of the property or field you want to resolve from the record context (e.g., ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["firstname"]},")."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["object"]},": The object type from which to fetch the property value (e.g., ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["user"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["candidate"]},"). Controls the lookup context of a related record."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["relation"]},": The name of the relation to traverse in order to fetch a related record before resolving the property (e.g., ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["owner"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["applied_for"]},")."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["defaultValue"]},": The value to use if resolution fails or the target property is missing/no record found."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["relationType"]}," (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["primary"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["all"]},"): Determines whether to resolve only the primary related record (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["primary"]},") or aggregate values from all related records (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["all"]},")."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["seperator"]},": String used to join multiple values when ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["relationType=all"]}," aggregates several results (note: spelling should usually be ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["separator"]},")."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["internal"]},": If true, fetches the internal/raw value (e.g., underlying ID) instead of the display/transformed value."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["cypher"]},": Enables custom Cypher query injection for advanced graph traversals before value resolution. Used for power user graph queries."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["user"]},": Context flag for injecting the current user (e.g., for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["user=uuid"]},"), allowing placeholders to resolve based on the active session."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failLevel"]},": Determines the error-handling strategy on resolution failure, such as whether to prune just a field, the entire block, or a larger content subtree."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"relation-and-object-aware-resolution","__idx":2},"children":["Relation and object-aware resolution"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When relation/object context is provided:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["related records are loaded using the relation"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["values can be aggregated (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["relationType=all"]},") with separator joining"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["fallback default values are used when no related value resolves"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This enables expressive dynamic text beyond simple property interpolation."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"why-fail-levels-matter","__idx":3},"children":["Why fail levels matter"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["failLevel"]}," supports higher-level pruning decisions in caller logic (for"," ","example CMS tree pruning in ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["PageContent"]}," workflows). It helps you decide"," ","whether to:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["remove only a field"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["remove a block"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["remove a parent subtree"]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["based on where smartening failed."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"practical-usage-recommendations","__idx":4},"children":["Practical usage recommendations"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Prefer explicit ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["property"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["object"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["relation"]}," parameters in new"," ","templates."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["defaultValue"]}," for safer public rendering."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Use ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["internal=true"]}," only when raw/internal values are actually required."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Keep placeholders small and deterministic for easier debugging."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"related-reading","__idx":5},"children":["Related reading"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"a","attributes":{"href":"/blog/2026-03-25-save-records"},"children":["Save records"]}]}]}]},"headings":[{"value":"What SmartenContent does","id":"what-smartencontent-does","depth":2},{"value":"Supported notation styles","id":"supported-notation-styles","depth":2},{"value":"Relation and object-aware resolution","id":"relation-and-object-aware-resolution","depth":2},{"value":"Why fail levels matter","id":"why-fail-levels-matter","depth":2},{"value":"Practical usage recommendations","id":"practical-usage-recommendations","depth":2},{"value":"Related reading","id":"related-reading","depth":2}],"frontmatter":{"title":"SmartenContent deep dive","authors":["sem_tadema"],"tags":["documentation","api"],"template":"../@theme/Templates/BlogWithAuthors","seo":{"title":"What SmartenContent does"}},"lastModified":"2026-03-25T15:23:57.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/blog/2026-03-25-smartencontent-deep-dive","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}