Files
zeekay 1b367e2b62 chore: rebase the tree onto upstream master
The tree was a debranded snapshot of upstream taken around 2026-02-20, and
upstream has moved about five months since. This replaces it with upstream
master, mechanically re-derived: bin/debrand does the rename, and the
pipeline and squashed migrations are restored from the shipped tree.

Not a merge. The previous import replaced the tree wholesale in a single
commit, so there is no shared content history to merge against. Reproducing
the rename on the new tree is what actually converges.

What survives: .hanzo/workflows, the Dockerfiles and bin/docker* entrypoints,
compose files, LLM.md, and insights/migrations. The squashed initial
migration is load-bearing — the live database records it by name, so
upstream's ~918 individual migrations cannot come back.

Nine products are dropped as unreferenced. Twenty-one more that we do not run
are kept anyway because the core app still imports them; unpicking those is a
refactor and does not belong in a rebase.

This base does not build yet, and the reasons are not in the rename:
upstream now wants Python 3.13.13 against our 3.12.12 and Django 5.2 against
our 4.2, and the dependency manifests still name upstream packages that we
republish under our own names. Those are decisions, not renames.
2026-08-01 15:44:40 -07:00

1670 lines
121 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"aggregation_group_type_index": {
"anyOf": [
{
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
{
"type": "null"
}
],
"description": "Groups aggregation"
},
"dateRange": {
"anyOf": [
{
"properties": {
"date_from": {
"description": "ISO8601 date string.",
"type": "string"
},
"date_to": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "ISO8601 date string."
}
},
"required": ["date_from"],
"type": "object"
},
{
"properties": {
"date_from": {
"description": "Duration in the past. Supported units are: `h` (hour), `d` (day), `w` (week), `m` (month), `y` (year), `all` (all time). Use the `Start` suffix to define the exact left date boundary. Examples: `-1d` last day from now, `-180d` last 180 days from now, `mStart` this month start, `-1dStart` yesterday's start.",
"type": "string"
}
},
"required": ["date_from"],
"type": "object"
}
],
"description": "Date range for the query"
},
"filterTestAccounts": {
"description": "Exclude internal and test users by applying the respective filters. When omitted, follows the project's \"Filter out internal and test users\" default setting.",
"type": "boolean"
},
"interval": {
"default": "day",
"description": "Granularity of the response. Can be one of `hour`, `day`, `week` or `month`",
"enum": ["second", "minute", "hour", "day", "week", "month", "quarter", "year"],
"type": "string"
},
"kind": {
"const": "LifecycleQuery",
"default": "LifecycleQuery",
"type": "string"
},
"lifecycleFilter": {
"description": "Properties specific to the lifecycle insight",
"properties": {
"showLegend": {
"default": false,
"description": "Whether to show the legend describing series.",
"type": "boolean"
},
"showValuesOnSeries": {
"default": false,
"description": "Whether to show a value on each data point.",
"type": "boolean"
},
"stacked": {
"default": true,
"description": "Whether the lifecycle bars should be stacked.",
"type": "boolean"
},
"toggledLifecycles": {
"description": "Lifecycles that have been removed from display are not included in this array. Available values: `new`, `returning`, `resurrecting`, `dormant`.\n- `new` - users who performed the event for the first time during the period.\n- `returning` - users who were active in the previous period and are active in the current period.\n- `resurrecting` - users who were inactive for one or more periods and became active again.\n- `dormant` - users who were active in the previous period but are inactive in the current period.",
"items": {
"enum": ["new", "resurrecting", "returning", "dormant"],
"type": "string"
},
"type": "array"
}
},
"type": "object"
},
"output_format": {
"default": "optimized",
"description": "Output format. \"optimized\" returns a human-readable summary from server-side formatters (recommended for analysis). \"json\" returns the raw query results as JSON.",
"enum": ["optimized", "json"],
"type": "string"
},
"properties": {
"default": [],
"description": "Property filters for all series",
"items": {
"anyOf": [
{
"anyOf": [
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`icontains` - case insensitive contains. `not_icontains` - case insensitive does not contain. `regex` - matches the regex pattern. `not_regex` - does not match the regex pattern.",
"enum": ["exact", "is_not", "icontains", "not_icontains", "regex", "not_regex"],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
},
"value": {
"description": "Only use property values from the plan. If the operator is `regex` or `not_regex`, the value must be a valid Datastore regex pattern to match against. Otherwise, the value must be a substring that will be matched against the property value. Use the string values `true` or `false` for boolean properties.",
"type": "string"
}
},
"required": ["key", "operator", "type", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"enum": ["exact", "gt", "lt"],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
},
"value": {
"type": "number"
}
},
"required": ["key", "operator", "type", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`exact` - exact match of any of the values. `is_not` - does not match any of the values.",
"enum": ["exact", "is_not"],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
},
"value": {
"description": "Only use property values from the plan. Always use strings as values. If you have a number, convert it to a string first. If you have a boolean, convert it to a string \"true\" or \"false\".",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": ["key", "operator", "type", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"enum": ["is_date_exact", "is_date_before", "is_date_after"],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
},
"value": {
"description": "Value must be a date in ISO 8601 format.",
"type": "string"
}
},
"required": ["key", "operator", "type", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`is_set` - the property has any value. `is_not_set` - the property doesn't have a value or wasn't collected.",
"enum": ["is_set", "is_not_set"],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
}
},
"required": ["key", "operator", "type"],
"type": "object"
}
]
},
{
"anyOf": [
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`icontains` - case insensitive contains. `not_icontains` - case insensitive does not contain. `regex` - matches the regex pattern. `not_regex` - does not match the regex pattern.",
"enum": ["exact", "is_not", "icontains", "not_icontains", "regex", "not_regex"],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
},
"value": {
"description": "Only use property values from the plan. If the operator is `regex` or `not_regex`, the value must be a valid Datastore regex pattern to match against. Otherwise, the value must be a substring that will be matched against the property value. Use the string values `true` or `false` for boolean properties.",
"type": "string"
}
},
"required": ["group_type_index", "key", "operator", "value"],
"type": "object"
},
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"enum": ["exact", "gt", "lt"],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
},
"value": {
"type": "number"
}
},
"required": ["group_type_index", "key", "operator", "value"],
"type": "object"
},
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`exact` - exact match of any of the values. `is_not` - does not match any of the values.",
"enum": ["exact", "is_not"],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
},
"value": {
"description": "Only use property values from the plan. Always use strings as values. If you have a number, convert it to a string first. If you have a boolean, convert it to a string \"true\" or \"false\".",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": ["group_type_index", "key", "operator", "value"],
"type": "object"
},
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"enum": ["is_date_exact", "is_date_before", "is_date_after"],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
},
"value": {
"description": "Value must be a date in ISO 8601 format.",
"type": "string"
}
},
"required": ["group_type_index", "key", "operator", "value"],
"type": "object"
},
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`is_set` - the property has any value. `is_not_set` - the property doesn't have a value or wasn't collected.",
"enum": ["is_set", "is_not_set"],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
}
},
"required": ["group_type_index", "key", "operator"],
"type": "object"
}
]
},
{
"properties": {
"key": {
"const": "id",
"default": "id",
"type": "string"
},
"operator": {
"default": "in",
"enum": ["in", "not_in"],
"type": "string"
},
"type": {
"const": "cohort",
"default": "cohort",
"description": "Filter events by cohort membership. Use this to narrow down results to persons belonging to a specific cohort. Use `operator: \"in\"` to include cohort members, or `operator: \"not_in\"` to exclude them. Examples:\n- Include: `{ type: \"cohort\", key: \"id\", value: 42, operator: \"in\" }`\n- Exclude: `{ type: \"cohort\", key: \"id\", value: 42, operator: \"not_in\" }`",
"type": "string"
},
"value": {
"description": "The cohort ID to filter by.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"required": ["value"],
"type": "object"
},
{
"anyOf": [
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"description": "`icontains` - case insensitive contains. `not_icontains` - case insensitive does not contain. `regex` - matches the regex pattern. `not_regex` - does not match the regex pattern.",
"enum": ["exact", "is_not", "icontains", "not_icontains", "regex", "not_regex"],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
},
"value": {
"description": "Only use property values from the plan. If the operator is `regex` or `not_regex`, the value must be a valid Datastore regex pattern to match against. Otherwise, the value must be a substring that will be matched against the property value. Use the string values `true` or `false` for boolean properties.",
"type": "string"
}
},
"required": ["key", "operator", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"enum": ["exact", "gt", "lt"],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
},
"value": {
"type": "number"
}
},
"required": ["key", "operator", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"description": "`exact` - exact match of any of the values. `is_not` - does not match any of the values.",
"enum": ["exact", "is_not"],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
},
"value": {
"description": "Only use property values from the plan. Always use strings as values. If you have a number, convert it to a string first. If you have a boolean, convert it to a string \"true\" or \"false\".",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": ["key", "operator", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"enum": ["is_date_exact", "is_date_before", "is_date_after"],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
},
"value": {
"description": "Value must be a date in ISO 8601 format.",
"type": "string"
}
},
"required": ["key", "operator", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"description": "`is_set` - the property has any value. `is_not_set` - the property doesn't have a value or wasn't collected.",
"enum": ["is_set", "is_not_set"],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
}
},
"required": ["key", "operator"],
"type": "object"
}
]
},
{
"properties": {
"key": {
"description": "A InsightsQL boolean expression used as a filter condition.\n\nExamples:\n- Filter where a property exceeds a threshold: `toFloat(properties.load_time) > 5.0`\n- Filter with string matching: `properties.$current_url LIKE '%/pricing%'`\n- Filter with multiple conditions: `properties.$browser = 'Chrome' AND toFloat(properties.duration) > 30`",
"type": "string"
},
"type": {
"const": "insightsql",
"default": "insightsql",
"description": "Filter by a InsightsQL boolean expression for advanced filtering that can't be expressed with standard property filters.",
"type": "string"
}
},
"required": ["key"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The feature flag key.",
"type": "string"
},
"operator": {
"const": "flag_evaluates_to",
"default": "flag_evaluates_to",
"type": "string"
},
"type": {
"const": "flag",
"default": "flag",
"description": "Filter events by feature flag state — only include events where a specific flag evaluated to a given value. Examples:\n- Flag enabled: `{ type: \"flag\", key: \"new-onboarding\", operator: \"flag_evaluates_to\", value: true }`\n- Specific variant: `{ type: \"flag\", key: \"checkout-experiment\", operator: \"flag_evaluates_to\", value: \"variant-a\" }`",
"type": "string"
},
"value": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "string"
}
],
"description": "`true`/`false` for boolean flags, or a variant name string for multivariate flags."
}
},
"required": ["key", "value"],
"type": "object"
}
]
},
"type": "array"
},
"series": {
"description": "Event or action to analyze. Lifecycle insights only support a single series.",
"items": {
"anyOf": [
{
"properties": {
"custom_name": {
"type": "string"
},
"event": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The event or `null` for all events."
},
"kind": {
"const": "EventsNode",
"default": "EventsNode",
"description": "Defines the event series for the lifecycle insight. Lifecycle does not support math aggregations.",
"type": "string"
},
"name": {
"type": "string"
},
"properties": {
"items": {
"anyOf": [
{
"anyOf": [
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`icontains` - case insensitive contains. `not_icontains` - case insensitive does not contain. `regex` - matches the regex pattern. `not_regex` - does not match the regex pattern.",
"enum": [
"exact",
"is_not",
"icontains",
"not_icontains",
"regex",
"not_regex"
],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
},
"value": {
"description": "Only use property values from the plan. If the operator is `regex` or `not_regex`, the value must be a valid Datastore regex pattern to match against. Otherwise, the value must be a substring that will be matched against the property value. Use the string values `true` or `false` for boolean properties.",
"type": "string"
}
},
"required": ["key", "operator", "type", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"enum": ["exact", "gt", "lt"],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
},
"value": {
"type": "number"
}
},
"required": ["key", "operator", "type", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`exact` - exact match of any of the values. `is_not` - does not match any of the values.",
"enum": ["exact", "is_not"],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
},
"value": {
"description": "Only use property values from the plan. Always use strings as values. If you have a number, convert it to a string first. If you have a boolean, convert it to a string \"true\" or \"false\".",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": ["key", "operator", "type", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"enum": [
"is_date_exact",
"is_date_before",
"is_date_after"
],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
},
"value": {
"description": "Value must be a date in ISO 8601 format.",
"type": "string"
}
},
"required": ["key", "operator", "type", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`is_set` - the property has any value. `is_not_set` - the property doesn't have a value or wasn't collected.",
"enum": ["is_set", "is_not_set"],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
}
},
"required": ["key", "operator", "type"],
"type": "object"
}
]
},
{
"anyOf": [
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`icontains` - case insensitive contains. `not_icontains` - case insensitive does not contain. `regex` - matches the regex pattern. `not_regex` - does not match the regex pattern.",
"enum": [
"exact",
"is_not",
"icontains",
"not_icontains",
"regex",
"not_regex"
],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
},
"value": {
"description": "Only use property values from the plan. If the operator is `regex` or `not_regex`, the value must be a valid Datastore regex pattern to match against. Otherwise, the value must be a substring that will be matched against the property value. Use the string values `true` or `false` for boolean properties.",
"type": "string"
}
},
"required": ["group_type_index", "key", "operator", "value"],
"type": "object"
},
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"enum": ["exact", "gt", "lt"],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
},
"value": {
"type": "number"
}
},
"required": ["group_type_index", "key", "operator", "value"],
"type": "object"
},
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`exact` - exact match of any of the values. `is_not` - does not match any of the values.",
"enum": ["exact", "is_not"],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
},
"value": {
"description": "Only use property values from the plan. Always use strings as values. If you have a number, convert it to a string first. If you have a boolean, convert it to a string \"true\" or \"false\".",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": ["group_type_index", "key", "operator", "value"],
"type": "object"
},
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"enum": [
"is_date_exact",
"is_date_before",
"is_date_after"
],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
},
"value": {
"description": "Value must be a date in ISO 8601 format.",
"type": "string"
}
},
"required": ["group_type_index", "key", "operator", "value"],
"type": "object"
},
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`is_set` - the property has any value. `is_not_set` - the property doesn't have a value or wasn't collected.",
"enum": ["is_set", "is_not_set"],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
}
},
"required": ["group_type_index", "key", "operator"],
"type": "object"
}
]
},
{
"properties": {
"key": {
"const": "id",
"default": "id",
"type": "string"
},
"operator": {
"default": "in",
"enum": ["in", "not_in"],
"type": "string"
},
"type": {
"const": "cohort",
"default": "cohort",
"description": "Filter events by cohort membership. Use this to narrow down results to persons belonging to a specific cohort. Use `operator: \"in\"` to include cohort members, or `operator: \"not_in\"` to exclude them. Examples:\n- Include: `{ type: \"cohort\", key: \"id\", value: 42, operator: \"in\" }`\n- Exclude: `{ type: \"cohort\", key: \"id\", value: 42, operator: \"not_in\" }`",
"type": "string"
},
"value": {
"description": "The cohort ID to filter by.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"required": ["value"],
"type": "object"
},
{
"anyOf": [
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"description": "`icontains` - case insensitive contains. `not_icontains` - case insensitive does not contain. `regex` - matches the regex pattern. `not_regex` - does not match the regex pattern.",
"enum": [
"exact",
"is_not",
"icontains",
"not_icontains",
"regex",
"not_regex"
],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
},
"value": {
"description": "Only use property values from the plan. If the operator is `regex` or `not_regex`, the value must be a valid Datastore regex pattern to match against. Otherwise, the value must be a substring that will be matched against the property value. Use the string values `true` or `false` for boolean properties.",
"type": "string"
}
},
"required": ["key", "operator", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"enum": ["exact", "gt", "lt"],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
},
"value": {
"type": "number"
}
},
"required": ["key", "operator", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"description": "`exact` - exact match of any of the values. `is_not` - does not match any of the values.",
"enum": ["exact", "is_not"],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
},
"value": {
"description": "Only use property values from the plan. Always use strings as values. If you have a number, convert it to a string first. If you have a boolean, convert it to a string \"true\" or \"false\".",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": ["key", "operator", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"enum": [
"is_date_exact",
"is_date_before",
"is_date_after"
],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
},
"value": {
"description": "Value must be a date in ISO 8601 format.",
"type": "string"
}
},
"required": ["key", "operator", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"description": "`is_set` - the property has any value. `is_not_set` - the property doesn't have a value or wasn't collected.",
"enum": ["is_set", "is_not_set"],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
}
},
"required": ["key", "operator"],
"type": "object"
}
]
},
{
"properties": {
"key": {
"description": "A InsightsQL boolean expression used as a filter condition.\n\nExamples:\n- Filter where a property exceeds a threshold: `toFloat(properties.load_time) > 5.0`\n- Filter with string matching: `properties.$current_url LIKE '%/pricing%'`\n- Filter with multiple conditions: `properties.$browser = 'Chrome' AND toFloat(properties.duration) > 30`",
"type": "string"
},
"type": {
"const": "insightsql",
"default": "insightsql",
"description": "Filter by a InsightsQL boolean expression for advanced filtering that can't be expressed with standard property filters.",
"type": "string"
}
},
"required": ["key"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The feature flag key.",
"type": "string"
},
"operator": {
"const": "flag_evaluates_to",
"default": "flag_evaluates_to",
"type": "string"
},
"type": {
"const": "flag",
"default": "flag",
"description": "Filter events by feature flag state — only include events where a specific flag evaluated to a given value. Examples:\n- Flag enabled: `{ type: \"flag\", key: \"new-onboarding\", operator: \"flag_evaluates_to\", value: true }`\n- Specific variant: `{ type: \"flag\", key: \"checkout-experiment\", operator: \"flag_evaluates_to\", value: \"variant-a\" }`",
"type": "string"
},
"value": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "string"
}
],
"description": "`true`/`false` for boolean flags, or a variant name string for multivariate flags."
}
},
"required": ["key", "value"],
"type": "object"
}
]
},
"type": "array"
}
},
"type": "object"
},
{
"properties": {
"custom_name": {
"type": "string"
},
"id": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"kind": {
"const": "ActionsNode",
"default": "ActionsNode",
"description": "Defines the action series for the lifecycle insight. Lifecycle does not support math aggregations. You must provide the action ID in the `id` field and the name in the `name` field.",
"type": "string"
},
"name": {
"description": "Action name from the plan.",
"type": "string"
},
"properties": {
"items": {
"anyOf": [
{
"anyOf": [
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`icontains` - case insensitive contains. `not_icontains` - case insensitive does not contain. `regex` - matches the regex pattern. `not_regex` - does not match the regex pattern.",
"enum": [
"exact",
"is_not",
"icontains",
"not_icontains",
"regex",
"not_regex"
],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
},
"value": {
"description": "Only use property values from the plan. If the operator is `regex` or `not_regex`, the value must be a valid Datastore regex pattern to match against. Otherwise, the value must be a substring that will be matched against the property value. Use the string values `true` or `false` for boolean properties.",
"type": "string"
}
},
"required": ["key", "operator", "type", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"enum": ["exact", "gt", "lt"],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
},
"value": {
"type": "number"
}
},
"required": ["key", "operator", "type", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`exact` - exact match of any of the values. `is_not` - does not match any of the values.",
"enum": ["exact", "is_not"],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
},
"value": {
"description": "Only use property values from the plan. Always use strings as values. If you have a number, convert it to a string first. If you have a boolean, convert it to a string \"true\" or \"false\".",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": ["key", "operator", "type", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"enum": [
"is_date_exact",
"is_date_before",
"is_date_after"
],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
},
"value": {
"description": "Value must be a date in ISO 8601 format.",
"type": "string"
}
},
"required": ["key", "operator", "type", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`is_set` - the property has any value. `is_not_set` - the property doesn't have a value or wasn't collected.",
"enum": ["is_set", "is_not_set"],
"type": "string"
},
"type": {
"enum": ["event", "person", "session", "feature"],
"type": "string"
}
},
"required": ["key", "operator", "type"],
"type": "object"
}
]
},
{
"anyOf": [
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`icontains` - case insensitive contains. `not_icontains` - case insensitive does not contain. `regex` - matches the regex pattern. `not_regex` - does not match the regex pattern.",
"enum": [
"exact",
"is_not",
"icontains",
"not_icontains",
"regex",
"not_regex"
],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
},
"value": {
"description": "Only use property values from the plan. If the operator is `regex` or `not_regex`, the value must be a valid Datastore regex pattern to match against. Otherwise, the value must be a substring that will be matched against the property value. Use the string values `true` or `false` for boolean properties.",
"type": "string"
}
},
"required": ["group_type_index", "key", "operator", "value"],
"type": "object"
},
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"enum": ["exact", "gt", "lt"],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
},
"value": {
"type": "number"
}
},
"required": ["group_type_index", "key", "operator", "value"],
"type": "object"
},
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`exact` - exact match of any of the values. `is_not` - does not match any of the values.",
"enum": ["exact", "is_not"],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
},
"value": {
"description": "Only use property values from the plan. Always use strings as values. If you have a number, convert it to a string first. If you have a boolean, convert it to a string \"true\" or \"false\".",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": ["group_type_index", "key", "operator", "value"],
"type": "object"
},
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"enum": [
"is_date_exact",
"is_date_before",
"is_date_after"
],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
},
"value": {
"description": "Value must be a date in ISO 8601 format.",
"type": "string"
}
},
"required": ["group_type_index", "key", "operator", "value"],
"type": "object"
},
{
"properties": {
"group_type_index": {
"description": "Index of the group type from the group mapping.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"key": {
"description": "Use one of the properties the user has provided in the plan.",
"type": "string"
},
"operator": {
"description": "`is_set` - the property has any value. `is_not_set` - the property doesn't have a value or wasn't collected.",
"enum": ["is_set", "is_not_set"],
"type": "string"
},
"type": {
"const": "group",
"default": "group",
"type": "string"
}
},
"required": ["group_type_index", "key", "operator"],
"type": "object"
}
]
},
{
"properties": {
"key": {
"const": "id",
"default": "id",
"type": "string"
},
"operator": {
"default": "in",
"enum": ["in", "not_in"],
"type": "string"
},
"type": {
"const": "cohort",
"default": "cohort",
"description": "Filter events by cohort membership. Use this to narrow down results to persons belonging to a specific cohort. Use `operator: \"in\"` to include cohort members, or `operator: \"not_in\"` to exclude them. Examples:\n- Include: `{ type: \"cohort\", key: \"id\", value: 42, operator: \"in\" }`\n- Exclude: `{ type: \"cohort\", key: \"id\", value: 42, operator: \"not_in\" }`",
"type": "string"
},
"value": {
"description": "The cohort ID to filter by.",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"required": ["value"],
"type": "object"
},
{
"anyOf": [
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"description": "`icontains` - case insensitive contains. `not_icontains` - case insensitive does not contain. `regex` - matches the regex pattern. `not_regex` - does not match the regex pattern.",
"enum": [
"exact",
"is_not",
"icontains",
"not_icontains",
"regex",
"not_regex"
],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
},
"value": {
"description": "Only use property values from the plan. If the operator is `regex` or `not_regex`, the value must be a valid Datastore regex pattern to match against. Otherwise, the value must be a substring that will be matched against the property value. Use the string values `true` or `false` for boolean properties.",
"type": "string"
}
},
"required": ["key", "operator", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"enum": ["exact", "gt", "lt"],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
},
"value": {
"type": "number"
}
},
"required": ["key", "operator", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"description": "`exact` - exact match of any of the values. `is_not` - does not match any of the values.",
"enum": ["exact", "is_not"],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
},
"value": {
"description": "Only use property values from the plan. Always use strings as values. If you have a number, convert it to a string first. If you have a boolean, convert it to a string \"true\" or \"false\".",
"items": {
"type": "string"
},
"type": "array"
}
},
"required": ["key", "operator", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"enum": [
"is_date_exact",
"is_date_before",
"is_date_after"
],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
},
"value": {
"description": "Value must be a date in ISO 8601 format.",
"type": "string"
}
},
"required": ["key", "operator", "value"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The element property to filter on. `tag_name` — HTML tag (e.g., `button`, `a`, `input`). `text` — visible text content of the element. `href` — the `href` attribute for links. `selector` — a CSS selector matching the element (e.g., `div.main > button.cta`).",
"enum": ["tag_name", "text", "href", "selector"],
"type": "string"
},
"operator": {
"description": "`is_set` - the property has any value. `is_not_set` - the property doesn't have a value or wasn't collected.",
"enum": ["is_set", "is_not_set"],
"type": "string"
},
"type": {
"const": "element",
"default": "element",
"description": "Filter by autocaptured HTML element properties (`$autocapture`, `$rageclick`). Example: `{ type: \"element\", key: \"text\", value: \"Sign Up\", operator: \"exact\" }`",
"type": "string"
}
},
"required": ["key", "operator"],
"type": "object"
}
]
},
{
"properties": {
"key": {
"description": "A InsightsQL boolean expression used as a filter condition.\n\nExamples:\n- Filter where a property exceeds a threshold: `toFloat(properties.load_time) > 5.0`\n- Filter with string matching: `properties.$current_url LIKE '%/pricing%'`\n- Filter with multiple conditions: `properties.$browser = 'Chrome' AND toFloat(properties.duration) > 30`",
"type": "string"
},
"type": {
"const": "insightsql",
"default": "insightsql",
"description": "Filter by a InsightsQL boolean expression for advanced filtering that can't be expressed with standard property filters.",
"type": "string"
}
},
"required": ["key"],
"type": "object"
},
{
"properties": {
"key": {
"description": "The feature flag key.",
"type": "string"
},
"operator": {
"const": "flag_evaluates_to",
"default": "flag_evaluates_to",
"type": "string"
},
"type": {
"const": "flag",
"default": "flag",
"description": "Filter events by feature flag state — only include events where a specific flag evaluated to a given value. Examples:\n- Flag enabled: `{ type: \"flag\", key: \"new-onboarding\", operator: \"flag_evaluates_to\", value: true }`\n- Specific variant: `{ type: \"flag\", key: \"checkout-experiment\", operator: \"flag_evaluates_to\", value: \"variant-a\" }`",
"type": "string"
},
"value": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "string"
}
],
"description": "`true`/`false` for boolean flags, or a variant name string for multivariate flags."
}
},
"required": ["key", "value"],
"type": "object"
}
]
},
"type": "array"
}
},
"required": ["id", "name"],
"type": "object"
}
]
},
"maxItems": 1,
"type": "array"
}
},
"required": ["series"],
"type": "object"
}