mirror of
https://github.com/hanzoai/insights.git
synced 2026-11-02 14:32:45 +00:00
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.
5947 lines
424 KiB
JSON
5947 lines
424 KiB
JSON
{
|
||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||
"properties": {
|
||
"allow_unknown_events": {
|
||
"description": "Suppresses the validation that rejects metrics referencing events not yet ingested by this project. REQUIRES explicit user confirmation before being set to true — never flip this silently to retry a failed call. The default validation catches typo'd event names and missing instrumentation. Set this to true only when the user has confirmed the event is intentional (e.g. they are about to instrument it).",
|
||
"type": "boolean"
|
||
},
|
||
"archived": {
|
||
"description": "Whether the experiment is archived.",
|
||
"type": "boolean"
|
||
},
|
||
"conclusion": {
|
||
"anyOf": [
|
||
{
|
||
"description": "* `won` - won\n* `lost` - lost\n* `inconclusive` - inconclusive\n* `stopped_early` - stopped_early\n* `invalid` - invalid",
|
||
"enum": ["won", "lost", "inconclusive", "stopped_early", "invalid"],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Experiment conclusion: won, lost, inconclusive, stopped_early, or invalid.\n\n* `won` - won\n* `lost` - lost\n* `inconclusive` - inconclusive\n* `stopped_early` - stopped_early\n* `invalid` - invalid"
|
||
},
|
||
"conclusion_comment": {
|
||
"anyOf": [
|
||
{
|
||
"maxLength": 4000,
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Comment about the experiment conclusion."
|
||
},
|
||
"description": {
|
||
"anyOf": [
|
||
{
|
||
"maxLength": 3000,
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Description of the experiment hypothesis and expected outcomes."
|
||
},
|
||
"excluded_variants": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"type": "string"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Variant keys to exclude from metric result calculations. Excluded variants are still served to users but omitted from statistical analysis. The baseline variant and holdout pseudo-variants cannot be excluded. Canonical home for what historically lived in `parameters.excluded_variants`."
|
||
},
|
||
"exposure_criteria": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"exposure_config": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"event": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Custom exposure event name. Required when kind is 'ExperimentEventExposureConfig'."
|
||
},
|
||
"id": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Action ID. Required when kind is 'ActionsNode'."
|
||
},
|
||
"kind": {
|
||
"anyOf": [
|
||
{
|
||
"enum": ["ExperimentEventExposureConfig", "ActionsNode"],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Defaults to 'ExperimentEventExposureConfig' when omitted. Pass 'ActionsNode' for an action-based exposure."
|
||
},
|
||
"properties": {
|
||
"description": "Property filters (event, person, and other supported types). Pass an empty array if no filters needed.",
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"default": "exact"
|
||
},
|
||
"type": {
|
||
"const": "event",
|
||
"default": "event",
|
||
"description": "Event properties",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "person",
|
||
"default": "person",
|
||
"description": "Person properties",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "person_metadata",
|
||
"default": "person_metadata",
|
||
"description": "Top-level columns on the persons table (e.g. created_at), not properties JSON",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"enum": ["tag_name", "text", "href", "selector"],
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "element",
|
||
"default": "element",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "event_metadata",
|
||
"default": "event_metadata",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "session",
|
||
"default": "session",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"cohort_name": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"key": {
|
||
"const": "id",
|
||
"default": "id",
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"default": "in"
|
||
},
|
||
"type": {
|
||
"const": "cohort",
|
||
"default": "cohort",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"type": "number"
|
||
}
|
||
},
|
||
"required": ["value"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"duration",
|
||
"active_seconds",
|
||
"inactive_seconds"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "string"
|
||
}
|
||
]
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "recording",
|
||
"default": "recording",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "log_entry",
|
||
"default": "log_entry",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"group_key_names": {
|
||
"anyOf": [
|
||
{
|
||
"additionalProperties": {
|
||
"type": "string"
|
||
},
|
||
"propertyNames": {
|
||
"type": "string"
|
||
},
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"group_type_index": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "group",
|
||
"default": "group",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "feature",
|
||
"default": "feature",
|
||
"description": "Event property with \"$feature/\" prepended",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"description": "The key should be the flag ID",
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"const": "flag_evaluates_to",
|
||
"default": "flag_evaluates_to",
|
||
"description": "Only flag_evaluates_to operator is allowed for flag dependencies",
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "flag",
|
||
"default": "flag",
|
||
"description": "Feature flag dependency",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "string"
|
||
}
|
||
],
|
||
"description": "The value can be true, false, or a variant name"
|
||
}
|
||
},
|
||
"required": ["key", "value"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"type": {
|
||
"const": "insightsql",
|
||
"default": "insightsql",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"type": {
|
||
"const": "empty",
|
||
"default": "empty",
|
||
"type": "string"
|
||
}
|
||
},
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "data_warehouse",
|
||
"default": "data_warehouse",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "data_warehouse_person_property",
|
||
"default": "data_warehouse_person_property",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "error_tracking_issue",
|
||
"default": "error_tracking_issue",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"enum": [
|
||
"log",
|
||
"log_attribute",
|
||
"log_resource_attribute"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator", "type"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "metric_attribute",
|
||
"default": "metric_attribute",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"enum": [
|
||
"span",
|
||
"span_attribute",
|
||
"span_resource_attribute"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator", "type"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "revenue_analytics",
|
||
"default": "revenue_analytics",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "account_custom_property",
|
||
"default": "account_custom_property",
|
||
"description": "Customer analytics account custom property — the key is the property definition id",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
"type": {
|
||
"const": "workflow_variable",
|
||
"default": "workflow_variable",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key", "operator"],
|
||
"type": "object"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
}
|
||
},
|
||
"required": ["properties"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"filterTestAccounts": {
|
||
"anyOf": [
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"multiple_variant_handling": {
|
||
"anyOf": [
|
||
{
|
||
"enum": ["exclude", "first_seen"],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "How to handle entities exposed to multiple variants. 'exclude' (default) drops them from the analysis; 'first_seen' assigns them to the variant from their earliest exposure."
|
||
}
|
||
},
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Exposure configuration including filter test accounts and custom exposure events."
|
||
},
|
||
"feature_flag": {
|
||
"description": "Variant split, rollout scope, payloads, and experience continuity for the linked feature flag, in the flag's own filters shape. This is the canonical input for flag config. Set filters.multivariate.variants (each with key and rollout_percentage; percentages must sum to 100; the analysis baseline defaults to the variant keyed 'control' when present, else the first variant — except web experiments, which must keep a variant keyed 'control') to change the variant split. Set filters.groups to a single group [{\"properties\": [], \"rollout_percentage\": N}] (0-100) to change the overall rollout. Config this object omits is preserved from the flag's current state. On a running experiment this requires update_feature_flag_params=true (see rule 1: warn the user first).",
|
||
"properties": {
|
||
"ensure_experience_continuity": {
|
||
"anyOf": [
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Whether the flag persists variant assignment across authentication steps."
|
||
},
|
||
"filters": {
|
||
"description": "Flag config to apply: `multivariate.variants` (2 to 20 variants; the baseline defaults to the variant keyed 'control' when present, else the first variant), `groups` (a single group with `rollout_percentage` only; release conditions are not supported here, edit the feature flag directly), `aggregation_group_type_index`, and `payloads` (JSON-encoded strings keyed by variant key). On update, config this object omits is preserved from the linked flag's current state.",
|
||
"properties": {
|
||
"aggregation_group_type_index": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Group type index for group-based feature flags."
|
||
},
|
||
"groups": {
|
||
"description": "Overall rollout as a single group: [{\"properties\": [], \"rollout_percentage\": N}].",
|
||
"items": {
|
||
"description": "A single release-condition group carrying only the overall rollout percentage, the one\ngroups entry the experiment input applies.",
|
||
"properties": {
|
||
"properties": {
|
||
"description": "Must be empty or omitted: release-condition properties are not supported via the experiment input. Edit the feature flag directly for targeting.",
|
||
"items": {},
|
||
"maxItems": 0,
|
||
"type": "array"
|
||
},
|
||
"rollout_percentage": {
|
||
"anyOf": [
|
||
{
|
||
"maximum": 100,
|
||
"minimum": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Percentage of users who enter the experiment (0-100)."
|
||
}
|
||
},
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
"multivariate": {
|
||
"anyOf": [
|
||
{
|
||
"description": "Multivariate config for the experiment's feature flag.",
|
||
"properties": {
|
||
"variants": {
|
||
"description": "Variant definitions (2 to 20). The baseline defaults to the variant keyed 'control' when present, else the first variant.",
|
||
"items": {
|
||
"description": "A single multivariate variant. Extra per-variant keys are dropped.",
|
||
"properties": {
|
||
"key": {
|
||
"description": "Unique variant key. The baseline defaults to the variant keyed 'control' when present, else the first variant.",
|
||
"type": "string"
|
||
},
|
||
"name": {
|
||
"description": "Human-readable variant name.",
|
||
"type": "string"
|
||
},
|
||
"rollout_percentage": {
|
||
"description": "Variant rollout percentage (0-100). Across variants these must sum to 100.",
|
||
"maximum": 100,
|
||
"minimum": 0,
|
||
"type": "number"
|
||
}
|
||
},
|
||
"required": ["key", "rollout_percentage"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
}
|
||
},
|
||
"required": ["variants"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Multivariate variant configuration."
|
||
},
|
||
"payloads": {
|
||
"additionalProperties": {
|
||
"type": "string"
|
||
},
|
||
"description": "Optional payload values keyed by variant key.",
|
||
"propertyNames": {
|
||
"type": "string"
|
||
},
|
||
"type": "object"
|
||
}
|
||
},
|
||
"type": "object"
|
||
}
|
||
},
|
||
"type": "object"
|
||
},
|
||
"holdout_id": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "ID of a holdout group to exclude from the experiment."
|
||
},
|
||
"id": {
|
||
"description": "A unique integer value identifying this experiment.",
|
||
"type": "number"
|
||
},
|
||
"metrics": {
|
||
"anyOf": [
|
||
{
|
||
"description": "List wrapper for OpenAPI schema generation — the field stores an array of metrics.",
|
||
"items": {
|
||
"properties": {
|
||
"completion_event": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"event": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event name, e.g. '$pageview'. Required for EventsNode."
|
||
},
|
||
"id": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Action ID. Required for ActionsNode."
|
||
},
|
||
"kind": {
|
||
"enum": ["EventsNode", "ActionsNode"],
|
||
"type": "string"
|
||
},
|
||
"math": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"total",
|
||
"sum",
|
||
"unique_session",
|
||
"min",
|
||
"max",
|
||
"avg",
|
||
"dau",
|
||
"unique_group",
|
||
"insightsql"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "How to aggregate this source. Defaults to 'total' (event count). Use 'sum' together with math_property to aggregate a numeric property — e.g. a ratio numerator of revenue per order. Other options: 'avg', 'min', 'max', 'unique_session', 'dau', 'unique_group', 'insightsql'."
|
||
},
|
||
"math_group_type_index": {
|
||
"anyOf": [
|
||
{
|
||
"anyOf": [
|
||
{
|
||
"const": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 1,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 2,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 3,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 4,
|
||
"type": "number"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Group type index to aggregate over. Required when math is 'unique_group'."
|
||
},
|
||
"math_insightsql": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "InsightsQL aggregation expression. Required when math is 'insightsql' — without it the metric silently falls back to a plain count/sum."
|
||
},
|
||
"math_property": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Numeric event property to aggregate when math is 'sum', 'avg', 'min', or 'max' (e.g. 'revenue')."
|
||
},
|
||
"properties": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"default": "exact"
|
||
},
|
||
"type": {
|
||
"const": "event",
|
||
"default": "event",
|
||
"description": "Event properties",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event property filters to narrow which events are counted."
|
||
}
|
||
},
|
||
"required": ["kind"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For retention metrics: completion event."
|
||
},
|
||
"conversion_window": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Conversion window duration."
|
||
},
|
||
"denominator": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"event": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event name, e.g. '$pageview'. Required for EventsNode."
|
||
},
|
||
"id": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Action ID. Required for ActionsNode."
|
||
},
|
||
"kind": {
|
||
"enum": ["EventsNode", "ActionsNode"],
|
||
"type": "string"
|
||
},
|
||
"math": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"total",
|
||
"sum",
|
||
"unique_session",
|
||
"min",
|
||
"max",
|
||
"avg",
|
||
"dau",
|
||
"unique_group",
|
||
"insightsql"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "How to aggregate this source. Defaults to 'total' (event count). Use 'sum' together with math_property to aggregate a numeric property — e.g. a ratio numerator of revenue per order. Other options: 'avg', 'min', 'max', 'unique_session', 'dau', 'unique_group', 'insightsql'."
|
||
},
|
||
"math_group_type_index": {
|
||
"anyOf": [
|
||
{
|
||
"anyOf": [
|
||
{
|
||
"const": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 1,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 2,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 3,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 4,
|
||
"type": "number"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Group type index to aggregate over. Required when math is 'unique_group'."
|
||
},
|
||
"math_insightsql": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "InsightsQL aggregation expression. Required when math is 'insightsql' — without it the metric silently falls back to a plain count/sum."
|
||
},
|
||
"math_property": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Numeric event property to aggregate when math is 'sum', 'avg', 'min', or 'max' (e.g. 'revenue')."
|
||
},
|
||
"properties": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"default": "exact"
|
||
},
|
||
"type": {
|
||
"const": "event",
|
||
"default": "event",
|
||
"description": "Event properties",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event property filters to narrow which events are counted."
|
||
}
|
||
},
|
||
"required": ["kind"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For ratio metrics: denominator source."
|
||
},
|
||
"denominator_outlier_handling": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"ignore_zeros": {
|
||
"anyOf": [
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"lower_bound_percentile": {
|
||
"anyOf": [
|
||
{
|
||
"maximum": 1,
|
||
"minimum": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Winsorization lower percentile bound, as a fraction in [0, 1] (e.g. 0.01 for the 1st percentile)."
|
||
},
|
||
"upper_bound_percentile": {
|
||
"anyOf": [
|
||
{
|
||
"maximum": 1,
|
||
"minimum": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Winsorization upper percentile bound, as a fraction in [0, 1] (e.g. 0.99 for the 99th percentile)."
|
||
}
|
||
},
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For ratio metrics: winsorization applied to the denominator aggregate. Leave unset for a binomial-style denominator, which is never clamped."
|
||
},
|
||
"goal": {
|
||
"anyOf": [
|
||
{
|
||
"enum": ["increase", "decrease"],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Whether higher or lower values indicate success."
|
||
},
|
||
"ignore_zeros": {
|
||
"anyOf": [
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For mean metrics: exclude zero values when computing the winsorization percentile thresholds."
|
||
},
|
||
"kind": {
|
||
"const": "ExperimentMetric",
|
||
"default": "ExperimentMetric",
|
||
"type": "string"
|
||
},
|
||
"lower_bound_percentile": {
|
||
"anyOf": [
|
||
{
|
||
"maximum": 1,
|
||
"minimum": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For mean metrics: winsorization lower percentile bound, as a fraction in [0, 1] (e.g. 0.01 for the 1st percentile). Per-user values below this percentile are clamped to it before aggregation."
|
||
},
|
||
"metric_type": {
|
||
"enum": ["funnel", "mean", "ratio", "retention"],
|
||
"type": "string"
|
||
},
|
||
"name": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Human-readable metric name."
|
||
},
|
||
"numerator": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"event": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event name, e.g. '$pageview'. Required for EventsNode."
|
||
},
|
||
"id": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Action ID. Required for ActionsNode."
|
||
},
|
||
"kind": {
|
||
"enum": ["EventsNode", "ActionsNode"],
|
||
"type": "string"
|
||
},
|
||
"math": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"total",
|
||
"sum",
|
||
"unique_session",
|
||
"min",
|
||
"max",
|
||
"avg",
|
||
"dau",
|
||
"unique_group",
|
||
"insightsql"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "How to aggregate this source. Defaults to 'total' (event count). Use 'sum' together with math_property to aggregate a numeric property — e.g. a ratio numerator of revenue per order. Other options: 'avg', 'min', 'max', 'unique_session', 'dau', 'unique_group', 'insightsql'."
|
||
},
|
||
"math_group_type_index": {
|
||
"anyOf": [
|
||
{
|
||
"anyOf": [
|
||
{
|
||
"const": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 1,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 2,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 3,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 4,
|
||
"type": "number"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Group type index to aggregate over. Required when math is 'unique_group'."
|
||
},
|
||
"math_insightsql": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "InsightsQL aggregation expression. Required when math is 'insightsql' — without it the metric silently falls back to a plain count/sum."
|
||
},
|
||
"math_property": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Numeric event property to aggregate when math is 'sum', 'avg', 'min', or 'max' (e.g. 'revenue')."
|
||
},
|
||
"properties": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"default": "exact"
|
||
},
|
||
"type": {
|
||
"const": "event",
|
||
"default": "event",
|
||
"description": "Event properties",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event property filters to narrow which events are counted."
|
||
}
|
||
},
|
||
"required": ["kind"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For ratio metrics: numerator source."
|
||
},
|
||
"numerator_outlier_handling": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"ignore_zeros": {
|
||
"anyOf": [
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"lower_bound_percentile": {
|
||
"anyOf": [
|
||
{
|
||
"maximum": 1,
|
||
"minimum": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Winsorization lower percentile bound, as a fraction in [0, 1] (e.g. 0.01 for the 1st percentile)."
|
||
},
|
||
"upper_bound_percentile": {
|
||
"anyOf": [
|
||
{
|
||
"maximum": 1,
|
||
"minimum": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Winsorization upper percentile bound, as a fraction in [0, 1] (e.g. 0.99 for the 99th percentile)."
|
||
}
|
||
},
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For ratio metrics: winsorization applied to the numerator aggregate, independently of the denominator and each with its own percentile thresholds."
|
||
},
|
||
"retention_window_end": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"retention_window_start": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"retention_window_unit": {
|
||
"anyOf": [
|
||
{
|
||
"enum": ["second", "minute", "hour", "day", "week", "month"],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"series": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"properties": {
|
||
"event": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event name, e.g. '$pageview'. Required for EventsNode."
|
||
},
|
||
"id": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Action ID. Required for ActionsNode."
|
||
},
|
||
"kind": {
|
||
"enum": ["EventsNode", "ActionsNode"],
|
||
"type": "string"
|
||
},
|
||
"math": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"total",
|
||
"sum",
|
||
"unique_session",
|
||
"min",
|
||
"max",
|
||
"avg",
|
||
"dau",
|
||
"unique_group",
|
||
"insightsql"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "How to aggregate this source. Defaults to 'total' (event count). Use 'sum' together with math_property to aggregate a numeric property — e.g. a ratio numerator of revenue per order. Other options: 'avg', 'min', 'max', 'unique_session', 'dau', 'unique_group', 'insightsql'."
|
||
},
|
||
"math_group_type_index": {
|
||
"anyOf": [
|
||
{
|
||
"anyOf": [
|
||
{
|
||
"const": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 1,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 2,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 3,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 4,
|
||
"type": "number"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Group type index to aggregate over. Required when math is 'unique_group'."
|
||
},
|
||
"math_insightsql": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "InsightsQL aggregation expression. Required when math is 'insightsql' — without it the metric silently falls back to a plain count/sum."
|
||
},
|
||
"math_property": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Numeric event property to aggregate when math is 'sum', 'avg', 'min', or 'max' (e.g. 'revenue')."
|
||
},
|
||
"properties": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"default": "exact"
|
||
},
|
||
"type": {
|
||
"const": "event",
|
||
"default": "event",
|
||
"description": "Event properties",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event property filters to narrow which events are counted."
|
||
}
|
||
},
|
||
"required": ["kind"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For funnel metrics: array of EventsNode/ActionsNode steps."
|
||
},
|
||
"source": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"event": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event name, e.g. '$pageview'. Required for EventsNode."
|
||
},
|
||
"id": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Action ID. Required for ActionsNode."
|
||
},
|
||
"kind": {
|
||
"enum": ["EventsNode", "ActionsNode"],
|
||
"type": "string"
|
||
},
|
||
"math": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"total",
|
||
"sum",
|
||
"unique_session",
|
||
"min",
|
||
"max",
|
||
"avg",
|
||
"dau",
|
||
"unique_group",
|
||
"insightsql"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "How to aggregate this source. Defaults to 'total' (event count). Use 'sum' together with math_property to aggregate a numeric property — e.g. a ratio numerator of revenue per order. Other options: 'avg', 'min', 'max', 'unique_session', 'dau', 'unique_group', 'insightsql'."
|
||
},
|
||
"math_group_type_index": {
|
||
"anyOf": [
|
||
{
|
||
"anyOf": [
|
||
{
|
||
"const": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 1,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 2,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 3,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 4,
|
||
"type": "number"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Group type index to aggregate over. Required when math is 'unique_group'."
|
||
},
|
||
"math_insightsql": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "InsightsQL aggregation expression. Required when math is 'insightsql' — without it the metric silently falls back to a plain count/sum."
|
||
},
|
||
"math_property": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Numeric event property to aggregate when math is 'sum', 'avg', 'min', or 'max' (e.g. 'revenue')."
|
||
},
|
||
"properties": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"default": "exact"
|
||
},
|
||
"type": {
|
||
"const": "event",
|
||
"default": "event",
|
||
"description": "Event properties",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event property filters to narrow which events are counted."
|
||
}
|
||
},
|
||
"required": ["kind"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For mean metrics: event source."
|
||
},
|
||
"start_event": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"event": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event name, e.g. '$pageview'. Required for EventsNode."
|
||
},
|
||
"id": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Action ID. Required for ActionsNode."
|
||
},
|
||
"kind": {
|
||
"enum": ["EventsNode", "ActionsNode"],
|
||
"type": "string"
|
||
},
|
||
"math": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"total",
|
||
"sum",
|
||
"unique_session",
|
||
"min",
|
||
"max",
|
||
"avg",
|
||
"dau",
|
||
"unique_group",
|
||
"insightsql"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "How to aggregate this source. Defaults to 'total' (event count). Use 'sum' together with math_property to aggregate a numeric property — e.g. a ratio numerator of revenue per order. Other options: 'avg', 'min', 'max', 'unique_session', 'dau', 'unique_group', 'insightsql'."
|
||
},
|
||
"math_group_type_index": {
|
||
"anyOf": [
|
||
{
|
||
"anyOf": [
|
||
{
|
||
"const": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 1,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 2,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 3,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 4,
|
||
"type": "number"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Group type index to aggregate over. Required when math is 'unique_group'."
|
||
},
|
||
"math_insightsql": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "InsightsQL aggregation expression. Required when math is 'insightsql' — without it the metric silently falls back to a plain count/sum."
|
||
},
|
||
"math_property": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Numeric event property to aggregate when math is 'sum', 'avg', 'min', or 'max' (e.g. 'revenue')."
|
||
},
|
||
"properties": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"default": "exact"
|
||
},
|
||
"type": {
|
||
"const": "event",
|
||
"default": "event",
|
||
"description": "Event properties",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event property filters to narrow which events are counted."
|
||
}
|
||
},
|
||
"required": ["kind"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For retention metrics: start event."
|
||
},
|
||
"start_handling": {
|
||
"anyOf": [
|
||
{
|
||
"enum": ["first_seen", "last_seen"],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"threshold": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For mean metrics: when set, reports the percentage of users whose per-user summed/counted value reaches or exceeds this threshold. Only meaningful for sum/count math types."
|
||
},
|
||
"upper_bound_percentile": {
|
||
"anyOf": [
|
||
{
|
||
"maximum": 1,
|
||
"minimum": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For mean metrics: winsorization upper percentile bound, as a fraction in [0, 1] (e.g. 0.99 for the 99th percentile). Per-user values above this percentile are clamped to it before aggregation."
|
||
},
|
||
"uuid": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Unique identifier. Auto-generated if omitted."
|
||
}
|
||
},
|
||
"required": ["metric_type"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Primary experiment metrics. Each metric must have kind='ExperimentMetric' and a metric_type: 'mean' (set source to an EventsNode with an event name), 'funnel' (set series to an array of EventsNode steps), 'ratio' (set numerator and denominator EventsNode entries), or 'retention' (set start_event and completion_event). Use the read-data-schema tool with query kind 'events' to find available events in the project."
|
||
},
|
||
"metrics_secondary": {
|
||
"anyOf": [
|
||
{
|
||
"description": "List wrapper for OpenAPI schema generation — the field stores an array of metrics.",
|
||
"items": {
|
||
"properties": {
|
||
"completion_event": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"event": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event name, e.g. '$pageview'. Required for EventsNode."
|
||
},
|
||
"id": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Action ID. Required for ActionsNode."
|
||
},
|
||
"kind": {
|
||
"enum": ["EventsNode", "ActionsNode"],
|
||
"type": "string"
|
||
},
|
||
"math": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"total",
|
||
"sum",
|
||
"unique_session",
|
||
"min",
|
||
"max",
|
||
"avg",
|
||
"dau",
|
||
"unique_group",
|
||
"insightsql"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "How to aggregate this source. Defaults to 'total' (event count). Use 'sum' together with math_property to aggregate a numeric property — e.g. a ratio numerator of revenue per order. Other options: 'avg', 'min', 'max', 'unique_session', 'dau', 'unique_group', 'insightsql'."
|
||
},
|
||
"math_group_type_index": {
|
||
"anyOf": [
|
||
{
|
||
"anyOf": [
|
||
{
|
||
"const": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 1,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 2,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 3,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 4,
|
||
"type": "number"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Group type index to aggregate over. Required when math is 'unique_group'."
|
||
},
|
||
"math_insightsql": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "InsightsQL aggregation expression. Required when math is 'insightsql' — without it the metric silently falls back to a plain count/sum."
|
||
},
|
||
"math_property": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Numeric event property to aggregate when math is 'sum', 'avg', 'min', or 'max' (e.g. 'revenue')."
|
||
},
|
||
"properties": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"default": "exact"
|
||
},
|
||
"type": {
|
||
"const": "event",
|
||
"default": "event",
|
||
"description": "Event properties",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event property filters to narrow which events are counted."
|
||
}
|
||
},
|
||
"required": ["kind"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For retention metrics: completion event."
|
||
},
|
||
"conversion_window": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Conversion window duration."
|
||
},
|
||
"denominator": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"event": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event name, e.g. '$pageview'. Required for EventsNode."
|
||
},
|
||
"id": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Action ID. Required for ActionsNode."
|
||
},
|
||
"kind": {
|
||
"enum": ["EventsNode", "ActionsNode"],
|
||
"type": "string"
|
||
},
|
||
"math": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"total",
|
||
"sum",
|
||
"unique_session",
|
||
"min",
|
||
"max",
|
||
"avg",
|
||
"dau",
|
||
"unique_group",
|
||
"insightsql"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "How to aggregate this source. Defaults to 'total' (event count). Use 'sum' together with math_property to aggregate a numeric property — e.g. a ratio numerator of revenue per order. Other options: 'avg', 'min', 'max', 'unique_session', 'dau', 'unique_group', 'insightsql'."
|
||
},
|
||
"math_group_type_index": {
|
||
"anyOf": [
|
||
{
|
||
"anyOf": [
|
||
{
|
||
"const": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 1,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 2,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 3,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 4,
|
||
"type": "number"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Group type index to aggregate over. Required when math is 'unique_group'."
|
||
},
|
||
"math_insightsql": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "InsightsQL aggregation expression. Required when math is 'insightsql' — without it the metric silently falls back to a plain count/sum."
|
||
},
|
||
"math_property": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Numeric event property to aggregate when math is 'sum', 'avg', 'min', or 'max' (e.g. 'revenue')."
|
||
},
|
||
"properties": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"default": "exact"
|
||
},
|
||
"type": {
|
||
"const": "event",
|
||
"default": "event",
|
||
"description": "Event properties",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event property filters to narrow which events are counted."
|
||
}
|
||
},
|
||
"required": ["kind"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For ratio metrics: denominator source."
|
||
},
|
||
"denominator_outlier_handling": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"ignore_zeros": {
|
||
"anyOf": [
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"lower_bound_percentile": {
|
||
"anyOf": [
|
||
{
|
||
"maximum": 1,
|
||
"minimum": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Winsorization lower percentile bound, as a fraction in [0, 1] (e.g. 0.01 for the 1st percentile)."
|
||
},
|
||
"upper_bound_percentile": {
|
||
"anyOf": [
|
||
{
|
||
"maximum": 1,
|
||
"minimum": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Winsorization upper percentile bound, as a fraction in [0, 1] (e.g. 0.99 for the 99th percentile)."
|
||
}
|
||
},
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For ratio metrics: winsorization applied to the denominator aggregate. Leave unset for a binomial-style denominator, which is never clamped."
|
||
},
|
||
"goal": {
|
||
"anyOf": [
|
||
{
|
||
"enum": ["increase", "decrease"],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Whether higher or lower values indicate success."
|
||
},
|
||
"ignore_zeros": {
|
||
"anyOf": [
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For mean metrics: exclude zero values when computing the winsorization percentile thresholds."
|
||
},
|
||
"kind": {
|
||
"const": "ExperimentMetric",
|
||
"default": "ExperimentMetric",
|
||
"type": "string"
|
||
},
|
||
"lower_bound_percentile": {
|
||
"anyOf": [
|
||
{
|
||
"maximum": 1,
|
||
"minimum": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For mean metrics: winsorization lower percentile bound, as a fraction in [0, 1] (e.g. 0.01 for the 1st percentile). Per-user values below this percentile are clamped to it before aggregation."
|
||
},
|
||
"metric_type": {
|
||
"enum": ["funnel", "mean", "ratio", "retention"],
|
||
"type": "string"
|
||
},
|
||
"name": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Human-readable metric name."
|
||
},
|
||
"numerator": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"event": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event name, e.g. '$pageview'. Required for EventsNode."
|
||
},
|
||
"id": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Action ID. Required for ActionsNode."
|
||
},
|
||
"kind": {
|
||
"enum": ["EventsNode", "ActionsNode"],
|
||
"type": "string"
|
||
},
|
||
"math": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"total",
|
||
"sum",
|
||
"unique_session",
|
||
"min",
|
||
"max",
|
||
"avg",
|
||
"dau",
|
||
"unique_group",
|
||
"insightsql"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "How to aggregate this source. Defaults to 'total' (event count). Use 'sum' together with math_property to aggregate a numeric property — e.g. a ratio numerator of revenue per order. Other options: 'avg', 'min', 'max', 'unique_session', 'dau', 'unique_group', 'insightsql'."
|
||
},
|
||
"math_group_type_index": {
|
||
"anyOf": [
|
||
{
|
||
"anyOf": [
|
||
{
|
||
"const": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 1,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 2,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 3,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 4,
|
||
"type": "number"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Group type index to aggregate over. Required when math is 'unique_group'."
|
||
},
|
||
"math_insightsql": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "InsightsQL aggregation expression. Required when math is 'insightsql' — without it the metric silently falls back to a plain count/sum."
|
||
},
|
||
"math_property": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Numeric event property to aggregate when math is 'sum', 'avg', 'min', or 'max' (e.g. 'revenue')."
|
||
},
|
||
"properties": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"default": "exact"
|
||
},
|
||
"type": {
|
||
"const": "event",
|
||
"default": "event",
|
||
"description": "Event properties",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event property filters to narrow which events are counted."
|
||
}
|
||
},
|
||
"required": ["kind"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For ratio metrics: numerator source."
|
||
},
|
||
"numerator_outlier_handling": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"ignore_zeros": {
|
||
"anyOf": [
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"lower_bound_percentile": {
|
||
"anyOf": [
|
||
{
|
||
"maximum": 1,
|
||
"minimum": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Winsorization lower percentile bound, as a fraction in [0, 1] (e.g. 0.01 for the 1st percentile)."
|
||
},
|
||
"upper_bound_percentile": {
|
||
"anyOf": [
|
||
{
|
||
"maximum": 1,
|
||
"minimum": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Winsorization upper percentile bound, as a fraction in [0, 1] (e.g. 0.99 for the 99th percentile)."
|
||
}
|
||
},
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For ratio metrics: winsorization applied to the numerator aggregate, independently of the denominator and each with its own percentile thresholds."
|
||
},
|
||
"retention_window_end": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"retention_window_start": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"retention_window_unit": {
|
||
"anyOf": [
|
||
{
|
||
"enum": ["second", "minute", "hour", "day", "week", "month"],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"series": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"properties": {
|
||
"event": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event name, e.g. '$pageview'. Required for EventsNode."
|
||
},
|
||
"id": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Action ID. Required for ActionsNode."
|
||
},
|
||
"kind": {
|
||
"enum": ["EventsNode", "ActionsNode"],
|
||
"type": "string"
|
||
},
|
||
"math": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"total",
|
||
"sum",
|
||
"unique_session",
|
||
"min",
|
||
"max",
|
||
"avg",
|
||
"dau",
|
||
"unique_group",
|
||
"insightsql"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "How to aggregate this source. Defaults to 'total' (event count). Use 'sum' together with math_property to aggregate a numeric property — e.g. a ratio numerator of revenue per order. Other options: 'avg', 'min', 'max', 'unique_session', 'dau', 'unique_group', 'insightsql'."
|
||
},
|
||
"math_group_type_index": {
|
||
"anyOf": [
|
||
{
|
||
"anyOf": [
|
||
{
|
||
"const": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 1,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 2,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 3,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 4,
|
||
"type": "number"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Group type index to aggregate over. Required when math is 'unique_group'."
|
||
},
|
||
"math_insightsql": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "InsightsQL aggregation expression. Required when math is 'insightsql' — without it the metric silently falls back to a plain count/sum."
|
||
},
|
||
"math_property": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Numeric event property to aggregate when math is 'sum', 'avg', 'min', or 'max' (e.g. 'revenue')."
|
||
},
|
||
"properties": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"default": "exact"
|
||
},
|
||
"type": {
|
||
"const": "event",
|
||
"default": "event",
|
||
"description": "Event properties",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event property filters to narrow which events are counted."
|
||
}
|
||
},
|
||
"required": ["kind"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For funnel metrics: array of EventsNode/ActionsNode steps."
|
||
},
|
||
"source": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"event": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event name, e.g. '$pageview'. Required for EventsNode."
|
||
},
|
||
"id": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Action ID. Required for ActionsNode."
|
||
},
|
||
"kind": {
|
||
"enum": ["EventsNode", "ActionsNode"],
|
||
"type": "string"
|
||
},
|
||
"math": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"total",
|
||
"sum",
|
||
"unique_session",
|
||
"min",
|
||
"max",
|
||
"avg",
|
||
"dau",
|
||
"unique_group",
|
||
"insightsql"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "How to aggregate this source. Defaults to 'total' (event count). Use 'sum' together with math_property to aggregate a numeric property — e.g. a ratio numerator of revenue per order. Other options: 'avg', 'min', 'max', 'unique_session', 'dau', 'unique_group', 'insightsql'."
|
||
},
|
||
"math_group_type_index": {
|
||
"anyOf": [
|
||
{
|
||
"anyOf": [
|
||
{
|
||
"const": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 1,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 2,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 3,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 4,
|
||
"type": "number"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Group type index to aggregate over. Required when math is 'unique_group'."
|
||
},
|
||
"math_insightsql": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "InsightsQL aggregation expression. Required when math is 'insightsql' — without it the metric silently falls back to a plain count/sum."
|
||
},
|
||
"math_property": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Numeric event property to aggregate when math is 'sum', 'avg', 'min', or 'max' (e.g. 'revenue')."
|
||
},
|
||
"properties": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"default": "exact"
|
||
},
|
||
"type": {
|
||
"const": "event",
|
||
"default": "event",
|
||
"description": "Event properties",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event property filters to narrow which events are counted."
|
||
}
|
||
},
|
||
"required": ["kind"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For mean metrics: event source."
|
||
},
|
||
"start_event": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"event": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event name, e.g. '$pageview'. Required for EventsNode."
|
||
},
|
||
"id": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Action ID. Required for ActionsNode."
|
||
},
|
||
"kind": {
|
||
"enum": ["EventsNode", "ActionsNode"],
|
||
"type": "string"
|
||
},
|
||
"math": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"total",
|
||
"sum",
|
||
"unique_session",
|
||
"min",
|
||
"max",
|
||
"avg",
|
||
"dau",
|
||
"unique_group",
|
||
"insightsql"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "How to aggregate this source. Defaults to 'total' (event count). Use 'sum' together with math_property to aggregate a numeric property — e.g. a ratio numerator of revenue per order. Other options: 'avg', 'min', 'max', 'unique_session', 'dau', 'unique_group', 'insightsql'."
|
||
},
|
||
"math_group_type_index": {
|
||
"anyOf": [
|
||
{
|
||
"anyOf": [
|
||
{
|
||
"const": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 1,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 2,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 3,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"const": 4,
|
||
"type": "number"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Group type index to aggregate over. Required when math is 'unique_group'."
|
||
},
|
||
"math_insightsql": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "InsightsQL aggregation expression. Required when math is 'insightsql' — without it the metric silently falls back to a plain count/sum."
|
||
},
|
||
"math_property": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Numeric event property to aggregate when math is 'sum', 'avg', 'min', or 'max' (e.g. 'revenue')."
|
||
},
|
||
"properties": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"properties": {
|
||
"key": {
|
||
"type": "string"
|
||
},
|
||
"label": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"operator": {
|
||
"anyOf": [
|
||
{
|
||
"enum": [
|
||
"exact",
|
||
"is_not",
|
||
"icontains",
|
||
"not_icontains",
|
||
"starts_with",
|
||
"not_starts_with",
|
||
"ends_with",
|
||
"not_ends_with",
|
||
"regex",
|
||
"not_regex",
|
||
"gt",
|
||
"gte",
|
||
"lt",
|
||
"lte",
|
||
"is_set",
|
||
"is_not_set",
|
||
"is_date_exact",
|
||
"is_date_before",
|
||
"is_date_after",
|
||
"between",
|
||
"not_between",
|
||
"min",
|
||
"max",
|
||
"in",
|
||
"not_in",
|
||
"is_cleaned_path_exact",
|
||
"flag_evaluates_to",
|
||
"semver_eq",
|
||
"semver_neq",
|
||
"semver_gt",
|
||
"semver_gte",
|
||
"semver_lt",
|
||
"semver_lte",
|
||
"semver_tilde",
|
||
"semver_caret",
|
||
"semver_wildcard",
|
||
"icontains_multi",
|
||
"not_icontains_multi"
|
||
],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"default": "exact"
|
||
},
|
||
"type": {
|
||
"const": "event",
|
||
"default": "event",
|
||
"description": "Event properties",
|
||
"type": "string"
|
||
},
|
||
"value": {
|
||
"anyOf": [
|
||
{
|
||
"items": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
}
|
||
]
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "boolean"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
}
|
||
},
|
||
"required": ["key"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Event property filters to narrow which events are counted."
|
||
}
|
||
},
|
||
"required": ["kind"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For retention metrics: start event."
|
||
},
|
||
"start_handling": {
|
||
"anyOf": [
|
||
{
|
||
"enum": ["first_seen", "last_seen"],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
]
|
||
},
|
||
"threshold": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For mean metrics: when set, reports the percentage of users whose per-user summed/counted value reaches or exceeds this threshold. Only meaningful for sum/count math types."
|
||
},
|
||
"upper_bound_percentile": {
|
||
"anyOf": [
|
||
{
|
||
"maximum": 1,
|
||
"minimum": 0,
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "For mean metrics: winsorization upper percentile bound, as a fraction in [0, 1] (e.g. 0.99 for the 99th percentile). Per-user values above this percentile are clamped to it before aggregation."
|
||
},
|
||
"uuid": {
|
||
"anyOf": [
|
||
{
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Unique identifier. Auto-generated if omitted."
|
||
}
|
||
},
|
||
"required": ["metric_type"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Secondary metrics for additional measurements. Same format as primary metrics."
|
||
},
|
||
"name": {
|
||
"description": "Name of the experiment.",
|
||
"maxLength": 400,
|
||
"type": "string"
|
||
},
|
||
"parameters": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"minimum_detectable_effect": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Minimum detectable effect as a percentage. Lower values need more users but catch smaller changes. Suggest 20–30% for most experiments."
|
||
},
|
||
"variant_notes": {
|
||
"anyOf": [
|
||
{
|
||
"additionalProperties": {
|
||
"type": "string"
|
||
},
|
||
"propertyNames": {
|
||
"type": "string"
|
||
},
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Free-text notes per variant, keyed by variant key. Use to document what each variant does or its reroute URL."
|
||
}
|
||
},
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Experiment parameters JSON. Supported keys include `custom_exposure_filter` and `variant_notes` (free-text notes per variant, keyed by variant key). Flag config (variants, rollout, aggregation, payloads, experience continuity) belongs on the `feature_flag` object; send it there. For backward compatibility, config still sent through these deprecated keys is copied onto the linked flag rather than rejected, and reads project the flag's current config back into this field. Excluded variants live on the top-level `excluded_variants` field, not here."
|
||
},
|
||
"running_time_calculation": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"exposure_estimate_config": {
|
||
"anyOf": [
|
||
{
|
||
"properties": {
|
||
"conversionRateInputType": {
|
||
"description": "'manual' when the baseline value and exposure rate were entered by hand, 'automatic' when derived from live experiment data.",
|
||
"enum": ["manual", "automatic"],
|
||
"type": "string"
|
||
},
|
||
"manualBaselineValue": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Manually entered baseline metric value (a conversion percentage for funnel metrics). Only used in manual mode."
|
||
},
|
||
"manualExposureRate": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Manually entered estimate of users exposed to the experiment per day. Only used in manual mode."
|
||
},
|
||
"manualMetricType": {
|
||
"anyOf": [
|
||
{
|
||
"enum": ["funnel", "mean_count", "mean_sum_or_avg"],
|
||
"type": "string"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Metric type the manual baseline value refers to. Only used in manual mode."
|
||
}
|
||
},
|
||
"required": ["conversionRateInputType"],
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "How the exposure estimate is configured: manual user-entered values or automatic from live experiment data."
|
||
},
|
||
"minimum_detectable_effect": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Minimum detectable effect as a percentage. Lower values need more users but catch smaller changes."
|
||
},
|
||
"recommended_running_time": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Estimated number of days needed to reach the recommended sample size."
|
||
},
|
||
"recommended_sample_size": {
|
||
"anyOf": [
|
||
{
|
||
"type": "number"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Recommended number of exposed users needed for statistical significance."
|
||
}
|
||
},
|
||
"type": "object"
|
||
},
|
||
{
|
||
"type": "null"
|
||
}
|
||
],
|
||
"description": "Persist a running-time / sample-size plan onto the experiment (the planning target shown in the experiment's running-time panel). Object with optional keys: minimum_detectable_effect (percentage, e.g. 20 for a 20% lift), recommended_sample_size (total across all variants), recommended_running_time (days), and exposure_estimate_config."
|
||
},
|
||
"saved_metrics_ids": {
|
||
"description": "The complete desired set of shared (saved) metrics for the experiment — this REPLACES all existing saved-metric links, it does not append. To add or remove one, first read the experiment's current saved_metrics via experiment-get and resend the full set. Pass an empty array to detach all shared metrics.",
|
||
"items": {
|
||
"properties": {
|
||
"id": {
|
||
"description": "ID of an existing shared/saved metric. Discover IDs with experiment-saved-metrics-list.",
|
||
"maximum": 9007199254740991,
|
||
"minimum": -9007199254740991,
|
||
"type": "integer"
|
||
},
|
||
"metadata": {
|
||
"description": "Optional per-link metadata. Omit to default this metric to primary.",
|
||
"properties": {
|
||
"type": {
|
||
"description": "Whether this metric is a primary or secondary metric on the experiment.",
|
||
"enum": ["primary", "secondary"],
|
||
"type": "string"
|
||
}
|
||
},
|
||
"required": ["type"],
|
||
"type": "object"
|
||
}
|
||
},
|
||
"required": ["id"],
|
||
"type": "object"
|
||
},
|
||
"type": "array"
|
||
},
|
||
"stats_config": {},
|
||
"update_feature_flag_params": {
|
||
"description": "When true, sync the flag config sent in this request (via the `feature_flag` object) to the linked feature flag. Draft experiments always sync regardless. On a running experiment, `feature_flag` config without this flag is rejected.",
|
||
"type": "boolean"
|
||
}
|
||
},
|
||
"required": ["id"],
|
||
"type": "object"
|
||
}
|