Skip to content

Content schema reference

Generated from packages/schema/json/*.schema.json by site/scripts/gen_schema_ref.py on every build. Do not edit by hand. The JSON files themselves come from pnpm schema:export and are committed in the repo.

Paths use [] for array items, {key} for map entries and {kind=value} where a union is split by a literal field. The Zod source in packages/schema/src is the authority; this page is a flat view of its exported JSON Schema.

ContentItem

Every authored item. A union of nine kinds, discriminated by kind.

ContentItem: process

Path Type Required Constraints
id string yes min length 1
appKey string yes
name string yes
description string
status draft | published | archived yes
version integer yes min 0
schemaVersion 2 yes
match object yes
match.pathPatterns array of string yes
match.form Locator (see below)
match.conditions array of object
match.conditions[]{kind=element-exists}.kind "element-exists" yes
match.conditions[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[]{kind=element-exists}.negate boolean
match.conditions[]{kind=element-text}.kind "element-text" yes
match.conditions[]{kind=element-text}.locator Locator (see below) yes
match.conditions[]{kind=element-text}.op equals | contains | matches yes
match.conditions[]{kind=element-text}.value string yes
match.conditions[]{kind=field-value}.kind "field-value" yes
match.conditions[]{kind=field-value}.locator Locator (see below) yes
match.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[]{kind=field-value}.value string or array of string
match.conditions[]{kind=url}.kind "url" yes
match.conditions[]{kind=url}.pathPattern string yes
match.conditions[]{kind=segment}.kind "segment" yes
match.conditions[]{kind=segment}.segmentId string yes min length 1
match.conditions[]{kind=content-completed}.kind "content-completed" yes
match.conditions[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].kind all | any yes
match.conditions[].of array of object yes
match.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
match.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-exists}.negate boolean
match.conditions[].of[]{kind=element-text}.kind "element-text" yes
match.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
match.conditions[].of[]{kind=element-text}.value string yes
match.conditions[].of[]{kind=field-value}.kind "field-value" yes
match.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
match.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[].of[]{kind=field-value}.value string or array of string
match.conditions[].of[]{kind=url}.kind "url" yes
match.conditions[].of[]{kind=url}.pathPattern string yes
match.conditions[].of[]{kind=segment}.kind "segment" yes
match.conditions[].of[]{kind=segment}.segmentId string yes min length 1
match.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
match.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].of[].kind all | any yes
match.conditions[].of[].of array of object yes
segments array of string yes
schedule object
schedule.from string
schedule.to string
tags array of string yes
locale string yes
translations map of map of string
restricted boolean
createdBy string yes
updatedBy string yes
createdAt string yes
updatedAt string yes
publishedAt string
kind "process" yes
trigger object yes
trigger{type=page-load}.type "page-load" yes
trigger{type=page-load}.delayMs integer min 0
trigger{type=element-visible}.type "element-visible" yes
trigger{type=element-visible}.locator Locator (see below) yes
trigger{type=element-click}.type "element-click" yes
trigger{type=element-click}.locator Locator (see below) yes
trigger{type=launcher}.type "launcher" yes
trigger{type=resource-center}.type "resource-center" yes
trigger{type=url-param}.type "url-param" yes
trigger{type=url-param}.name string yes
trigger{type=url-param}.value string
trigger{type=idle}.type "idle" yes
trigger{type=idle}.seconds number yes
trigger{type=manual}.type "manual" yes
frequency once | once-per-version | every-visit | until-completed | manual-only yes
stages array of object yes
stages[].id string yes min length 1
stages[].label string yes
stages[].walkthroughId string yes min length 1
stages[].enterWhen object yes
stages[].enterWhen.pathPatterns array of string yes
stages[].enterWhen.form Locator (see below)
stages[].enterWhen.conditions array of object
stages[].enterWhen.conditions[]{kind=element-exists}.kind "element-exists" yes
stages[].enterWhen.conditions[]{kind=element-exists}.locator Locator (see below) yes
stages[].enterWhen.conditions[]{kind=element-exists}.negate boolean
stages[].enterWhen.conditions[]{kind=element-text}.kind "element-text" yes
stages[].enterWhen.conditions[]{kind=element-text}.locator Locator (see below) yes
stages[].enterWhen.conditions[]{kind=element-text}.op equals | contains | matches yes
stages[].enterWhen.conditions[]{kind=element-text}.value string yes
stages[].enterWhen.conditions[]{kind=field-value}.kind "field-value" yes
stages[].enterWhen.conditions[]{kind=field-value}.locator Locator (see below) yes
stages[].enterWhen.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
stages[].enterWhen.conditions[]{kind=field-value}.value string or array of string
stages[].enterWhen.conditions[]{kind=url}.kind "url" yes
stages[].enterWhen.conditions[]{kind=url}.pathPattern string yes
stages[].enterWhen.conditions[]{kind=segment}.kind "segment" yes
stages[].enterWhen.conditions[]{kind=segment}.segmentId string yes min length 1
stages[].enterWhen.conditions[]{kind=content-completed}.kind "content-completed" yes
stages[].enterWhen.conditions[]{kind=content-completed}.contentId string yes min length 1
stages[].enterWhen.conditions[].kind all | any yes
stages[].enterWhen.conditions[].of array of object yes
stages[].enterWhen.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
stages[].enterWhen.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
stages[].enterWhen.conditions[].of[]{kind=element-exists}.negate boolean
stages[].enterWhen.conditions[].of[]{kind=element-text}.kind "element-text" yes
stages[].enterWhen.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
stages[].enterWhen.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
stages[].enterWhen.conditions[].of[]{kind=element-text}.value string yes
stages[].enterWhen.conditions[].of[]{kind=field-value}.kind "field-value" yes
stages[].enterWhen.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
stages[].enterWhen.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
stages[].enterWhen.conditions[].of[]{kind=field-value}.value string or array of string
stages[].enterWhen.conditions[].of[]{kind=url}.kind "url" yes
stages[].enterWhen.conditions[].of[]{kind=url}.pathPattern string yes
stages[].enterWhen.conditions[].of[]{kind=segment}.kind "segment" yes
stages[].enterWhen.conditions[].of[]{kind=segment}.segmentId string yes min length 1
stages[].enterWhen.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
stages[].enterWhen.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
stages[].enterWhen.conditions[].of[].kind all | any yes
stages[].enterWhen.conditions[].of[].of array of object yes
stages[].next object yes
stages[].next{kind=sequential}.kind "sequential" yes
stages[].next{kind=branch}.kind "branch" yes
stages[].next{kind=branch}.cases array of object yes
stages[].next{kind=branch}.cases[].when object yes
stages[].next{kind=branch}.cases[].when{kind=element-exists}.kind "element-exists" yes
stages[].next{kind=branch}.cases[].when{kind=element-exists}.locator Locator (see below) yes
stages[].next{kind=branch}.cases[].when{kind=element-exists}.negate boolean
stages[].next{kind=branch}.cases[].when{kind=element-text}.kind "element-text" yes
stages[].next{kind=branch}.cases[].when{kind=element-text}.locator Locator (see below) yes
stages[].next{kind=branch}.cases[].when{kind=element-text}.op equals | contains | matches yes
stages[].next{kind=branch}.cases[].when{kind=element-text}.value string yes
stages[].next{kind=branch}.cases[].when{kind=field-value}.kind "field-value" yes
stages[].next{kind=branch}.cases[].when{kind=field-value}.locator Locator (see below) yes
stages[].next{kind=branch}.cases[].when{kind=field-value}.op equals | in | empty | not-empty yes
stages[].next{kind=branch}.cases[].when{kind=field-value}.value string or array of string
stages[].next{kind=branch}.cases[].when{kind=url}.kind "url" yes
stages[].next{kind=branch}.cases[].when{kind=url}.pathPattern string yes
stages[].next{kind=branch}.cases[].when{kind=segment}.kind "segment" yes
stages[].next{kind=branch}.cases[].when{kind=segment}.segmentId string yes min length 1
stages[].next{kind=branch}.cases[].when{kind=content-completed}.kind "content-completed" yes
stages[].next{kind=branch}.cases[].when{kind=content-completed}.contentId string yes min length 1
stages[].next{kind=branch}.cases[].when.kind all | any yes
stages[].next{kind=branch}.cases[].when.of array of object yes
stages[].next{kind=branch}.cases[].goTo string yes min length 1
stages[].next{kind=branch}.otherwise string min length 1
stages[].next{kind=go-to}.kind "go-to" yes
stages[].next{kind=go-to}.target string yes min length 1
stages[].next{kind=end}.kind "end" yes
stages[].optional boolean
keywords array of string
startStageId string yes
goal object yes
goal{kind=element-appears}.kind "element-appears" yes
goal{kind=element-appears}.locator Locator (see below) yes
goal{kind=url-matches}.kind "url-matches" yes
goal{kind=url-matches}.pathPattern string yes
goal{kind=last-step-completed}.kind "last-step-completed" yes
showStepper boolean yes
resumeDays integer yes

ContentItem: walkthrough

Path Type Required Constraints
id string yes min length 1
appKey string yes
name string yes
description string
status draft | published | archived yes
version integer yes min 0
schemaVersion 2 yes
match object yes
match.pathPatterns array of string yes
match.form Locator (see below)
match.conditions array of object
match.conditions[]{kind=element-exists}.kind "element-exists" yes
match.conditions[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[]{kind=element-exists}.negate boolean
match.conditions[]{kind=element-text}.kind "element-text" yes
match.conditions[]{kind=element-text}.locator Locator (see below) yes
match.conditions[]{kind=element-text}.op equals | contains | matches yes
match.conditions[]{kind=element-text}.value string yes
match.conditions[]{kind=field-value}.kind "field-value" yes
match.conditions[]{kind=field-value}.locator Locator (see below) yes
match.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[]{kind=field-value}.value string or array of string
match.conditions[]{kind=url}.kind "url" yes
match.conditions[]{kind=url}.pathPattern string yes
match.conditions[]{kind=segment}.kind "segment" yes
match.conditions[]{kind=segment}.segmentId string yes min length 1
match.conditions[]{kind=content-completed}.kind "content-completed" yes
match.conditions[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].kind all | any yes
match.conditions[].of array of object yes
match.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
match.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-exists}.negate boolean
match.conditions[].of[]{kind=element-text}.kind "element-text" yes
match.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
match.conditions[].of[]{kind=element-text}.value string yes
match.conditions[].of[]{kind=field-value}.kind "field-value" yes
match.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
match.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[].of[]{kind=field-value}.value string or array of string
match.conditions[].of[]{kind=url}.kind "url" yes
match.conditions[].of[]{kind=url}.pathPattern string yes
match.conditions[].of[]{kind=segment}.kind "segment" yes
match.conditions[].of[]{kind=segment}.segmentId string yes min length 1
match.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
match.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].of[].kind all | any yes
match.conditions[].of[].of array of object yes
segments array of string yes
schedule object
schedule.from string
schedule.to string
tags array of string yes
locale string yes
translations map of map of string
restricted boolean
createdBy string yes
updatedBy string yes
createdAt string yes
updatedAt string yes
publishedAt string
kind "walkthrough" yes
trigger object yes
trigger{type=page-load}.type "page-load" yes
trigger{type=page-load}.delayMs integer min 0
trigger{type=element-visible}.type "element-visible" yes
trigger{type=element-visible}.locator Locator (see below) yes
trigger{type=element-click}.type "element-click" yes
trigger{type=element-click}.locator Locator (see below) yes
trigger{type=launcher}.type "launcher" yes
trigger{type=resource-center}.type "resource-center" yes
trigger{type=url-param}.type "url-param" yes
trigger{type=url-param}.name string yes
trigger{type=url-param}.value string
trigger{type=idle}.type "idle" yes
trigger{type=idle}.seconds number yes
trigger{type=manual}.type "manual" yes
frequency once | once-per-version | every-visit | until-completed | manual-only yes
steps array of object yes
steps[].id string yes min length 1
steps[].anchor Locator (see below) or null yes
steps[].page object
steps[].page.pathPatterns array of string yes
steps[].page.form Locator (see below)
steps[].page.conditions array of object
steps[].page.conditions[]{kind=element-exists}.kind "element-exists" yes
steps[].page.conditions[]{kind=element-exists}.locator Locator (see below) yes
steps[].page.conditions[]{kind=element-exists}.negate boolean
steps[].page.conditions[]{kind=element-text}.kind "element-text" yes
steps[].page.conditions[]{kind=element-text}.locator Locator (see below) yes
steps[].page.conditions[]{kind=element-text}.op equals | contains | matches yes
steps[].page.conditions[]{kind=element-text}.value string yes
steps[].page.conditions[]{kind=field-value}.kind "field-value" yes
steps[].page.conditions[]{kind=field-value}.locator Locator (see below) yes
steps[].page.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
steps[].page.conditions[]{kind=field-value}.value string or array of string
steps[].page.conditions[]{kind=url}.kind "url" yes
steps[].page.conditions[]{kind=url}.pathPattern string yes
steps[].page.conditions[]{kind=segment}.kind "segment" yes
steps[].page.conditions[]{kind=segment}.segmentId string yes min length 1
steps[].page.conditions[]{kind=content-completed}.kind "content-completed" yes
steps[].page.conditions[]{kind=content-completed}.contentId string yes min length 1
steps[].page.conditions[].kind all | any yes
steps[].page.conditions[].of array of object yes
steps[].page.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
steps[].page.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
steps[].page.conditions[].of[]{kind=element-exists}.negate boolean
steps[].page.conditions[].of[]{kind=element-text}.kind "element-text" yes
steps[].page.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
steps[].page.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
steps[].page.conditions[].of[]{kind=element-text}.value string yes
steps[].page.conditions[].of[]{kind=field-value}.kind "field-value" yes
steps[].page.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
steps[].page.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
steps[].page.conditions[].of[]{kind=field-value}.value string or array of string
steps[].page.conditions[].of[]{kind=url}.kind "url" yes
steps[].page.conditions[].of[]{kind=url}.pathPattern string yes
steps[].page.conditions[].of[]{kind=segment}.kind "segment" yes
steps[].page.conditions[].of[]{kind=segment}.segmentId string yes min length 1
steps[].page.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
steps[].page.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
steps[].page.conditions[].of[].kind all | any yes
steps[].page.conditions[].of[].of array of object yes
steps[].display object yes
steps[].display{type=tooltip}.type "tooltip" yes
steps[].display{type=tooltip}.placement auto | top | bottom | left | right | top-start | top-end | bottom-start | bottom-end yes
steps[].display{type=hotspot}.type "hotspot" yes
steps[].display{type=hotspot}.placement auto | top | bottom | left | right | top-start | top-end | bottom-start | bottom-end yes
steps[].display{type=inline-hint}.type "inline-hint" yes
steps[].display{type=inline-hint}.position auto | below | above | after-end | before-start default auto
steps[].display{type=modal}.type "modal" yes
steps[].display{type=modal}.size sm | md | lg yes
steps[].display{type=slideout}.type "slideout" yes
steps[].display{type=slideout}.side right | left yes
steps[].focus none | spotlight | block-outside | modal yes
steps[].content object yes
steps[].content.title string
steps[].content.bodyMarkdown string yes
steps[].content.media object
steps[].content.media{kind=image}.kind "image" yes
steps[].content.media{kind=image}.asset object yes
steps[].content.media{kind=image}.asset.sha256 string yes pattern ^[0-9a-f]{64}$
steps[].content.media{kind=image}.asset.mime string yes
steps[].content.media{kind=image}.asset.bytes integer yes min 0
steps[].content.media{kind=image}.alt string yes
steps[].content.media{kind=video}.kind "video" yes
steps[].content.media{kind=video}.url string yes
steps[].content.media{kind=video}.provider stream | youtube | vimeo | mp4 yes
steps[].content.learnMore array of string
steps[].buttons array of object yes max items 3
steps[].buttons[].label string yes
steps[].buttons[].style primary | secondary | link yes
steps[].buttons[].action object yes
steps[].buttons[].action{do=next}.do "next" yes
steps[].buttons[].action{do=back}.do "back" yes
steps[].buttons[].action{do=dismiss}.do "dismiss" yes
steps[].buttons[].action{do=acknowledge}.do "acknowledge" yes
steps[].buttons[].action{do=snooze}.do "snooze" yes
steps[].buttons[].action{do=snooze}.minutes number yes
steps[].buttons[].action{do=go-to-step}.do "go-to-step" yes
steps[].buttons[].action{do=go-to-step}.stepId string yes min length 1
steps[].buttons[].action{do=start-content}.do "start-content" yes
steps[].buttons[].action{do=start-content}.contentId string yes min length 1
steps[].buttons[].action{do=open-resource}.do "open-resource" yes
steps[].buttons[].action{do=open-resource}.resourceId string yes min length 1
steps[].buttons[].action{do=open-url}.do "open-url" yes
steps[].buttons[].action{do=open-url}.url string yes
steps[].buttons[].action{do=open-url}.openIn new-tab | same-tab | panel | modal yes
steps[].buttons[].action{do=open-resource-center}.do "open-resource-center" yes
steps[].buttons[].action{do=open-resource-center}.tab help | tasks | search
steps[].advance object yes
steps[].advance{on=next-button}.on "next-button" yes
steps[].advance{on=click-anchor}.on "click-anchor" yes
steps[].advance{on=input-anchor}.on "input-anchor" yes
steps[].advance{on=input-anchor}.minLength integer
steps[].advance{on=element-appears}.on "element-appears" yes
steps[].advance{on=element-appears}.locator Locator (see below) yes
steps[].advance{on=element-disappears}.on "element-disappears" yes
steps[].advance{on=element-disappears}.locator Locator (see below) yes
steps[].advance{on=page-matches}.on "page-matches" yes
steps[].advance{on=page-matches}.page object yes
steps[].advance{on=page-matches}.page.pathPatterns array of string yes
steps[].advance{on=page-matches}.page.form Locator (see below)
steps[].advance{on=page-matches}.page.conditions array of object
steps[].advance{on=page-matches}.page.conditions[]{kind=element-exists}.kind "element-exists" yes
steps[].advance{on=page-matches}.page.conditions[]{kind=element-exists}.locator Locator (see below) yes
steps[].advance{on=page-matches}.page.conditions[]{kind=element-exists}.negate boolean
steps[].advance{on=page-matches}.page.conditions[]{kind=element-text}.kind "element-text" yes
steps[].advance{on=page-matches}.page.conditions[]{kind=element-text}.locator Locator (see below) yes
steps[].advance{on=page-matches}.page.conditions[]{kind=element-text}.op equals | contains | matches yes
steps[].advance{on=page-matches}.page.conditions[]{kind=element-text}.value string yes
steps[].advance{on=page-matches}.page.conditions[]{kind=field-value}.kind "field-value" yes
steps[].advance{on=page-matches}.page.conditions[]{kind=field-value}.locator Locator (see below) yes
steps[].advance{on=page-matches}.page.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
steps[].advance{on=page-matches}.page.conditions[]{kind=field-value}.value string or array of string
steps[].advance{on=page-matches}.page.conditions[]{kind=url}.kind "url" yes
steps[].advance{on=page-matches}.page.conditions[]{kind=url}.pathPattern string yes
steps[].advance{on=page-matches}.page.conditions[]{kind=segment}.kind "segment" yes
steps[].advance{on=page-matches}.page.conditions[]{kind=segment}.segmentId string yes min length 1
steps[].advance{on=page-matches}.page.conditions[]{kind=content-completed}.kind "content-completed" yes
steps[].advance{on=page-matches}.page.conditions[]{kind=content-completed}.contentId string yes min length 1
steps[].advance{on=page-matches}.page.conditions[].kind all | any yes
steps[].advance{on=page-matches}.page.conditions[].of array of object yes
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=element-exists}.negate boolean
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=element-text}.kind "element-text" yes
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=element-text}.value string yes
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=field-value}.kind "field-value" yes
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=field-value}.value string or array of string
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=url}.kind "url" yes
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=url}.pathPattern string yes
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=segment}.kind "segment" yes
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=segment}.segmentId string yes min length 1
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
steps[].advance{on=page-matches}.page.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
steps[].advance{on=page-matches}.page.conditions[].of[].kind all | any yes
steps[].advance{on=page-matches}.page.conditions[].of[].of array of object yes
steps[].advance{on=form-submitted}.on "form-submitted" yes
steps[].advance{on=form-submitted}.form Locator (see below) yes
steps[].advance{on=any}.on "any" yes
steps[].advance{on=any}.of array of object yes
steps[].advance{on=any}.of[]{on=next-button}.on "next-button" yes
steps[].advance{on=any}.of[]{on=click-anchor}.on "click-anchor" yes
steps[].advance{on=any}.of[]{on=input-anchor}.on "input-anchor" yes
steps[].advance{on=any}.of[]{on=input-anchor}.minLength integer
steps[].advance{on=any}.of[]{on=element-appears}.on "element-appears" yes
steps[].advance{on=any}.of[]{on=element-appears}.locator Locator (see below) yes
steps[].advance{on=any}.of[]{on=element-disappears}.on "element-disappears" yes
steps[].advance{on=any}.of[]{on=element-disappears}.locator Locator (see below) yes
steps[].advance{on=any}.of[]{on=page-matches}.on "page-matches" yes
steps[].advance{on=any}.of[]{on=page-matches}.page object yes
steps[].advance{on=any}.of[]{on=page-matches}.page.pathPatterns array of string yes
steps[].advance{on=any}.of[]{on=page-matches}.page.form Locator (see below)
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions array of object
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=element-exists}.kind "element-exists" yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=element-exists}.locator Locator (see below) yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=element-exists}.negate boolean
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=element-text}.kind "element-text" yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=element-text}.locator Locator (see below) yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=element-text}.op equals | contains | matches yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=element-text}.value string yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=field-value}.kind "field-value" yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=field-value}.locator Locator (see below) yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=field-value}.value string or array of string
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=url}.kind "url" yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=url}.pathPattern string yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=segment}.kind "segment" yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=segment}.segmentId string yes min length 1
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=content-completed}.kind "content-completed" yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[]{kind=content-completed}.contentId string yes min length 1
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].kind all | any yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of array of object yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=element-exists}.negate boolean
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=element-text}.kind "element-text" yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=element-text}.value string yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=field-value}.kind "field-value" yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=field-value}.value string or array of string
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=url}.kind "url" yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=url}.pathPattern string yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=segment}.kind "segment" yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=segment}.segmentId string yes min length 1
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[].kind all | any yes
steps[].advance{on=any}.of[]{on=page-matches}.page.conditions[].of[].of array of object yes
steps[].advance{on=any}.of[]{on=form-submitted}.on "form-submitted" yes
steps[].advance{on=any}.of[]{on=form-submitted}.form Locator (see below) yes
steps[].advance{on=any}.of[]{on=any}.on "any" yes
steps[].advance{on=any}.of[]{on=any}.of array of object yes
steps[].next object yes
steps[].next{kind=sequential}.kind "sequential" yes
steps[].next{kind=branch}.kind "branch" yes
steps[].next{kind=branch}.cases array of object yes
steps[].next{kind=branch}.cases[].when object yes
steps[].next{kind=branch}.cases[].when{kind=element-exists}.kind "element-exists" yes
steps[].next{kind=branch}.cases[].when{kind=element-exists}.locator Locator (see below) yes
steps[].next{kind=branch}.cases[].when{kind=element-exists}.negate boolean
steps[].next{kind=branch}.cases[].when{kind=element-text}.kind "element-text" yes
steps[].next{kind=branch}.cases[].when{kind=element-text}.locator Locator (see below) yes
steps[].next{kind=branch}.cases[].when{kind=element-text}.op equals | contains | matches yes
steps[].next{kind=branch}.cases[].when{kind=element-text}.value string yes
steps[].next{kind=branch}.cases[].when{kind=field-value}.kind "field-value" yes
steps[].next{kind=branch}.cases[].when{kind=field-value}.locator Locator (see below) yes
steps[].next{kind=branch}.cases[].when{kind=field-value}.op equals | in | empty | not-empty yes
steps[].next{kind=branch}.cases[].when{kind=field-value}.value string or array of string
steps[].next{kind=branch}.cases[].when{kind=url}.kind "url" yes
steps[].next{kind=branch}.cases[].when{kind=url}.pathPattern string yes
steps[].next{kind=branch}.cases[].when{kind=segment}.kind "segment" yes
steps[].next{kind=branch}.cases[].when{kind=segment}.segmentId string yes min length 1
steps[].next{kind=branch}.cases[].when{kind=content-completed}.kind "content-completed" yes
steps[].next{kind=branch}.cases[].when{kind=content-completed}.contentId string yes min length 1
steps[].next{kind=branch}.cases[].when.kind all | any yes
steps[].next{kind=branch}.cases[].when.of array of object yes
steps[].next{kind=branch}.cases[].goTo string yes min length 1
steps[].next{kind=branch}.otherwise string min length 1
steps[].next{kind=go-to}.kind "go-to" yes
steps[].next{kind=go-to}.target string yes min length 1
steps[].next{kind=end}.kind "end" yes
steps[].waitForMs integer yes min 0
steps[].onMissing skip | end | show-unanchored | pause yes
steps[].tooltipWidth integer min 160, max 640
steps[].cutoutPadding integer min 0, max 64
steps[].cutoutRadius integer min 0, max 64
steps[].overlayClick none | dismiss | shake
keywords array of string
startStepId string yes
goal object yes
goal{kind=element-appears}.kind "element-appears" yes
goal{kind=element-appears}.locator Locator (see below) yes
goal{kind=url-matches}.kind "url-matches" yes
goal{kind=url-matches}.pathPattern string yes
goal{kind=last-step-completed}.kind "last-step-completed" yes
showProgress boolean yes
progressStyle counter | bullets | bar
allowSkip boolean yes

ContentItem: tipSet

Path Type Required Constraints
id string yes min length 1
appKey string yes
name string yes
description string
status draft | published | archived yes
version integer yes min 0
schemaVersion 2 yes
match object yes
match.pathPatterns array of string yes
match.form Locator (see below)
match.conditions array of object
match.conditions[]{kind=element-exists}.kind "element-exists" yes
match.conditions[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[]{kind=element-exists}.negate boolean
match.conditions[]{kind=element-text}.kind "element-text" yes
match.conditions[]{kind=element-text}.locator Locator (see below) yes
match.conditions[]{kind=element-text}.op equals | contains | matches yes
match.conditions[]{kind=element-text}.value string yes
match.conditions[]{kind=field-value}.kind "field-value" yes
match.conditions[]{kind=field-value}.locator Locator (see below) yes
match.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[]{kind=field-value}.value string or array of string
match.conditions[]{kind=url}.kind "url" yes
match.conditions[]{kind=url}.pathPattern string yes
match.conditions[]{kind=segment}.kind "segment" yes
match.conditions[]{kind=segment}.segmentId string yes min length 1
match.conditions[]{kind=content-completed}.kind "content-completed" yes
match.conditions[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].kind all | any yes
match.conditions[].of array of object yes
match.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
match.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-exists}.negate boolean
match.conditions[].of[]{kind=element-text}.kind "element-text" yes
match.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
match.conditions[].of[]{kind=element-text}.value string yes
match.conditions[].of[]{kind=field-value}.kind "field-value" yes
match.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
match.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[].of[]{kind=field-value}.value string or array of string
match.conditions[].of[]{kind=url}.kind "url" yes
match.conditions[].of[]{kind=url}.pathPattern string yes
match.conditions[].of[]{kind=segment}.kind "segment" yes
match.conditions[].of[]{kind=segment}.segmentId string yes min length 1
match.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
match.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].of[].kind all | any yes
match.conditions[].of[].of array of object yes
segments array of string yes
schedule object
schedule.from string
schedule.to string
tags array of string yes
locale string yes
translations map of map of string
restricted boolean
createdBy string yes
updatedBy string yes
createdAt string yes
updatedAt string yes
publishedAt string
kind "tipSet" yes
defaultTrigger icon | focus | hover yes
tips array of object yes
tips[].id string yes min length 1
tips[].anchor Locator (see below) yes
tips[].tipKind guidance | validation yes
tips[].trigger icon | focus | hover
tips[].iconPosition after-label | inside-end | after-field yes
tips[].hintPosition auto | below | above | after-end | before-start default auto
tips[].content object yes
tips[].content.title string
tips[].content.bodyMarkdown string yes
tips[].content.media object
tips[].content.media{kind=image}.kind "image" yes
tips[].content.media{kind=image}.asset object yes
tips[].content.media{kind=image}.asset.sha256 string yes pattern ^[0-9a-f]{64}$
tips[].content.media{kind=image}.asset.mime string yes
tips[].content.media{kind=image}.asset.bytes integer yes min 0
tips[].content.media{kind=image}.alt string yes
tips[].content.media{kind=video}.kind "video" yes
tips[].content.media{kind=video}.url string yes
tips[].content.media{kind=video}.provider stream | youtube | vimeo | mp4 yes
tips[].content.learnMore array of string
tips[].validation object
tips[].validation.rule object yes
tips[].validation.rule{kind=required}.kind "required" yes
tips[].validation.rule{kind=regex}.kind "regex" yes
tips[].validation.rule{kind=regex}.pattern string yes
tips[].validation.rule{kind=length}.kind "length" yes
tips[].validation.rule{kind=length}.min number
tips[].validation.rule{kind=length}.max number
tips[].validation.rule{kind=date-not-future}.kind "date-not-future" yes
tips[].validation.rule{kind=date-within-days}.kind "date-within-days" yes
tips[].validation.rule{kind=date-within-days}.days number yes
tips[].validation.message string yes
tips[].validation.severity info | warning yes
tips[].validation.hintPosition auto | below | above | after-end | before-start default auto
tips[].validation.extraRules array of object
tips[].validation.extraRules[].rule object yes
tips[].validation.extraRules[].rule{kind=required}.kind "required" yes
tips[].validation.extraRules[].rule{kind=regex}.kind "regex" yes
tips[].validation.extraRules[].rule{kind=regex}.pattern string yes
tips[].validation.extraRules[].rule{kind=length}.kind "length" yes
tips[].validation.extraRules[].rule{kind=length}.min number
tips[].validation.extraRules[].rule{kind=length}.max number
tips[].validation.extraRules[].rule{kind=date-not-future}.kind "date-not-future" yes
tips[].validation.extraRules[].rule{kind=date-within-days}.kind "date-within-days" yes
tips[].validation.extraRules[].rule{kind=date-within-days}.days number yes
tips[].validation.extraRules[].message string yes
tips[].validation.combine all | any

ContentItem: launcher

Path Type Required Constraints
id string yes min length 1
appKey string yes
name string yes
description string
status draft | published | archived yes
version integer yes min 0
schemaVersion 2 yes
match object yes
match.pathPatterns array of string yes
match.form Locator (see below)
match.conditions array of object
match.conditions[]{kind=element-exists}.kind "element-exists" yes
match.conditions[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[]{kind=element-exists}.negate boolean
match.conditions[]{kind=element-text}.kind "element-text" yes
match.conditions[]{kind=element-text}.locator Locator (see below) yes
match.conditions[]{kind=element-text}.op equals | contains | matches yes
match.conditions[]{kind=element-text}.value string yes
match.conditions[]{kind=field-value}.kind "field-value" yes
match.conditions[]{kind=field-value}.locator Locator (see below) yes
match.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[]{kind=field-value}.value string or array of string
match.conditions[]{kind=url}.kind "url" yes
match.conditions[]{kind=url}.pathPattern string yes
match.conditions[]{kind=segment}.kind "segment" yes
match.conditions[]{kind=segment}.segmentId string yes min length 1
match.conditions[]{kind=content-completed}.kind "content-completed" yes
match.conditions[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].kind all | any yes
match.conditions[].of array of object yes
match.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
match.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-exists}.negate boolean
match.conditions[].of[]{kind=element-text}.kind "element-text" yes
match.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
match.conditions[].of[]{kind=element-text}.value string yes
match.conditions[].of[]{kind=field-value}.kind "field-value" yes
match.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
match.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[].of[]{kind=field-value}.value string or array of string
match.conditions[].of[]{kind=url}.kind "url" yes
match.conditions[].of[]{kind=url}.pathPattern string yes
match.conditions[].of[]{kind=segment}.kind "segment" yes
match.conditions[].of[]{kind=segment}.segmentId string yes min length 1
match.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
match.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].of[].kind all | any yes
match.conditions[].of[].of array of object yes
segments array of string yes
schedule object
schedule.from string
schedule.to string
tags array of string yes
locale string yes
translations map of map of string
restricted boolean
createdBy string yes
updatedBy string yes
createdAt string yes
updatedAt string yes
publishedAt string
kind "launcher" yes
anchor Locator (see below) yes
style icon | button | link yes
icon help | info | play | document | new
label string
placement auto | top | bottom | left | right | top-start | top-end | bottom-start | bottom-end yes
offset object
offset.x number yes
offset.y number yes
tooltip string
action object yes
action{do=next}.do "next" yes
action{do=back}.do "back" yes
action{do=dismiss}.do "dismiss" yes
action{do=acknowledge}.do "acknowledge" yes
action{do=snooze}.do "snooze" yes
action{do=snooze}.minutes number yes
action{do=go-to-step}.do "go-to-step" yes
action{do=go-to-step}.stepId string yes min length 1
action{do=start-content}.do "start-content" yes
action{do=start-content}.contentId string yes min length 1
action{do=open-resource}.do "open-resource" yes
action{do=open-resource}.resourceId string yes min length 1
action{do=open-url}.do "open-url" yes
action{do=open-url}.url string yes
action{do=open-url}.openIn new-tab | same-tab | panel | modal yes
action{do=open-resource-center}.do "open-resource-center" yes
action{do=open-resource-center}.tab help | tasks | search

ContentItem: hotspot

Path Type Required Constraints
id string yes min length 1
appKey string yes
name string yes
description string
status draft | published | archived yes
version integer yes min 0
schemaVersion 2 yes
match object yes
match.pathPatterns array of string yes
match.form Locator (see below)
match.conditions array of object
match.conditions[]{kind=element-exists}.kind "element-exists" yes
match.conditions[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[]{kind=element-exists}.negate boolean
match.conditions[]{kind=element-text}.kind "element-text" yes
match.conditions[]{kind=element-text}.locator Locator (see below) yes
match.conditions[]{kind=element-text}.op equals | contains | matches yes
match.conditions[]{kind=element-text}.value string yes
match.conditions[]{kind=field-value}.kind "field-value" yes
match.conditions[]{kind=field-value}.locator Locator (see below) yes
match.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[]{kind=field-value}.value string or array of string
match.conditions[]{kind=url}.kind "url" yes
match.conditions[]{kind=url}.pathPattern string yes
match.conditions[]{kind=segment}.kind "segment" yes
match.conditions[]{kind=segment}.segmentId string yes min length 1
match.conditions[]{kind=content-completed}.kind "content-completed" yes
match.conditions[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].kind all | any yes
match.conditions[].of array of object yes
match.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
match.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-exists}.negate boolean
match.conditions[].of[]{kind=element-text}.kind "element-text" yes
match.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
match.conditions[].of[]{kind=element-text}.value string yes
match.conditions[].of[]{kind=field-value}.kind "field-value" yes
match.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
match.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[].of[]{kind=field-value}.value string or array of string
match.conditions[].of[]{kind=url}.kind "url" yes
match.conditions[].of[]{kind=url}.pathPattern string yes
match.conditions[].of[]{kind=segment}.kind "segment" yes
match.conditions[].of[]{kind=segment}.segmentId string yes min length 1
match.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
match.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].of[].kind all | any yes
match.conditions[].of[].of array of object yes
segments array of string yes
schedule object
schedule.from string
schedule.to string
tags array of string yes
locale string yes
translations map of map of string
restricted boolean
createdBy string yes
updatedBy string yes
createdAt string yes
updatedAt string yes
publishedAt string
kind "hotspot" yes
anchor Locator (see below) yes
placement auto | top | bottom | left | right | top-start | top-end | bottom-start | bottom-end yes
content object yes
content.title string
content.bodyMarkdown string yes
content.media object
content.media{kind=image}.kind "image" yes
content.media{kind=image}.asset object yes
content.media{kind=image}.asset.sha256 string yes pattern ^[0-9a-f]{64}$
content.media{kind=image}.asset.mime string yes
content.media{kind=image}.asset.bytes integer yes min 0
content.media{kind=image}.alt string yes
content.media{kind=video}.kind "video" yes
content.media{kind=video}.url string yes
content.media{kind=video}.provider stream | youtube | vimeo | mp4 yes
content.learnMore array of string
buttons array of object yes
buttons[].label string yes
buttons[].style primary | secondary | link yes
buttons[].action object yes
buttons[].action{do=next}.do "next" yes
buttons[].action{do=back}.do "back" yes
buttons[].action{do=dismiss}.do "dismiss" yes
buttons[].action{do=acknowledge}.do "acknowledge" yes
buttons[].action{do=snooze}.do "snooze" yes
buttons[].action{do=snooze}.minutes number yes
buttons[].action{do=go-to-step}.do "go-to-step" yes
buttons[].action{do=go-to-step}.stepId string yes min length 1
buttons[].action{do=start-content}.do "start-content" yes
buttons[].action{do=start-content}.contentId string yes min length 1
buttons[].action{do=open-resource}.do "open-resource" yes
buttons[].action{do=open-resource}.resourceId string yes min length 1
buttons[].action{do=open-url}.do "open-url" yes
buttons[].action{do=open-url}.url string yes
buttons[].action{do=open-url}.openIn new-tab | same-tab | panel | modal yes
buttons[].action{do=open-resource-center}.do "open-resource-center" yes
buttons[].action{do=open-resource-center}.tab help | tasks | search
frequency once | once-per-version | every-visit | until-completed | manual-only yes

ContentItem: announcement

Path Type Required Constraints
id string yes min length 1
appKey string yes
name string yes
description string
status draft | published | archived yes
version integer yes min 0
schemaVersion 2 yes
match object yes
match.pathPatterns array of string yes
match.form Locator (see below)
match.conditions array of object
match.conditions[]{kind=element-exists}.kind "element-exists" yes
match.conditions[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[]{kind=element-exists}.negate boolean
match.conditions[]{kind=element-text}.kind "element-text" yes
match.conditions[]{kind=element-text}.locator Locator (see below) yes
match.conditions[]{kind=element-text}.op equals | contains | matches yes
match.conditions[]{kind=element-text}.value string yes
match.conditions[]{kind=field-value}.kind "field-value" yes
match.conditions[]{kind=field-value}.locator Locator (see below) yes
match.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[]{kind=field-value}.value string or array of string
match.conditions[]{kind=url}.kind "url" yes
match.conditions[]{kind=url}.pathPattern string yes
match.conditions[]{kind=segment}.kind "segment" yes
match.conditions[]{kind=segment}.segmentId string yes min length 1
match.conditions[]{kind=content-completed}.kind "content-completed" yes
match.conditions[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].kind all | any yes
match.conditions[].of array of object yes
match.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
match.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-exists}.negate boolean
match.conditions[].of[]{kind=element-text}.kind "element-text" yes
match.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
match.conditions[].of[]{kind=element-text}.value string yes
match.conditions[].of[]{kind=field-value}.kind "field-value" yes
match.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
match.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[].of[]{kind=field-value}.value string or array of string
match.conditions[].of[]{kind=url}.kind "url" yes
match.conditions[].of[]{kind=url}.pathPattern string yes
match.conditions[].of[]{kind=segment}.kind "segment" yes
match.conditions[].of[]{kind=segment}.segmentId string yes min length 1
match.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
match.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].of[].kind all | any yes
match.conditions[].of[].of array of object yes
segments array of string yes
schedule object
schedule.from string
schedule.to string
tags array of string yes
locale string yes
translations map of map of string
restricted boolean
createdBy string yes
updatedBy string yes
createdAt string yes
updatedAt string yes
publishedAt string
kind "announcement" yes
display modal | banner-top | banner-bottom | toast | slideout yes
content object yes
content.title string
content.bodyMarkdown string yes
content.media object
content.media{kind=image}.kind "image" yes
content.media{kind=image}.asset object yes
content.media{kind=image}.asset.sha256 string yes pattern ^[0-9a-f]{64}$
content.media{kind=image}.asset.mime string yes
content.media{kind=image}.asset.bytes integer yes min 0
content.media{kind=image}.alt string yes
content.media{kind=video}.kind "video" yes
content.media{kind=video}.url string yes
content.media{kind=video}.provider stream | youtube | vimeo | mp4 yes
content.learnMore array of string
buttons array of object yes
buttons[].label string yes
buttons[].style primary | secondary | link yes
buttons[].action object yes
buttons[].action{do=next}.do "next" yes
buttons[].action{do=back}.do "back" yes
buttons[].action{do=dismiss}.do "dismiss" yes
buttons[].action{do=acknowledge}.do "acknowledge" yes
buttons[].action{do=snooze}.do "snooze" yes
buttons[].action{do=snooze}.minutes number yes
buttons[].action{do=go-to-step}.do "go-to-step" yes
buttons[].action{do=go-to-step}.stepId string yes min length 1
buttons[].action{do=start-content}.do "start-content" yes
buttons[].action{do=start-content}.contentId string yes min length 1
buttons[].action{do=open-resource}.do "open-resource" yes
buttons[].action{do=open-resource}.resourceId string yes min length 1
buttons[].action{do=open-url}.do "open-url" yes
buttons[].action{do=open-url}.url string yes
buttons[].action{do=open-url}.openIn new-tab | same-tab | panel | modal yes
buttons[].action{do=open-resource-center}.do "open-resource-center" yes
buttons[].action{do=open-resource-center}.tab help | tasks | search
trigger object yes
trigger{type=page-load}.type "page-load" yes
trigger{type=page-load}.delayMs integer min 0
trigger{type=element-visible}.type "element-visible" yes
trigger{type=element-visible}.locator Locator (see below) yes
trigger{type=element-click}.type "element-click" yes
trigger{type=element-click}.locator Locator (see below) yes
trigger{type=launcher}.type "launcher" yes
trigger{type=resource-center}.type "resource-center" yes
trigger{type=url-param}.type "url-param" yes
trigger{type=url-param}.name string yes
trigger{type=url-param}.value string
trigger{type=idle}.type "idle" yes
trigger{type=idle}.seconds number yes
trigger{type=manual}.type "manual" yes
frequency once | once-per-version | every-visit | until-completed | manual-only yes
dismissible boolean yes
requireAcknowledge boolean
size sm | md | lg
side right | left
inline boolean

ContentItem: resource

Path Type Required Constraints
id string yes min length 1
appKey string yes
name string yes
description string
status draft | published | archived yes
version integer yes min 0
schemaVersion 2 yes
match object yes
match.pathPatterns array of string yes
match.form Locator (see below)
match.conditions array of object
match.conditions[]{kind=element-exists}.kind "element-exists" yes
match.conditions[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[]{kind=element-exists}.negate boolean
match.conditions[]{kind=element-text}.kind "element-text" yes
match.conditions[]{kind=element-text}.locator Locator (see below) yes
match.conditions[]{kind=element-text}.op equals | contains | matches yes
match.conditions[]{kind=element-text}.value string yes
match.conditions[]{kind=field-value}.kind "field-value" yes
match.conditions[]{kind=field-value}.locator Locator (see below) yes
match.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[]{kind=field-value}.value string or array of string
match.conditions[]{kind=url}.kind "url" yes
match.conditions[]{kind=url}.pathPattern string yes
match.conditions[]{kind=segment}.kind "segment" yes
match.conditions[]{kind=segment}.segmentId string yes min length 1
match.conditions[]{kind=content-completed}.kind "content-completed" yes
match.conditions[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].kind all | any yes
match.conditions[].of array of object yes
match.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
match.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-exists}.negate boolean
match.conditions[].of[]{kind=element-text}.kind "element-text" yes
match.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
match.conditions[].of[]{kind=element-text}.value string yes
match.conditions[].of[]{kind=field-value}.kind "field-value" yes
match.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
match.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[].of[]{kind=field-value}.value string or array of string
match.conditions[].of[]{kind=url}.kind "url" yes
match.conditions[].of[]{kind=url}.pathPattern string yes
match.conditions[].of[]{kind=segment}.kind "segment" yes
match.conditions[].of[]{kind=segment}.segmentId string yes min length 1
match.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
match.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].of[].kind all | any yes
match.conditions[].of[].of array of object yes
segments array of string yes
schedule object
schedule.from string
schedule.to string
tags array of string yes
locale string yes
translations map of map of string
restricted boolean
createdBy string yes
updatedBy string yes
createdAt string yes
updatedAt string yes
publishedAt string
kind "resource" yes
resourceType document | link | video | faq | contact yes
url string
asset object
asset.sha256 string yes pattern ^[0-9a-f]{64}$
asset.mime string yes
asset.bytes integer yes min 0
openIn new-tab | same-tab | panel | modal yes
summary string
keywords array of string yes

ContentItem: checklist

Path Type Required Constraints
id string yes min length 1
appKey string yes
name string yes
description string
status draft | published | archived yes
version integer yes min 0
schemaVersion 2 yes
match object yes
match.pathPatterns array of string yes
match.form Locator (see below)
match.conditions array of object
match.conditions[]{kind=element-exists}.kind "element-exists" yes
match.conditions[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[]{kind=element-exists}.negate boolean
match.conditions[]{kind=element-text}.kind "element-text" yes
match.conditions[]{kind=element-text}.locator Locator (see below) yes
match.conditions[]{kind=element-text}.op equals | contains | matches yes
match.conditions[]{kind=element-text}.value string yes
match.conditions[]{kind=field-value}.kind "field-value" yes
match.conditions[]{kind=field-value}.locator Locator (see below) yes
match.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[]{kind=field-value}.value string or array of string
match.conditions[]{kind=url}.kind "url" yes
match.conditions[]{kind=url}.pathPattern string yes
match.conditions[]{kind=segment}.kind "segment" yes
match.conditions[]{kind=segment}.segmentId string yes min length 1
match.conditions[]{kind=content-completed}.kind "content-completed" yes
match.conditions[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].kind all | any yes
match.conditions[].of array of object yes
match.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
match.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-exists}.negate boolean
match.conditions[].of[]{kind=element-text}.kind "element-text" yes
match.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
match.conditions[].of[]{kind=element-text}.value string yes
match.conditions[].of[]{kind=field-value}.kind "field-value" yes
match.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
match.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[].of[]{kind=field-value}.value string or array of string
match.conditions[].of[]{kind=url}.kind "url" yes
match.conditions[].of[]{kind=url}.pathPattern string yes
match.conditions[].of[]{kind=segment}.kind "segment" yes
match.conditions[].of[]{kind=segment}.segmentId string yes min length 1
match.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
match.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].of[].kind all | any yes
match.conditions[].of[].of array of object yes
segments array of string yes
schedule object
schedule.from string
schedule.to string
tags array of string yes
locale string yes
translations map of map of string
restricted boolean
createdBy string yes
updatedBy string yes
createdAt string yes
updatedAt string yes
publishedAt string
kind "checklist" yes
title string yes
items array of object yes
items[].id string yes min length 1
items[].label string yes
items[].description string
items[].contentId string min length 1
items[].completedWhen object yes
items[].completedWhen{kind=element-appears}.kind "element-appears" yes
items[].completedWhen{kind=element-appears}.locator Locator (see below) yes
items[].completedWhen{kind=url-matches}.kind "url-matches" yes
items[].completedWhen{kind=url-matches}.pathPattern string yes
items[].completedWhen{kind=last-step-completed}.kind "last-step-completed" yes
items[].completedWhen{kind=element-clicked}.kind "element-clicked" yes
items[].completedWhen{kind=element-clicked}.locator Locator (see below) yes
items[].completedWhen{kind=field-filled}.kind "field-filled" yes
items[].completedWhen{kind=field-filled}.locator Locator (see below) yes
items[].completedWhen{kind=content-completed}.kind "content-completed" yes
items[].completedWhen{kind=content-completed}.contentId string yes min length 1
items[].completedWhen{kind=manual}.kind "manual" yes
display resource-center | launcher
hideCompleted boolean
resetOnPublish boolean

ContentItem: resourceCenter

Path Type Required Constraints
id string yes min length 1
appKey string yes
name string yes
description string
status draft | published | archived yes
version integer yes min 0
schemaVersion 2 yes
match object yes
match.pathPatterns array of string yes
match.form Locator (see below)
match.conditions array of object
match.conditions[]{kind=element-exists}.kind "element-exists" yes
match.conditions[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[]{kind=element-exists}.negate boolean
match.conditions[]{kind=element-text}.kind "element-text" yes
match.conditions[]{kind=element-text}.locator Locator (see below) yes
match.conditions[]{kind=element-text}.op equals | contains | matches yes
match.conditions[]{kind=element-text}.value string yes
match.conditions[]{kind=field-value}.kind "field-value" yes
match.conditions[]{kind=field-value}.locator Locator (see below) yes
match.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[]{kind=field-value}.value string or array of string
match.conditions[]{kind=url}.kind "url" yes
match.conditions[]{kind=url}.pathPattern string yes
match.conditions[]{kind=segment}.kind "segment" yes
match.conditions[]{kind=segment}.segmentId string yes min length 1
match.conditions[]{kind=content-completed}.kind "content-completed" yes
match.conditions[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].kind all | any yes
match.conditions[].of array of object yes
match.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
match.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-exists}.negate boolean
match.conditions[].of[]{kind=element-text}.kind "element-text" yes
match.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
match.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
match.conditions[].of[]{kind=element-text}.value string yes
match.conditions[].of[]{kind=field-value}.kind "field-value" yes
match.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
match.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
match.conditions[].of[]{kind=field-value}.value string or array of string
match.conditions[].of[]{kind=url}.kind "url" yes
match.conditions[].of[]{kind=url}.pathPattern string yes
match.conditions[].of[]{kind=segment}.kind "segment" yes
match.conditions[].of[]{kind=segment}.segmentId string yes min length 1
match.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
match.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
match.conditions[].of[].kind all | any yes
match.conditions[].of[].of array of object yes
segments array of string yes
schedule object
schedule.from string
schedule.to string
tags array of string yes
locale string yes
translations map of map of string
restricted boolean
createdBy string yes
updatedBy string yes
createdAt string yes
updatedAt string yes
publishedAt string
kind "resourceCenter" yes
title string yes
tabs array of object yes
tabs[].id help | tasks | search yes
tabs[].label string yes
tabs[].enabled boolean yes
sections array of object yes
sections[].id string yes min length 1
sections[].title string yes
sections[].items array of string yes
sections[].showWhen object
sections[].showWhen.pathPatterns array of string yes
sections[].showWhen.form Locator (see below)
sections[].showWhen.conditions array of object
sections[].showWhen.conditions[]{kind=element-exists}.kind "element-exists" yes
sections[].showWhen.conditions[]{kind=element-exists}.locator Locator (see below) yes
sections[].showWhen.conditions[]{kind=element-exists}.negate boolean
sections[].showWhen.conditions[]{kind=element-text}.kind "element-text" yes
sections[].showWhen.conditions[]{kind=element-text}.locator Locator (see below) yes
sections[].showWhen.conditions[]{kind=element-text}.op equals | contains | matches yes
sections[].showWhen.conditions[]{kind=element-text}.value string yes
sections[].showWhen.conditions[]{kind=field-value}.kind "field-value" yes
sections[].showWhen.conditions[]{kind=field-value}.locator Locator (see below) yes
sections[].showWhen.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
sections[].showWhen.conditions[]{kind=field-value}.value string or array of string
sections[].showWhen.conditions[]{kind=url}.kind "url" yes
sections[].showWhen.conditions[]{kind=url}.pathPattern string yes
sections[].showWhen.conditions[]{kind=segment}.kind "segment" yes
sections[].showWhen.conditions[]{kind=segment}.segmentId string yes min length 1
sections[].showWhen.conditions[]{kind=content-completed}.kind "content-completed" yes
sections[].showWhen.conditions[]{kind=content-completed}.contentId string yes min length 1
sections[].showWhen.conditions[].kind all | any yes
sections[].showWhen.conditions[].of array of object yes
sections[].showWhen.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
sections[].showWhen.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
sections[].showWhen.conditions[].of[]{kind=element-exists}.negate boolean
sections[].showWhen.conditions[].of[]{kind=element-text}.kind "element-text" yes
sections[].showWhen.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
sections[].showWhen.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
sections[].showWhen.conditions[].of[]{kind=element-text}.value string yes
sections[].showWhen.conditions[].of[]{kind=field-value}.kind "field-value" yes
sections[].showWhen.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
sections[].showWhen.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
sections[].showWhen.conditions[].of[]{kind=field-value}.value string or array of string
sections[].showWhen.conditions[].of[]{kind=url}.kind "url" yes
sections[].showWhen.conditions[].of[]{kind=url}.pathPattern string yes
sections[].showWhen.conditions[].of[]{kind=segment}.kind "segment" yes
sections[].showWhen.conditions[].of[]{kind=segment}.segmentId string yes min length 1
sections[].showWhen.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
sections[].showWhen.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
sections[].showWhen.conditions[].of[].kind all | any yes
sections[].showWhen.conditions[].of[].of array of object yes
sections[].tab help | search
tasks object
tasks.checklistIds array of string yes
tasks.showWhen object
tasks.showWhen.pathPatterns array of string yes
tasks.showWhen.form Locator (see below)
tasks.showWhen.conditions array of object
tasks.showWhen.conditions[]{kind=element-exists}.kind "element-exists" yes
tasks.showWhen.conditions[]{kind=element-exists}.locator Locator (see below) yes
tasks.showWhen.conditions[]{kind=element-exists}.negate boolean
tasks.showWhen.conditions[]{kind=element-text}.kind "element-text" yes
tasks.showWhen.conditions[]{kind=element-text}.locator Locator (see below) yes
tasks.showWhen.conditions[]{kind=element-text}.op equals | contains | matches yes
tasks.showWhen.conditions[]{kind=element-text}.value string yes
tasks.showWhen.conditions[]{kind=field-value}.kind "field-value" yes
tasks.showWhen.conditions[]{kind=field-value}.locator Locator (see below) yes
tasks.showWhen.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
tasks.showWhen.conditions[]{kind=field-value}.value string or array of string
tasks.showWhen.conditions[]{kind=url}.kind "url" yes
tasks.showWhen.conditions[]{kind=url}.pathPattern string yes
tasks.showWhen.conditions[]{kind=segment}.kind "segment" yes
tasks.showWhen.conditions[]{kind=segment}.segmentId string yes min length 1
tasks.showWhen.conditions[]{kind=content-completed}.kind "content-completed" yes
tasks.showWhen.conditions[]{kind=content-completed}.contentId string yes min length 1
tasks.showWhen.conditions[].kind all | any yes
tasks.showWhen.conditions[].of array of object yes
tasks.showWhen.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
tasks.showWhen.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
tasks.showWhen.conditions[].of[]{kind=element-exists}.negate boolean
tasks.showWhen.conditions[].of[]{kind=element-text}.kind "element-text" yes
tasks.showWhen.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
tasks.showWhen.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
tasks.showWhen.conditions[].of[]{kind=element-text}.value string yes
tasks.showWhen.conditions[].of[]{kind=field-value}.kind "field-value" yes
tasks.showWhen.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
tasks.showWhen.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
tasks.showWhen.conditions[].of[]{kind=field-value}.value string or array of string
tasks.showWhen.conditions[].of[]{kind=url}.kind "url" yes
tasks.showWhen.conditions[].of[]{kind=url}.pathPattern string yes
tasks.showWhen.conditions[].of[]{kind=segment}.kind "segment" yes
tasks.showWhen.conditions[].of[]{kind=segment}.segmentId string yes min length 1
tasks.showWhen.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
tasks.showWhen.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
tasks.showWhen.conditions[].of[].kind all | any yes
tasks.showWhen.conditions[].of[].of array of object yes
tasks.badge boolean
autoSuggest boolean yes
search object
search.synonyms array of array of string
search.exclude array of string
search.popular array of string
search.noResults object
search.noResults.text string yes
search.noResults.url string

App

Per-application settings: environments, test id attributes, theme, help bubble, CSS variables.

Path Type Required Constraints
appKey string yes
name string yes
environments array of object yes
environments[].name string yes
environments[].origins array of string yes
testIdAttributes array of string yes
themeOverride object
themeOverride.fontFamily string
themeOverride.fontSize string
themeOverride.textColor string
themeOverride.mutedColor string
themeOverride.surfaceColor string
themeOverride.borderColor string
themeOverride.primaryColor string
themeOverride.onPrimaryColor string
themeOverride.warningColor string
themeOverride.successColor string
themeOverride.radius string
themeOverride.shadow string
themeOverride.colorScheme light | dark
textCapture boolean yes
helpBubble object yes
helpBubble.enabled boolean yes
helpBubble.position bottom-right | bottom-left | top-right | top-left yes
helpBubble.offset object
helpBubble.offset.x number
helpBubble.offset.y number
conditionSourceFields array of Locator (see below) yes
cssVars map of string
maxAnnouncements integer min 1

Locator

How a step finds its element: frame hops, shadow path, strategies and a fingerprint.

Path Type Required Constraints
version 1 yes
frame array of object yes
frame[].selector string yes
frame[].src string
shadowPath array of string yes
strategies array of object yes
strategies[]{kind=testid}.kind "testid" yes
strategies[]{kind=testid}.attr string yes
strategies[]{kind=testid}.value string yes
strategies[]{kind=id}.kind "id" yes
strategies[]{kind=id}.value string yes
strategies[]{kind=aria}.kind "aria" yes
strategies[]{kind=aria}.role string yes
strategies[]{kind=aria}.name string yes
strategies[]{kind=label}.kind "label" yes
strategies[]{kind=label}.text string yes
strategies[]{kind=text}.kind "text" yes
strategies[]{kind=text}.tag string yes
strategies[]{kind=text}.text string yes
strategies[]{kind=text}.exact boolean yes
strategies[]{kind=css}.kind "css" yes
strategies[]{kind=css}.selector string yes
strategies[]{kind=xpath}.kind "xpath" yes
strategies[]{kind=xpath}.expr string yes
fingerprint object yes
fingerprint.tag string yes
fingerprint.role string
fingerprint.text string max length 80
fingerprint.attrs map of string yes
fingerprint.ancestorTexts array of string yes max items 3
fingerprint.siblingIndex integer yes min 0
fingerprint.rect object yes
fingerprint.rect.x number yes
fingerprint.rect.y number yes
fingerprint.rect.w number yes
fingerprint.rect.h number yes
fingerprint.rect.vw number yes
fingerprint.rect.vh number yes

Manifest

What the content script gate reads to decide whether to inject the player.

Path Type Required Constraints
appKey string yes
env string yes
generatedAt string yes
disabled boolean yes
items array of object yes
items[].id string yes min length 1
items[].version integer yes
items[].kind process | walkthrough | tipSet | launcher | hotspot | announcement | resource | checklist | resourceCenter yes
items[].match object yes
items[].match.pathPatterns array of string yes
items[].match.form Locator (see below)
items[].match.conditions array of object
items[].match.conditions[]{kind=element-exists}.kind "element-exists" yes
items[].match.conditions[]{kind=element-exists}.locator Locator (see below) yes
items[].match.conditions[]{kind=element-exists}.negate boolean
items[].match.conditions[]{kind=element-text}.kind "element-text" yes
items[].match.conditions[]{kind=element-text}.locator Locator (see below) yes
items[].match.conditions[]{kind=element-text}.op equals | contains | matches yes
items[].match.conditions[]{kind=element-text}.value string yes
items[].match.conditions[]{kind=field-value}.kind "field-value" yes
items[].match.conditions[]{kind=field-value}.locator Locator (see below) yes
items[].match.conditions[]{kind=field-value}.op equals | in | empty | not-empty yes
items[].match.conditions[]{kind=field-value}.value string or array of string
items[].match.conditions[]{kind=url}.kind "url" yes
items[].match.conditions[]{kind=url}.pathPattern string yes
items[].match.conditions[]{kind=segment}.kind "segment" yes
items[].match.conditions[]{kind=segment}.segmentId string yes min length 1
items[].match.conditions[]{kind=content-completed}.kind "content-completed" yes
items[].match.conditions[]{kind=content-completed}.contentId string yes min length 1
items[].match.conditions[].kind all | any yes
items[].match.conditions[].of array of object yes
items[].match.conditions[].of[]{kind=element-exists}.kind "element-exists" yes
items[].match.conditions[].of[]{kind=element-exists}.locator Locator (see below) yes
items[].match.conditions[].of[]{kind=element-exists}.negate boolean
items[].match.conditions[].of[]{kind=element-text}.kind "element-text" yes
items[].match.conditions[].of[]{kind=element-text}.locator Locator (see below) yes
items[].match.conditions[].of[]{kind=element-text}.op equals | contains | matches yes
items[].match.conditions[].of[]{kind=element-text}.value string yes
items[].match.conditions[].of[]{kind=field-value}.kind "field-value" yes
items[].match.conditions[].of[]{kind=field-value}.locator Locator (see below) yes
items[].match.conditions[].of[]{kind=field-value}.op equals | in | empty | not-empty yes
items[].match.conditions[].of[]{kind=field-value}.value string or array of string
items[].match.conditions[].of[]{kind=url}.kind "url" yes
items[].match.conditions[].of[]{kind=url}.pathPattern string yes
items[].match.conditions[].of[]{kind=segment}.kind "segment" yes
items[].match.conditions[].of[]{kind=segment}.segmentId string yes min length 1
items[].match.conditions[].of[]{kind=content-completed}.kind "content-completed" yes
items[].match.conditions[].of[]{kind=content-completed}.contentId string yes min length 1
items[].match.conditions[].of[].kind all | any yes
items[].match.conditions[].of[].of array of object yes
items[].segments array of string yes
items[].trigger object
items[].trigger{type=page-load}.type "page-load" yes
items[].trigger{type=page-load}.delayMs integer min 0
items[].trigger{type=element-visible}.type "element-visible" yes
items[].trigger{type=element-visible}.locator Locator (see below) yes
items[].trigger{type=element-click}.type "element-click" yes
items[].trigger{type=element-click}.locator Locator (see below) yes
items[].trigger{type=launcher}.type "launcher" yes
items[].trigger{type=resource-center}.type "resource-center" yes
items[].trigger{type=url-param}.type "url-param" yes
items[].trigger{type=url-param}.name string yes
items[].trigger{type=url-param}.value string
items[].trigger{type=idle}.type "idle" yes
items[].trigger{type=idle}.seconds number yes
items[].trigger{type=manual}.type "manual" yes
items[].frequency once | once-per-version | every-visit | until-completed | manual-only
items[].restricted boolean
items[].disabled boolean
items[].schedule object
items[].schedule.from string
items[].schedule.to string

Progress

Per-user state for one item.

Path Type Required Constraints
userId string yes
contentId string yes min length 1
version integer yes
state active | paused | completed | dismissed | abandoned | snoozed yes
stageId string min length 1
stepId string min length 1
path array of string yes
snoozedUntil string
updatedAt string yes

GuidanceEvent

An analytics event. The service worker discards these today.

Path Type Required Constraints
contentId string yes min length 1
version integer yes
kind process | walkthrough | tipSet | launcher | hotspot | announcement | resource | checklist | resourceCenter yes
event shown | advanced | back | dismissed | snoozed | completed | goal-reached | abandoned | stage-entered | stage-skipped | anchor-missing | anchor-resolved-by | tip-opened | validation-shown | ... yes
stageId string min length 1
stepId string min length 1
strategyKind string
durationMs number
appKey string yes
env string yes
pathTemplate string yes
at string yes

Segment

Audience segment. Stored, not evaluated in the MVP (decision 10).

Path Type Required Constraints
id string yes min length 1
name string yes
entraGroupIds array of string
roles array of string
locales array of string

Bundle

The bundle.json inside a .guidepost.zip. Items are not expanded here; see ContentItem.

Path Type Required Constraints
schemaVersion 2 yes
exportedAt string yes
sourceMode local | remote yes
apps array of object yes
segments array of object yes
items array of object yes