Skip to main content

Webhooks Events

We currently support the following event types:

Event nameDescription
feature.createdTriggered when a feature is created
feature.updatedTriggered when a feature is updated
feature.deletedTriggered when a feature is deleted
feature.saferollout.shipTriggered when a safe rollout is completed and safe to rollout to 100%.
feature.saferollout.rollbackTriggered when a safe rollout has a failing guardrail and should be reverted.
feature.saferollout.unhealthyTriggered when a safe rollout is failing a health check and may not be working as expected.
feature.rampSchedule.createdTriggered when a ramp schedule is created for a feature
feature.rampSchedule.deletedTriggered when a ramp schedule is deleted from a feature
feature.rampSchedule.actions.startedTriggered when a feature ramp schedule starts
feature.rampSchedule.actions.completedTriggered when a feature ramp schedule completes all steps
feature.rampSchedule.actions.rolledBackTriggered when a feature ramp schedule is rolled back or reset to start
feature.rampSchedule.actions.jumpedTriggered when a feature ramp schedule is jumped to a specific step
feature.rampSchedule.actions.step.advancedTriggered when a feature ramp schedule advances to the next step
feature.rampSchedule.actions.step.approvalRequiredTriggered when a feature ramp step is waiting for approval
experiment.createdTriggered when an experiment is created
experiment.updatedTriggered when an experiment is updated
experiment.deletedTriggered when an experiment is deleted
experiment.warningTriggered when a warning condition is detected on an experiment
experiment.info.significanceTriggered when a goal or guardrail metric reaches significance in an experiment (e.g. either above 95% or below 5% chance to win). Be careful using this without Sequential Testing as it can lead to peeking problems.
experiment.decision.shipTriggered when an experiment is ready to ship a variation.
experiment.decision.rollbackTriggered when an experiment should be rolled back to the control.
experiment.decision.reviewTriggered when an experiment has reached the desired power point, but the results may be ambiguous.
user.loginTriggered when a user logs in

feature.created

Triggered when a feature is created

Payload
{
event: "feature.created";
object: "feature";
api_version: string;
created: number;
data: {
object: {
id: string;
dateCreated: string;
dateUpdated: string;
archived: boolean;
description: string;
/** The userId of the owner (or raw owner name/email for legacy records) */
owner: string;
project: string;
valueType: "boolean" | "string" | "number" | "json";
defaultValue: string;
tags: string[];
environments: Record<string, {
enabled: boolean;
defaultValue: string;
rules: (({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "force";
value: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "rollout";
value: string;
coverage: number;
hashAttribute: string;
/** Optional seed for the hash function; defaults to the rule id */
seed?: string | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment";
trackingKey?: string | undefined;
hashAttribute?: string | undefined;
fallbackAttribute?: string | undefined;
disableStickyBucketing?: boolean | undefined;
bucketVersion?: number | undefined;
minBucketVersion?: number | undefined;
namespace?: {
enabled: boolean;
name: string;
range: number[];
} | undefined;
coverage?: number | undefined;
/** Variation values with weights */
value?: {
value: string;
weight: number;
name?: string | undefined;
}[] | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment-ref";
variations: {
value: string;
variationId: string;
}[];
experimentId: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "safe-rollout";
controlValue: string;
variationValue: string;
seed?: string | undefined;
hashAttribute?: string | undefined;
trackingKey?: string | undefined;
safeRolloutId?: string | undefined;
status?: ("running" | "released" | "rolled-back" | "stopped") | undefined;
}))[];
/** A JSON stringified [FeatureDefinition](#tag/FeatureDefinition_model) */
definition?: string | undefined;
draft?: {
enabled: boolean;
defaultValue: string;
rules: (({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "force";
value: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "rollout";
value: string;
coverage: number;
hashAttribute: string;
/** Optional seed for the hash function; defaults to the rule id */
seed?: string | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment";
trackingKey?: string | undefined;
hashAttribute?: string | undefined;
fallbackAttribute?: string | undefined;
disableStickyBucketing?: boolean | undefined;
bucketVersion?: number | undefined;
minBucketVersion?: number | undefined;
namespace?: {
enabled: boolean;
name: string;
range: number[];
} | undefined;
coverage?: number | undefined;
/** Variation values with weights */
value?: {
value: string;
weight: number;
name?: string | undefined;
}[] | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment-ref";
variations: {
value: string;
variationId: string;
}[];
experimentId: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "safe-rollout";
controlValue: string;
variationValue: string;
seed?: string | undefined;
hashAttribute?: string | undefined;
trackingKey?: string | undefined;
safeRolloutId?: string | undefined;
status?: ("running" | "released" | "rolled-back" | "stopped") | undefined;
}))[];
/** A JSON stringified [FeatureDefinition](#tag/FeatureDefinition_model) */
definition?: string | undefined;
} | undefined;
}>;
/** Feature IDs. Each feature must evaluate to `true` */
prerequisites?: string[] | undefined;
revision: {
version: number;
comment: string;
date: string;
createdBy: string;
publishedBy: string;
};
customFields?: Record<string, any> | undefined;
holdout?: ({
/** Holdout ID */
id: string;
/** The feature value assigned to users in the holdout treatment group */
value: string;
} | null) | undefined;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

feature.updated

Triggered when a feature is updated

Payload
{
event: "feature.updated";
object: "feature";
api_version: string;
created: number;
data: {
object: {
id: string;
dateCreated: string;
dateUpdated: string;
archived: boolean;
description: string;
/** The userId of the owner (or raw owner name/email for legacy records) */
owner: string;
project: string;
valueType: "boolean" | "string" | "number" | "json";
defaultValue: string;
tags: string[];
environments: Record<string, {
enabled: boolean;
defaultValue: string;
rules: (({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "force";
value: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "rollout";
value: string;
coverage: number;
hashAttribute: string;
/** Optional seed for the hash function; defaults to the rule id */
seed?: string | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment";
trackingKey?: string | undefined;
hashAttribute?: string | undefined;
fallbackAttribute?: string | undefined;
disableStickyBucketing?: boolean | undefined;
bucketVersion?: number | undefined;
minBucketVersion?: number | undefined;
namespace?: {
enabled: boolean;
name: string;
range: number[];
} | undefined;
coverage?: number | undefined;
/** Variation values with weights */
value?: {
value: string;
weight: number;
name?: string | undefined;
}[] | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment-ref";
variations: {
value: string;
variationId: string;
}[];
experimentId: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "safe-rollout";
controlValue: string;
variationValue: string;
seed?: string | undefined;
hashAttribute?: string | undefined;
trackingKey?: string | undefined;
safeRolloutId?: string | undefined;
status?: ("running" | "released" | "rolled-back" | "stopped") | undefined;
}))[];
/** A JSON stringified [FeatureDefinition](#tag/FeatureDefinition_model) */
definition?: string | undefined;
draft?: {
enabled: boolean;
defaultValue: string;
rules: (({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "force";
value: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "rollout";
value: string;
coverage: number;
hashAttribute: string;
/** Optional seed for the hash function; defaults to the rule id */
seed?: string | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment";
trackingKey?: string | undefined;
hashAttribute?: string | undefined;
fallbackAttribute?: string | undefined;
disableStickyBucketing?: boolean | undefined;
bucketVersion?: number | undefined;
minBucketVersion?: number | undefined;
namespace?: {
enabled: boolean;
name: string;
range: number[];
} | undefined;
coverage?: number | undefined;
/** Variation values with weights */
value?: {
value: string;
weight: number;
name?: string | undefined;
}[] | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment-ref";
variations: {
value: string;
variationId: string;
}[];
experimentId: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "safe-rollout";
controlValue: string;
variationValue: string;
seed?: string | undefined;
hashAttribute?: string | undefined;
trackingKey?: string | undefined;
safeRolloutId?: string | undefined;
status?: ("running" | "released" | "rolled-back" | "stopped") | undefined;
}))[];
/** A JSON stringified [FeatureDefinition](#tag/FeatureDefinition_model) */
definition?: string | undefined;
} | undefined;
}>;
/** Feature IDs. Each feature must evaluate to `true` */
prerequisites?: string[] | undefined;
revision: {
version: number;
comment: string;
date: string;
createdBy: string;
publishedBy: string;
};
customFields?: Record<string, any> | undefined;
holdout?: ({
/** Holdout ID */
id: string;
/** The feature value assigned to users in the holdout treatment group */
value: string;
} | null) | undefined;
};
previous_attributes: {
id?: string | undefined;
dateCreated?: string | undefined;
dateUpdated?: string | undefined;
archived?: boolean | undefined;
description?: string | undefined;
/** The userId of the owner (or raw owner name/email for legacy records) */
owner?: string | undefined;
project?: string | undefined;
valueType?: ("boolean" | "string" | "number" | "json") | undefined;
defaultValue?: string | undefined;
tags?: string[] | undefined;
environments?: Record<string, {
enabled: boolean;
defaultValue: string;
rules: (({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "force";
value: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "rollout";
value: string;
coverage: number;
hashAttribute: string;
/** Optional seed for the hash function; defaults to the rule id */
seed?: string | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment";
trackingKey?: string | undefined;
hashAttribute?: string | undefined;
fallbackAttribute?: string | undefined;
disableStickyBucketing?: boolean | undefined;
bucketVersion?: number | undefined;
minBucketVersion?: number | undefined;
namespace?: {
enabled: boolean;
name: string;
range: number[];
} | undefined;
coverage?: number | undefined;
/** Variation values with weights */
value?: {
value: string;
weight: number;
name?: string | undefined;
}[] | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment-ref";
variations: {
value: string;
variationId: string;
}[];
experimentId: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "safe-rollout";
controlValue: string;
variationValue: string;
seed?: string | undefined;
hashAttribute?: string | undefined;
trackingKey?: string | undefined;
safeRolloutId?: string | undefined;
status?: ("running" | "released" | "rolled-back" | "stopped") | undefined;
}))[];
/** A JSON stringified [FeatureDefinition](#tag/FeatureDefinition_model) */
definition?: string | undefined;
draft?: {
enabled: boolean;
defaultValue: string;
rules: (({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "force";
value: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "rollout";
value: string;
coverage: number;
hashAttribute: string;
/** Optional seed for the hash function; defaults to the rule id */
seed?: string | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment";
trackingKey?: string | undefined;
hashAttribute?: string | undefined;
fallbackAttribute?: string | undefined;
disableStickyBucketing?: boolean | undefined;
bucketVersion?: number | undefined;
minBucketVersion?: number | undefined;
namespace?: {
enabled: boolean;
name: string;
range: number[];
} | undefined;
coverage?: number | undefined;
/** Variation values with weights */
value?: {
value: string;
weight: number;
name?: string | undefined;
}[] | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment-ref";
variations: {
value: string;
variationId: string;
}[];
experimentId: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "safe-rollout";
controlValue: string;
variationValue: string;
seed?: string | undefined;
hashAttribute?: string | undefined;
trackingKey?: string | undefined;
safeRolloutId?: string | undefined;
status?: ("running" | "released" | "rolled-back" | "stopped") | undefined;
}))[];
/** A JSON stringified [FeatureDefinition](#tag/FeatureDefinition_model) */
definition?: string | undefined;
} | undefined;
}> | undefined;
/** Feature IDs. Each feature must evaluate to `true` */
prerequisites?: string[] | undefined;
revision?: {
version: number;
comment: string;
date: string;
createdBy: string;
publishedBy: string;
} | undefined;
customFields?: Record<string, any> | undefined;
holdout?: ({
/** Holdout ID */
id: string;
/** The feature value assigned to users in the holdout treatment group */
value: string;
} | null) | undefined;
};
changes?: {
added: Record<string, unknown>;
removed: Record<string, unknown>;
modified: Record<string, unknown>;
} | undefined;
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

feature.deleted

Triggered when a feature is deleted

Payload
{
event: "feature.deleted";
object: "feature";
api_version: string;
created: number;
data: {
object: {
id: string;
dateCreated: string;
dateUpdated: string;
archived: boolean;
description: string;
/** The userId of the owner (or raw owner name/email for legacy records) */
owner: string;
project: string;
valueType: "boolean" | "string" | "number" | "json";
defaultValue: string;
tags: string[];
environments: Record<string, {
enabled: boolean;
defaultValue: string;
rules: (({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "force";
value: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "rollout";
value: string;
coverage: number;
hashAttribute: string;
/** Optional seed for the hash function; defaults to the rule id */
seed?: string | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment";
trackingKey?: string | undefined;
hashAttribute?: string | undefined;
fallbackAttribute?: string | undefined;
disableStickyBucketing?: boolean | undefined;
bucketVersion?: number | undefined;
minBucketVersion?: number | undefined;
namespace?: {
enabled: boolean;
name: string;
range: number[];
} | undefined;
coverage?: number | undefined;
/** Variation values with weights */
value?: {
value: string;
weight: number;
name?: string | undefined;
}[] | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment-ref";
variations: {
value: string;
variationId: string;
}[];
experimentId: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "safe-rollout";
controlValue: string;
variationValue: string;
seed?: string | undefined;
hashAttribute?: string | undefined;
trackingKey?: string | undefined;
safeRolloutId?: string | undefined;
status?: ("running" | "released" | "rolled-back" | "stopped") | undefined;
}))[];
/** A JSON stringified [FeatureDefinition](#tag/FeatureDefinition_model) */
definition?: string | undefined;
draft?: {
enabled: boolean;
defaultValue: string;
rules: (({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "force";
value: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "rollout";
value: string;
coverage: number;
hashAttribute: string;
/** Optional seed for the hash function; defaults to the rule id */
seed?: string | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment";
trackingKey?: string | undefined;
hashAttribute?: string | undefined;
fallbackAttribute?: string | undefined;
disableStickyBucketing?: boolean | undefined;
bucketVersion?: number | undefined;
minBucketVersion?: number | undefined;
namespace?: {
enabled: boolean;
name: string;
range: number[];
} | undefined;
coverage?: number | undefined;
/** Variation values with weights */
value?: {
value: string;
weight: number;
name?: string | undefined;
}[] | undefined;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "experiment-ref";
variations: {
value: string;
variationId: string;
}[];
experimentId: string;
}) | ({
description: string;
condition?: string | undefined;
id: string;
enabled: boolean;
/** Simple time-based on/off schedule for this rule */
scheduleRules?: {
/** Whether the rule should be enabled or disabled at the specified timestamp. */
enabled: boolean;
/** ISO timestamp when the rule should activate. */
timestamp: string | null;
}[] | undefined;
/**
* UI hint for which scheduling mode is active:
* - `none` – no schedule
* - `schedule` – simple time-based enable/disable via `scheduleRules`
* - `ramp` – multi-step ramp-up controlled by an associated RampSchedule document
*/
scheduleType?: ("none" | "schedule" | "ramp") | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
prerequisites?: {
/** Feature ID of the prerequisite */
id: string;
condition: string;
}[] | undefined;
} & {
type: "safe-rollout";
controlValue: string;
variationValue: string;
seed?: string | undefined;
hashAttribute?: string | undefined;
trackingKey?: string | undefined;
safeRolloutId?: string | undefined;
status?: ("running" | "released" | "rolled-back" | "stopped") | undefined;
}))[];
/** A JSON stringified [FeatureDefinition](#tag/FeatureDefinition_model) */
definition?: string | undefined;
} | undefined;
}>;
/** Feature IDs. Each feature must evaluate to `true` */
prerequisites?: string[] | undefined;
revision: {
version: number;
comment: string;
date: string;
createdBy: string;
publishedBy: string;
};
customFields?: Record<string, any> | undefined;
holdout?: ({
/** Holdout ID */
id: string;
/** The feature value assigned to users in the holdout treatment group */
value: string;
} | null) | undefined;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

feature.saferollout.ship

Triggered when a safe rollout is completed and safe to rollout to 100%.

Payload
{
event: "feature.saferollout.ship";
object: "feature";
api_version: string;
created: number;
data: {
object: {
featureId: string;
safeRolloutId: string;
environment: string;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

feature.saferollout.rollback

Triggered when a safe rollout has a failing guardrail and should be reverted.

Payload
{
event: "feature.saferollout.rollback";
object: "feature";
api_version: string;
created: number;
data: {
object: {
featureId: string;
safeRolloutId: string;
environment: string;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

feature.saferollout.unhealthy

Triggered when a safe rollout is failing a health check and may not be working as expected.

Payload
{
event: "feature.saferollout.unhealthy";
object: "feature";
api_version: string;
created: number;
data: {
object: {
featureId: string;
safeRolloutId: string;
environment: string;
unhealthyReason: ("srm" | "multipleExposures")[];
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

feature.rampSchedule.created

Triggered when a ramp schedule is created for a feature

Payload
{
event: "feature.rampSchedule.created";
object: "feature";
api_version: string;
created: number;
data: {
object: {
rampScheduleId: string;
rampName: string;
orgId: string;
entityType: string;
entityId: string;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

feature.rampSchedule.deleted

Triggered when a ramp schedule is deleted from a feature

Payload
{
event: "feature.rampSchedule.deleted";
object: "feature";
api_version: string;
created: number;
data: {
object: {
rampScheduleId: string;
rampName: string;
orgId: string;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

feature.rampSchedule.actions.started

Triggered when a feature ramp schedule starts

Payload
{
event: "feature.rampSchedule.actions.started";
object: "feature";
api_version: string;
created: number;
data: {
object: {
rampScheduleId: string;
rampName: string;
orgId: string;
currentStepIndex: number;
status: string;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

feature.rampSchedule.actions.completed

Triggered when a feature ramp schedule completes all steps

Payload
{
event: "feature.rampSchedule.actions.completed";
object: "feature";
api_version: string;
created: number;
data: {
object: {
rampScheduleId: string;
rampName: string;
orgId: string;
currentStepIndex: number;
status: string;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

feature.rampSchedule.actions.rolledBack

Triggered when a feature ramp schedule is rolled back or reset to start

Payload
{
event: "feature.rampSchedule.actions.rolledBack";
object: "feature";
api_version: string;
created: number;
data: {
object: {
rampScheduleId: string;
rampName: string;
orgId: string;
currentStepIndex: number;
status: string;
targetStepIndex: number;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

feature.rampSchedule.actions.jumped

Triggered when a feature ramp schedule is jumped to a specific step

Payload
{
event: "feature.rampSchedule.actions.jumped";
object: "feature";
api_version: string;
created: number;
data: {
object: {
rampScheduleId: string;
rampName: string;
orgId: string;
currentStepIndex: number;
status: string;
targetStepIndex: number;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

feature.rampSchedule.actions.step.advanced

Triggered when a feature ramp schedule advances to the next step

Payload
{
event: "feature.rampSchedule.actions.step.advanced";
object: "feature";
api_version: string;
created: number;
data: {
object: {
rampScheduleId: string;
rampName: string;
orgId: string;
currentStepIndex: number;
status: string;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

feature.rampSchedule.actions.step.approvalRequired

Triggered when a feature ramp step is waiting for approval

Payload
{
event: "feature.rampSchedule.actions.step.approvalRequired";
object: "feature";
api_version: string;
created: number;
data: {
object: {
rampScheduleId: string;
rampName: string;
orgId: string;
currentStepIndex: number;
status: string;
approvalNotes?: (string | null) | undefined;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

experiment.created

Triggered when an experiment is created

Payload
{
event: "experiment.created";
object: "experiment";
api_version: string;
created: number;
data: {
object: {
id: string;
trackingKey: string;
dateCreated: string;
dateUpdated: string;
name: string;
type: "standard" | "multi-armed-bandit";
project: string;
hypothesis: string;
description: string;
tags: string[];
/** The userId of the owner (or raw owner name/email for legacy records) */
owner: string;
archived: boolean;
status: string;
autoRefresh: boolean;
hashAttribute: string;
fallbackAttribute?: string | undefined;
hashVersion: 1 | 2;
disableStickyBucketing?: boolean | undefined;
bucketVersion?: number | undefined;
minBucketVersion?: number | undefined;
variations: {
variationId: string;
key: string;
name: string;
description: string;
screenshots: string[];
}[];
phases: {
name: string;
dateStarted: string;
dateEnded: string;
reasonForStopping: string;
seed: string;
coverage: number;
trafficSplit: {
variationId: string;
weight: number;
}[];
namespace?: {
namespaceId: string;
range: number[];
} | undefined;
targetingCondition: string;
prerequisites?: {
id: string;
condition: string;
}[] | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
}[];
settings: {
datasourceId: string;
assignmentQueryId: string;
experimentId: string;
segmentId: string;
queryFilter: string;
inProgressConversions: "include" | "exclude";
/** Setting attribution model to `"experimentDuration"` is the same as selecting "Ignore Conversion Windows" for the Conversion Window Override. Setting it to `"lookbackOverride"` requires a `lookbackOverride` object to be provided. */
attributionModel: "firstExposure" | "experimentDuration" | "lookbackOverride";
/** Controls the lookback override for the experiment. For type "window", value must be a non-negative number and valueUnit is required. */
lookbackOverride?: {
type: "date" | "window";
/** For "window" type - non-negative numeric value (e.g. 7 for 7 days). For "date" type a date string. */
value: number | string;
/** Used when type is "window". Defaults to "days". */
valueUnit?: ("minutes" | "hours" | "days" | "weeks") | undefined;
} | undefined;
statsEngine: "bayesian" | "frequentist";
regressionAdjustmentEnabled?: boolean | undefined;
sequentialTestingEnabled?: boolean | undefined;
sequentialTestingTuningParameter?: number | undefined;
/** When null, the organization default is used. */
postStratificationEnabled?: (boolean | null) | undefined;
/** Controls the decision framework and metric overrides for the experiment. Replaces the entire stored object on update (does not patch individual fields). */
decisionFrameworkSettings?: {
decisionCriteriaId?: string | undefined;
decisionFrameworkMetricOverrides?: {
/** ID of the metric to override settings for. */
id: string;
/** The target relative MDE to use for the metric, expressed as proportions (e.g. use 0.1 for 10%). Must be greater than 0. */
targetMDE?: number | undefined;
}[] | undefined;
} | undefined;
/** Per-metric analysis overrides; also reflected in goals/secondaryMetrics/guardrails overrides when applicable. On create/update, this replaces the entire stored array (it does not patch individual entries). */
metricOverrides?: {
/** ID of the metric to override settings for. */
id: string;
windowType?: ("conversion" | "lookback" | "") | undefined;
windowHours?: number | undefined;
delayHours?: number | undefined;
/** Must be true for the override to take effect. If true, the other proper prior settings in this object will be used if present. */
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
/** Must be true for the override to take effect. If true, the other regression adjustment settings in this object will be used if present. */
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
}[] | undefined;
goals: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
}[];
secondaryMetrics: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
}[];
guardrails: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
}[];
activationMetric?: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
} | undefined;
};
resultSummary?: {
status: string;
winner: string;
conclusions: string;
releasedVariationId: string;
excludeFromPayload: boolean;
} | undefined;
shareLevel?: ("public" | "organization") | undefined;
publicUrl?: string | undefined;
banditScheduleValue?: number | undefined;
banditScheduleUnit?: ("days" | "hours") | undefined;
banditBurnInValue?: number | undefined;
banditBurnInUnit?: ("days" | "hours") | undefined;
banditConversionWindowValue?: number | undefined;
banditConversionWindowUnit?: ("days" | "hours") | undefined;
linkedFeatures?: string[] | undefined;
hasVisualChangesets?: boolean | undefined;
hasURLRedirects?: boolean | undefined;
customFields?: Record<string, any> | undefined;
/** Custom slices that apply to ALL applicable metrics in the experiment */
customMetricSlices?: {
slices: {
column: string;
levels: string[];
}[];
}[] | undefined;
/** ID of the default dashboard for this experiment. */
defaultDashboardId?: string | undefined;
templateId?: string | undefined;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

experiment.updated

Triggered when an experiment is updated

Payload
{
event: "experiment.updated";
object: "experiment";
api_version: string;
created: number;
data: {
object: {
id: string;
trackingKey: string;
dateCreated: string;
dateUpdated: string;
name: string;
type: "standard" | "multi-armed-bandit";
project: string;
hypothesis: string;
description: string;
tags: string[];
/** The userId of the owner (or raw owner name/email for legacy records) */
owner: string;
archived: boolean;
status: string;
autoRefresh: boolean;
hashAttribute: string;
fallbackAttribute?: string | undefined;
hashVersion: 1 | 2;
disableStickyBucketing?: boolean | undefined;
bucketVersion?: number | undefined;
minBucketVersion?: number | undefined;
variations: {
variationId: string;
key: string;
name: string;
description: string;
screenshots: string[];
}[];
phases: {
name: string;
dateStarted: string;
dateEnded: string;
reasonForStopping: string;
seed: string;
coverage: number;
trafficSplit: {
variationId: string;
weight: number;
}[];
namespace?: {
namespaceId: string;
range: number[];
} | undefined;
targetingCondition: string;
prerequisites?: {
id: string;
condition: string;
}[] | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
}[];
settings: {
datasourceId: string;
assignmentQueryId: string;
experimentId: string;
segmentId: string;
queryFilter: string;
inProgressConversions: "include" | "exclude";
/** Setting attribution model to `"experimentDuration"` is the same as selecting "Ignore Conversion Windows" for the Conversion Window Override. Setting it to `"lookbackOverride"` requires a `lookbackOverride` object to be provided. */
attributionModel: "firstExposure" | "experimentDuration" | "lookbackOverride";
/** Controls the lookback override for the experiment. For type "window", value must be a non-negative number and valueUnit is required. */
lookbackOverride?: {
type: "date" | "window";
/** For "window" type - non-negative numeric value (e.g. 7 for 7 days). For "date" type a date string. */
value: number | string;
/** Used when type is "window". Defaults to "days". */
valueUnit?: ("minutes" | "hours" | "days" | "weeks") | undefined;
} | undefined;
statsEngine: "bayesian" | "frequentist";
regressionAdjustmentEnabled?: boolean | undefined;
sequentialTestingEnabled?: boolean | undefined;
sequentialTestingTuningParameter?: number | undefined;
/** When null, the organization default is used. */
postStratificationEnabled?: (boolean | null) | undefined;
/** Controls the decision framework and metric overrides for the experiment. Replaces the entire stored object on update (does not patch individual fields). */
decisionFrameworkSettings?: {
decisionCriteriaId?: string | undefined;
decisionFrameworkMetricOverrides?: {
/** ID of the metric to override settings for. */
id: string;
/** The target relative MDE to use for the metric, expressed as proportions (e.g. use 0.1 for 10%). Must be greater than 0. */
targetMDE?: number | undefined;
}[] | undefined;
} | undefined;
/** Per-metric analysis overrides; also reflected in goals/secondaryMetrics/guardrails overrides when applicable. On create/update, this replaces the entire stored array (it does not patch individual entries). */
metricOverrides?: {
/** ID of the metric to override settings for. */
id: string;
windowType?: ("conversion" | "lookback" | "") | undefined;
windowHours?: number | undefined;
delayHours?: number | undefined;
/** Must be true for the override to take effect. If true, the other proper prior settings in this object will be used if present. */
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
/** Must be true for the override to take effect. If true, the other regression adjustment settings in this object will be used if present. */
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
}[] | undefined;
goals: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
}[];
secondaryMetrics: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
}[];
guardrails: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
}[];
activationMetric?: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
} | undefined;
};
resultSummary?: {
status: string;
winner: string;
conclusions: string;
releasedVariationId: string;
excludeFromPayload: boolean;
} | undefined;
shareLevel?: ("public" | "organization") | undefined;
publicUrl?: string | undefined;
banditScheduleValue?: number | undefined;
banditScheduleUnit?: ("days" | "hours") | undefined;
banditBurnInValue?: number | undefined;
banditBurnInUnit?: ("days" | "hours") | undefined;
banditConversionWindowValue?: number | undefined;
banditConversionWindowUnit?: ("days" | "hours") | undefined;
linkedFeatures?: string[] | undefined;
hasVisualChangesets?: boolean | undefined;
hasURLRedirects?: boolean | undefined;
customFields?: Record<string, any> | undefined;
/** Custom slices that apply to ALL applicable metrics in the experiment */
customMetricSlices?: {
slices: {
column: string;
levels: string[];
}[];
}[] | undefined;
/** ID of the default dashboard for this experiment. */
defaultDashboardId?: string | undefined;
templateId?: string | undefined;
};
previous_attributes: {
id?: string | undefined;
trackingKey?: string | undefined;
dateCreated?: string | undefined;
dateUpdated?: string | undefined;
name?: string | undefined;
type?: ("standard" | "multi-armed-bandit") | undefined;
project?: string | undefined;
hypothesis?: string | undefined;
description?: string | undefined;
tags?: string[] | undefined;
/** The userId of the owner (or raw owner name/email for legacy records) */
owner?: string | undefined;
archived?: boolean | undefined;
status?: string | undefined;
autoRefresh?: boolean | undefined;
hashAttribute?: string | undefined;
fallbackAttribute?: string | undefined;
hashVersion?: (1 | 2) | undefined;
disableStickyBucketing?: boolean | undefined;
bucketVersion?: number | undefined;
minBucketVersion?: number | undefined;
variations?: {
variationId: string;
key: string;
name: string;
description: string;
screenshots: string[];
}[] | undefined;
phases?: {
name: string;
dateStarted: string;
dateEnded: string;
reasonForStopping: string;
seed: string;
coverage: number;
trafficSplit: {
variationId: string;
weight: number;
}[];
namespace?: {
namespaceId: string;
range: number[];
} | undefined;
targetingCondition: string;
prerequisites?: {
id: string;
condition: string;
}[] | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
}[] | undefined;
settings?: {
datasourceId: string;
assignmentQueryId: string;
experimentId: string;
segmentId: string;
queryFilter: string;
inProgressConversions: "include" | "exclude";
/** Setting attribution model to `"experimentDuration"` is the same as selecting "Ignore Conversion Windows" for the Conversion Window Override. Setting it to `"lookbackOverride"` requires a `lookbackOverride` object to be provided. */
attributionModel: "firstExposure" | "experimentDuration" | "lookbackOverride";
/** Controls the lookback override for the experiment. For type "window", value must be a non-negative number and valueUnit is required. */
lookbackOverride?: {
type: "date" | "window";
/** For "window" type - non-negative numeric value (e.g. 7 for 7 days). For "date" type a date string. */
value: number | string;
/** Used when type is "window". Defaults to "days". */
valueUnit?: ("minutes" | "hours" | "days" | "weeks") | undefined;
} | undefined;
statsEngine: "bayesian" | "frequentist";
regressionAdjustmentEnabled?: boolean | undefined;
sequentialTestingEnabled?: boolean | undefined;
sequentialTestingTuningParameter?: number | undefined;
/** When null, the organization default is used. */
postStratificationEnabled?: (boolean | null) | undefined;
/** Controls the decision framework and metric overrides for the experiment. Replaces the entire stored object on update (does not patch individual fields). */
decisionFrameworkSettings?: {
decisionCriteriaId?: string | undefined;
decisionFrameworkMetricOverrides?: {
/** ID of the metric to override settings for. */
id: string;
/** The target relative MDE to use for the metric, expressed as proportions (e.g. use 0.1 for 10%). Must be greater than 0. */
targetMDE?: number | undefined;
}[] | undefined;
} | undefined;
/** Per-metric analysis overrides; also reflected in goals/secondaryMetrics/guardrails overrides when applicable. On create/update, this replaces the entire stored array (it does not patch individual entries). */
metricOverrides?: {
/** ID of the metric to override settings for. */
id: string;
windowType?: ("conversion" | "lookback" | "") | undefined;
windowHours?: number | undefined;
delayHours?: number | undefined;
/** Must be true for the override to take effect. If true, the other proper prior settings in this object will be used if present. */
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
/** Must be true for the override to take effect. If true, the other regression adjustment settings in this object will be used if present. */
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
}[] | undefined;
goals: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
}[];
secondaryMetrics: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
}[];
guardrails: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
}[];
activationMetric?: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
} | undefined;
} | undefined;
resultSummary?: {
status: string;
winner: string;
conclusions: string;
releasedVariationId: string;
excludeFromPayload: boolean;
} | undefined;
shareLevel?: ("public" | "organization") | undefined;
publicUrl?: string | undefined;
banditScheduleValue?: number | undefined;
banditScheduleUnit?: ("days" | "hours") | undefined;
banditBurnInValue?: number | undefined;
banditBurnInUnit?: ("days" | "hours") | undefined;
banditConversionWindowValue?: number | undefined;
banditConversionWindowUnit?: ("days" | "hours") | undefined;
linkedFeatures?: string[] | undefined;
hasVisualChangesets?: boolean | undefined;
hasURLRedirects?: boolean | undefined;
customFields?: Record<string, any> | undefined;
/** Custom slices that apply to ALL applicable metrics in the experiment */
customMetricSlices?: {
slices: {
column: string;
levels: string[];
}[];
}[] | undefined;
/** ID of the default dashboard for this experiment. */
defaultDashboardId?: string | undefined;
templateId?: string | undefined;
};
changes?: {
added: Record<string, unknown>;
removed: Record<string, unknown>;
modified: Record<string, unknown>;
} | undefined;
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

experiment.deleted

Triggered when an experiment is deleted

Payload
{
event: "experiment.deleted";
object: "experiment";
api_version: string;
created: number;
data: {
object: {
id: string;
trackingKey: string;
dateCreated: string;
dateUpdated: string;
name: string;
type: "standard" | "multi-armed-bandit";
project: string;
hypothesis: string;
description: string;
tags: string[];
/** The userId of the owner (or raw owner name/email for legacy records) */
owner: string;
archived: boolean;
status: string;
autoRefresh: boolean;
hashAttribute: string;
fallbackAttribute?: string | undefined;
hashVersion: 1 | 2;
disableStickyBucketing?: boolean | undefined;
bucketVersion?: number | undefined;
minBucketVersion?: number | undefined;
variations: {
variationId: string;
key: string;
name: string;
description: string;
screenshots: string[];
}[];
phases: {
name: string;
dateStarted: string;
dateEnded: string;
reasonForStopping: string;
seed: string;
coverage: number;
trafficSplit: {
variationId: string;
weight: number;
}[];
namespace?: {
namespaceId: string;
range: number[];
} | undefined;
targetingCondition: string;
prerequisites?: {
id: string;
condition: string;
}[] | undefined;
savedGroupTargeting?: {
matchType: "all" | "any" | "none";
savedGroups: string[];
}[] | undefined;
}[];
settings: {
datasourceId: string;
assignmentQueryId: string;
experimentId: string;
segmentId: string;
queryFilter: string;
inProgressConversions: "include" | "exclude";
/** Setting attribution model to `"experimentDuration"` is the same as selecting "Ignore Conversion Windows" for the Conversion Window Override. Setting it to `"lookbackOverride"` requires a `lookbackOverride` object to be provided. */
attributionModel: "firstExposure" | "experimentDuration" | "lookbackOverride";
/** Controls the lookback override for the experiment. For type "window", value must be a non-negative number and valueUnit is required. */
lookbackOverride?: {
type: "date" | "window";
/** For "window" type - non-negative numeric value (e.g. 7 for 7 days). For "date" type a date string. */
value: number | string;
/** Used when type is "window". Defaults to "days". */
valueUnit?: ("minutes" | "hours" | "days" | "weeks") | undefined;
} | undefined;
statsEngine: "bayesian" | "frequentist";
regressionAdjustmentEnabled?: boolean | undefined;
sequentialTestingEnabled?: boolean | undefined;
sequentialTestingTuningParameter?: number | undefined;
/** When null, the organization default is used. */
postStratificationEnabled?: (boolean | null) | undefined;
/** Controls the decision framework and metric overrides for the experiment. Replaces the entire stored object on update (does not patch individual fields). */
decisionFrameworkSettings?: {
decisionCriteriaId?: string | undefined;
decisionFrameworkMetricOverrides?: {
/** ID of the metric to override settings for. */
id: string;
/** The target relative MDE to use for the metric, expressed as proportions (e.g. use 0.1 for 10%). Must be greater than 0. */
targetMDE?: number | undefined;
}[] | undefined;
} | undefined;
/** Per-metric analysis overrides; also reflected in goals/secondaryMetrics/guardrails overrides when applicable. On create/update, this replaces the entire stored array (it does not patch individual entries). */
metricOverrides?: {
/** ID of the metric to override settings for. */
id: string;
windowType?: ("conversion" | "lookback" | "") | undefined;
windowHours?: number | undefined;
delayHours?: number | undefined;
/** Must be true for the override to take effect. If true, the other proper prior settings in this object will be used if present. */
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
/** Must be true for the override to take effect. If true, the other regression adjustment settings in this object will be used if present. */
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
}[] | undefined;
goals: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
}[];
secondaryMetrics: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
}[];
guardrails: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
}[];
activationMetric?: {
metricId: string;
overrides: {
delayHours?: number | undefined;
windowHours?: number | undefined;
window?: ("conversion" | "lookback" | "") | undefined;
winRiskThreshold?: number | undefined;
loseRiskThreshold?: number | undefined;
properPriorOverride?: boolean | undefined;
properPriorEnabled?: boolean | undefined;
properPriorMean?: number | undefined;
properPriorStdDev?: number | undefined;
regressionAdjustmentOverride?: boolean | undefined;
regressionAdjustmentEnabled?: boolean | undefined;
regressionAdjustmentDays?: number | undefined;
};
} | undefined;
};
resultSummary?: {
status: string;
winner: string;
conclusions: string;
releasedVariationId: string;
excludeFromPayload: boolean;
} | undefined;
shareLevel?: ("public" | "organization") | undefined;
publicUrl?: string | undefined;
banditScheduleValue?: number | undefined;
banditScheduleUnit?: ("days" | "hours") | undefined;
banditBurnInValue?: number | undefined;
banditBurnInUnit?: ("days" | "hours") | undefined;
banditConversionWindowValue?: number | undefined;
banditConversionWindowUnit?: ("days" | "hours") | undefined;
linkedFeatures?: string[] | undefined;
hasVisualChangesets?: boolean | undefined;
hasURLRedirects?: boolean | undefined;
customFields?: Record<string, any> | undefined;
/** Custom slices that apply to ALL applicable metrics in the experiment */
customMetricSlices?: {
slices: {
column: string;
levels: string[];
}[];
}[] | undefined;
/** ID of the default dashboard for this experiment. */
defaultDashboardId?: string | undefined;
templateId?: string | undefined;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

experiment.warning

Triggered when a warning condition is detected on an experiment

Payload
{
event: "experiment.warning";
object: "experiment";
api_version: string;
created: number;
data: {
object: {
type: "auto-update";
success: boolean;
experimentName: string;
experimentId: string;
} | {
type: "multiple-exposures";
experimentName: string;
experimentId: string;
usersCount: number;
percent: number;
} | {
type: "srm";
experimentName: string;
experimentId: string;
threshold: number;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

experiment.info.significance

Triggered when a goal or guardrail metric reaches significance in an experiment (e.g. either above 95% or below 5% chance to win). Be careful using this without Sequential Testing as it can lead to peeking problems.

Payload
{
event: "experiment.info.significance";
object: "experiment";
api_version: string;
created: number;
data: {
object: {
experimentName: string;
experimentId: string;
variationId: string;
variationName: string;
metricName: string;
metricId: string;
statsEngine: string;
criticalValue: number;
winning: boolean;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

experiment.decision.ship

Triggered when an experiment is ready to ship a variation.

Payload
{
event: "experiment.decision.ship";
object: "experiment";
api_version: string;
created: number;
data: {
object: {
experimentName: string;
experimentId: string;
decisionDescription?: string | undefined;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

experiment.decision.rollback

Triggered when an experiment should be rolled back to the control.

Payload
{
event: "experiment.decision.rollback";
object: "experiment";
api_version: string;
created: number;
data: {
object: {
experimentName: string;
experimentId: string;
decisionDescription?: string | undefined;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

experiment.decision.review

Triggered when an experiment has reached the desired power point, but the results may be ambiguous.

Payload
{
event: "experiment.decision.review";
object: "experiment";
api_version: string;
created: number;
data: {
object: {
experimentName: string;
experimentId: string;
decisionDescription?: string | undefined;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}

user.login

Triggered when a user logs in

Payload
{
event: "user.login";
object: "user";
api_version: string;
created: number;
data: {
object: {
email: string;
id: string;
name: string;
ip: string;
userAgent: string;
os: string;
device: string;
};
};
user: {
type: "dashboard";
id: string;
email: string;
name: string;
} | {
type: "api_key";
apiKey: string;
id?: string | undefined;
name?: string | undefined;
email?: string | undefined;
} | {
type: "system";
subtype?: string | undefined;
id?: string | undefined;
} | null;
tags: string[];
environments: string[];
containsSecrets: boolean;
}