{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://schemas.statsig.com/schemas/statsig/event.json",
  "title": "Statsig Event",
  "description": "An event object used for logging exposure events, custom events, and webhook payloads in the Statsig analytics pipeline. Events power experiment analysis, product analytics, and metric computations.",
  "type": "object",
  "required": ["eventName", "user", "time"],
  "properties": {
    "eventName": {
      "type": "string",
      "description": "The name of the event. Exposure events use the format statsig::gate_exposure, statsig::config_exposure, or statsig::experiment_exposure. Config change events use statsig::config_change. Custom events use application-defined names.",
      "minLength": 1,
      "maxLength": 256
    },
    "user": {
      "$ref": "#/$defs/StatsigUser"
    },
    "time": {
      "type": "integer",
      "description": "Timestamp of the event in milliseconds since epoch.",
      "format": "int64"
    },
    "value": {
      "description": "An optional value associated with the event, such as a revenue amount, duration, or string label.",
      "oneOf": [
        { "type": "string" },
        { "type": "number" }
      ]
    },
    "metadata": {
      "type": "object",
      "description": "Optional metadata key-value pairs providing additional context for the event.",
      "additionalProperties": true,
      "properties": {
        "gate": {
          "type": "string",
          "description": "The name of the gate, for gate exposure events."
        },
        "config": {
          "type": "string",
          "description": "The name of the config or experiment, for config or experiment exposure events."
        },
        "ruleID": {
          "type": "string",
          "description": "The rule that matched during evaluation."
        },
        "type": {
          "type": "string",
          "description": "The entity type for config_change events (e.g., Gate, Experiment, DynamicConfig)."
        },
        "name": {
          "type": "string",
          "description": "The entity name for config_change events."
        },
        "action": {
          "type": "string",
          "description": "The action performed for config_change events (e.g., created, updated, deleted)."
        }
      }
    },
    "statsigMetadata": {
      "$ref": "#/$defs/StatsigMetadata"
    },
    "timeUUID": {
      "type": "string",
      "description": "A unique identifier for this event instance, combining timestamp and random components.",
      "format": "uuid"
    }
  },
  "$defs": {
    "StatsigUser": {
      "type": "object",
      "description": "The user object representing the end user associated with the event.",
      "properties": {
        "userID": {
          "type": "string",
          "description": "A unique identifier for the user.",
          "minLength": 1
        },
        "email": {
          "type": "string",
          "description": "The email address of the user.",
          "format": "email"
        },
        "name": {
          "type": "string",
          "description": "The display name of the user."
        },
        "ip": {
          "type": "string",
          "description": "The IP address of the user."
        },
        "userAgent": {
          "type": "string",
          "description": "The user agent string."
        },
        "country": {
          "type": "string",
          "description": "The two-letter country code of the user.",
          "pattern": "^[A-Z]{2}$"
        },
        "locale": {
          "type": "string",
          "description": "The locale identifier for the user."
        },
        "appVersion": {
          "type": "string",
          "description": "The version of the application the user is running."
        },
        "custom": {
          "type": "object",
          "description": "Custom user properties used for targeting rules.",
          "additionalProperties": true
        },
        "privateAttributes": {
          "type": "object",
          "description": "Private user attributes used for evaluation but not logged to Statsig servers.",
          "additionalProperties": true
        },
        "customIDs": {
          "type": "object",
          "description": "Custom identifier mappings such as companyID, teamID, or other organizational units.",
          "additionalProperties": {
            "type": "string"
          }
        }
      }
    },
    "StatsigMetadata": {
      "type": "object",
      "description": "Metadata about the SDK that generated the event.",
      "properties": {
        "sdkType": {
          "type": "string",
          "description": "The type of SDK (e.g., js-client, py-server, react-native, node-server)."
        },
        "sdkVersion": {
          "type": "string",
          "description": "The version of the SDK."
        },
        "sessionID": {
          "type": "string",
          "description": "The session identifier for client-side SDKs."
        },
        "stableID": {
          "type": "string",
          "description": "A stable device identifier for anonymous user tracking."
        }
      }
    }
  }
}