{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://amplitude.com/schemas/amplitude/experiment.json",
  "title": "Amplitude Experiment",
  "description": "Schema for an Amplitude experiment or feature flag configuration including variants, targeting segments, and deployment settings.",
  "type": "object",
  "required": ["key"],
  "properties": {
    "id": {
      "type": "string",
      "description": "The unique identifier for the experiment or flag."
    },
    "projectId": {
      "type": "string",
      "description": "The project ID the experiment belongs to."
    },
    "key": {
      "type": "string",
      "description": "The unique key used to reference the experiment or flag in code.",
      "minLength": 1,
      "pattern": "^[a-z0-9_-]+$"
    },
    "name": {
      "type": "string",
      "description": "The display name of the experiment or flag.",
      "maxLength": 255
    },
    "description": {
      "type": "string",
      "description": "A description of the experiment's purpose and hypothesis."
    },
    "type": {
      "type": "string",
      "description": "The type of configuration.",
      "enum": ["experiment", "flag", "release"]
    },
    "enabled": {
      "type": "boolean",
      "description": "Whether the experiment or flag is currently enabled."
    },
    "evaluationMode": {
      "type": "string",
      "description": "The evaluation mode determining where variants are computed.",
      "enum": ["local", "remote"]
    },
    "state": {
      "type": "string",
      "description": "The lifecycle state of the experiment or flag.",
      "enum": ["draft", "running", "stopped", "active", "archived"]
    },
    "bucketingKey": {
      "type": "string",
      "description": "The user property used for deterministic bucketing."
    },
    "bucketingSalt": {
      "type": "string",
      "description": "The salt used with the bucketing key for hash computation."
    },
    "variants": {
      "type": "array",
      "description": "Array of variant configurations for the experiment.",
      "items": {
        "$ref": "#/$defs/Variant"
      }
    },
    "segments": {
      "type": "array",
      "description": "Array of targeting segments that control which users see which variants.",
      "items": {
        "$ref": "#/$defs/Segment"
      }
    },
    "deployments": {
      "type": "array",
      "description": "Array of deployment IDs where this experiment is active.",
      "items": {
        "type": "string"
      }
    },
    "rolledOutVariant": {
      "type": "string",
      "description": "The variant key that was rolled out after the experiment concluded."
    },
    "startDate": {
      "type": "string",
      "format": "date-time",
      "description": "The date and time the experiment started."
    },
    "endDate": {
      "type": "string",
      "format": "date-time",
      "description": "The date and time the experiment ended."
    }
  },
  "$defs": {
    "Variant": {
      "type": "object",
      "description": "A variant in an experiment or feature flag.",
      "required": ["key"],
      "properties": {
        "key": {
          "type": "string",
          "description": "The unique key identifying this variant.",
          "minLength": 1
        },
        "name": {
          "type": "string",
          "description": "The display name of the variant."
        },
        "description": {
          "type": "string",
          "description": "A description of what this variant does."
        },
        "payload": {
          "description": "An optional JSON payload associated with the variant for client-side configuration."
        },
        "rolloutWeight": {
          "type": "integer",
          "description": "The traffic allocation percentage for this variant.",
          "minimum": 0,
          "maximum": 100
        }
      }
    },
    "Segment": {
      "type": "object",
      "description": "A targeting segment that defines which users receive a specific variant.",
      "properties": {
        "name": {
          "type": "string",
          "description": "The display name of the segment."
        },
        "conditions": {
          "type": "array",
          "description": "Array of targeting conditions that must all be true for the segment to match.",
          "items": {
            "$ref": "#/$defs/Condition"
          }
        },
        "variant": {
          "type": "string",
          "description": "The variant key to assign when this segment matches."
        },
        "percentage": {
          "type": "integer",
          "description": "The percentage of matching users to include.",
          "minimum": 0,
          "maximum": 100
        }
      }
    },
    "Condition": {
      "type": "object",
      "description": "A single targeting condition used in segment evaluation.",
      "properties": {
        "type": {
          "type": "string",
          "description": "The type of targeting condition.",
          "enum": ["user_property", "cohort", "device_id", "user_id"]
        },
        "prop": {
          "type": "string",
          "description": "The property name to evaluate."
        },
        "op": {
          "type": "string",
          "description": "The comparison operator.",
          "enum": ["is", "is_not", "contains", "does_not_contain", "greater_than", "less_than", "set", "not_set", "glob_match", "glob_does_not_match"]
        },
        "values": {
          "type": "array",
          "description": "The values to compare against.",
          "items": {
            "type": "string"
          }
        }
      }
    }
  }
}
