---
title: "Creates a new experiment for a universe."
method: POST
path: "/creator-configs-public-api/v1/experimentation/universes/{universeId}/experiments"
tags: ["Experiments"]
---

# Creates a new experiment for a universe.

`POST /creator-configs-public-api/v1/experimentation/universes/{universeId}/experiments`

## Request

- Base URL: `https://apis.roblox.com`
- URL: `https://apis.roblox.com/creator-configs-public-api/v1/experimentation/universes/{universeId}/experiments`
- Auth: one of:
  - API key in cookie `.ROBLOSECURITY`
  - API key in header `x-api-key`
  - OAuth 2
    - Authorization code: `https://apis.roblox.com/oauth/v1/authorize`
    - Token URL: `https://apis.roblox.com/oauth/v1/token` scopes: `universe:write`

Returns an ExperimentOperation describing the async create call.

## Path parameters

- `universeId` integer, required

## Request body

- CreateExperimentData: Request body for `POST /v1/experimentation/universes/{universeId}/experiments`. Payload describing a new experiment.
  - `name` string, nullable: Experiment display name.
  - `description` string, nullable: Experiment description.
  - `experimentConfiguration` ExperimentConfiguration: Union of per-product experiment configurations. At most one of InGameConfigExperimentConfiguration or MatchmakingExperimentConfiguration may be set.
    - `productType` 'EXPERIMENT_PRODUCT_TYPE_IN_GAME_CONFIGS' | 'EXPERIMENT_PRODUCT_TYPE_MATCHMAKING': Type of product the experiment is targeting. EXPERIMENT_PRODUCT_TYPE_IN_GAME_CONFIGS EXPERIMENT_PRODUCT_TYPE_MATCHMAKING
    - `inGameConfigExperimentConfiguration` InGameConfigExperimentConfiguration: Configuration for an in-game-config experiment.
      - `variants` SingleConfigExperimentVariant[], nullable: Variants participating in the experiment. Exactly one must have IsBaseline set.
        - `variantMeta` VariantMeta: Metadata shared by every experiment variant.
          - `variantId` string, nullable: Unique identifier for the variant. Only assigned once the experiment starts running; empty or null for draft variants.
          - `label` string, nullable: Human-readable label for the variant, e.g. `Control`, `Treatment A`. Non-empty, at most 50 characters; must start with a letter and contain only letters, digits, spaces, underscores, or hyphens.
          - `isBaseline` boolean: True iff this variant is the baseline. Exactly one variant must be the baseline.
          - `weight` integer: Relative traffic weight for this variant. The platform normalizes across all variants, so weights do not have to sum to 100.
        - `configEntry` ExperimentConfigEntry
          - `key` string, nullable: The config key this variant overrides. Must match across variants in the same experiment.
          - `entryValue` unknown
          - `description` string, nullable: Optional human-readable description carried alongside the value.
    - `matchmakingExperimentConfiguration` MatchmakingExperimentConfiguration: Configuration for a matchmaking experiment.
      - `variants` MatchmakingExperimentVariant[], nullable: Variants participating in the experiment.
        - `variantMeta` VariantMeta: Metadata shared by every experiment variant.
          - `variantId` string, nullable: Unique identifier for the variant. Only assigned once the experiment starts running; empty or null for draft variants.
          - `label` string, nullable: Human-readable label for the variant, e.g. `Control`, `Treatment A`. Non-empty, at most 50 characters; must start with a letter and contain only letters, digits, spaces, underscores, or hyphens.
          - `isBaseline` boolean: True iff this variant is the baseline. Exactly one variant must be the baseline.
          - `weight` integer: Relative traffic weight for this variant. The platform normalizes across all variants, so weights do not have to sum to 100.
        - `placeMatchmakingConfigs` PlaceScoringConfig[], nullable: Per-place matchmaking scoring configurations applied when this variant is selected.
          - `placeId` integer: Place ID this scoring config applies to.
          - `matchmakingScoringConfigId` string, nullable: Matchmaking scoring config ID for this place. Ignored when UsePlatformDefault is true.
          - `usePlatformDefault` boolean: When true, this place uses the platform default matchmaking scoring config instead of MatchmakingScoringConfigId.
  - `exposurePercent` integer: Exposure percent in range 0-100. Percent of eligible users seeing the experiment.
  - `targetingCriteria` TargetingCriteria: Eligibility criteria scoping which users an experiment can apply to.
    - `rule` ConditionalRuleDefinition: JSON shape of an RPN conditional rule in public API requests.
      - `tokens` RpnTokenDto[], nullable: Postfix RPN token sequence.
        - `operator` 'OPERATOR_AND' | 'OPERATOR_OR' | 'OPERATOR_NOT' | 'OPERATOR_EQ' | 'OPERATOR_NE' | 'OPERATOR_GT' | 'OPERATOR_LT' | 'OPERATOR_GTE' | 'OPERATOR_LTE' | 'OPERATOR_IN' | 'OPERATOR_NIN': RPN token operator values for public HTTP JSON, aligned with `roblox.creatorexperienceconfig.conditionrules.v1.Operator` numeric values `1`–`11`. The proto `OPERATOR_INVALID` (`0`) is not exposed here; unknown or invalid operators are rejected at deserialization. JSON uses proto symbolic names (`OPERATOR_AND`, …) via Google.Protobuf.Reflection.OriginalNameAttribute. OPERATOR_AND OPERATOR_OR OPERATOR_NOT OPERATOR_EQ OPERATOR_NE OPERATOR_GT OPERATOR_LT OPERATOR_GTE OPERATOR_LTE OPERATOR_IN OPERATOR_NIN
        - `operand` RpnOperandDto: RPN operand: attribute reference or literal value.
          - `attributeReference` string, nullable
          - `literalValue` LiteralValueDto: Literal constant for an RPN operand.
            - `booleanValue` boolean, nullable
            - `integerValue` integer, nullable
            - `doubleValue` number, double, nullable
            - `stringValue` string, nullable
  - `durationSeconds` integer: Experiment duration in whole seconds.
  - `universeGoalMetric` 'UNIVERSE_EXPERIMENT_METRIC_AVERAGE_SESSION_TIME' | 'UNIVERSE_EXPERIMENT_METRIC_PLAYTIME_PER_USER' | 'UNIVERSE_EXPERIMENT_METRIC_DAY_1_RETENTION' | 'UNIVERSE_EXPERIMENT_METRIC_DAY_7_RETENTION' | 'UNIVERSE_EXPERIMENT_METRIC_PAYER_CONVERSION_RATE' | 'UNIVERSE_EXPERIMENT_METRIC_AVERAGE_REVENUE_PER_USER' | 'UNIVERSE_EXPERIMENT_METRIC_AVERAGE_REVENUE_PER_PAYING_USER': Metric tracked for a universe experiment. UNIVERSE_EXPERIMENT_METRIC_AVERAGE_SESSION_TIME UNIVERSE_EXPERIMENT_METRIC_PLAYTIME_PER_USER UNIVERSE_EXPERIMENT_METRIC_DAY_1_RETENTION UNIVERSE_EXPERIMENT_METRIC_DAY_7_RETENTION UNIVERSE_EXPERIMENT_METRIC_PAYER_CONVERSION_RATE UNIVERSE_EXPERIMENT_METRIC_AVERAGE_REVENUE_PER_USER UNIVERSE_EXPERIMENT_METRIC_AVERAGE_REVENUE_PER_PAYING_USER

## Response `200`

OK

- CreateExperimentResponse: Response body for POST /v1/universes/{universeId}/experiment.
  - `operation` ExperimentOperation: Async operation result for an experiment Create / Update / Discard call. When Done is true, at most one of Error or Experiment is set; when false, neither is. A successful delete is the one case where a done operation carries neither: the experiment no longer exists, so no Experiment body is returned.
    - `operationId` string, nullable: Stable operation ID.
    - `status` 'OPERATIONAL_STATUS_READY' | 'OPERATIONAL_STATUS_CREATING' | 'OPERATIONAL_STATUS_UPDATING' | 'OPERATIONAL_STATUS_STARTING' | 'OPERATIONAL_STATUS_STOPPING' | 'OPERATIONAL_STATUS_SCHEDULING' | 'OPERATIONAL_STATUS_DELETING' | 'OPERATIONAL_STATUS_RAMPING_UP' | 'OPERATIONAL_STATUS_SYNCING' | 'OPERATIONAL_STATUS_ROLLING_OUT': Current operational status reported on an experiment or an async operation performed on one. OPERATIONAL_STATUS_READY OPERATIONAL_STATUS_CREATING OPERATIONAL_STATUS_UPDATING OPERATIONAL_STATUS_STARTING OPERATIONAL_STATUS_STOPPING OPERATIONAL_STATUS_SCHEDULING OPERATIONAL_STATUS_DELETING OPERATIONAL_STATUS_RAMPING_UP OPERATIONAL_STATUS_SYNCING OPERATIONAL_STATUS_ROLLING_OUT
    - `createdTime` string, date-time: UTC time the operation was created.
    - `done` boolean: True once the operation terminates (success or failure). When false, neither Error nor Experiment is populated.
    - `error` ExperimentApiError: Application-layer error emitted on a failed experiment operation.
      - `errorType` 'EXPERIMENT_API_ERROR_TYPE_INVALID_VARIANT_CONFIGURATION' | 'EXPERIMENT_API_ERROR_TYPE_INVALID_VARIANT_LABEL' | 'EXPERIMENT_API_ERROR_TYPE_MUST_HAVE_EXACTLY_ONE_BASELINE_VARIANT' | 'EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_OVERLAPPING_RUNTIME' | 'EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_INVALID_SCORING_CONFIGURATIONS' | 'EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_UNEXPECTED_PRODUCT_TYPE' | 'EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_EMPTY_CONFIGURATION' | 'EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_EMPTY_VARIANT_METADATA' | 'EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_VARIANT_WEIGHT_MUST_BE_POSITIVE' | 'EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_VARIANT_WEIGHTS_UNBALANCED' | 'EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_PLACE_CONFIG_REQUIRES_SCORING_ID_OR_DEFAULT' | 'EXPERIMENT_API_ERROR_TYPE_CONFIGS_MISSING_VARIANT' | 'EXPERIMENT_API_ERROR_TYPE_CONFIGS_VARIANT_MISSING_KEY' | 'EXPERIMENT_API_ERROR_TYPE_CONFIGS_VARIANT_MISSING_VALUE' | 'EXPERIMENT_API_ERROR_TYPE_CONFIGS_KEY_ALREADY_IN_USE' | 'EXPERIMENT_API_ERROR_TYPE_SYSTEM_ERROR' | 'EXPERIMENT_API_ERROR_TYPE_EXPERIMENT_RESULTS_NOT_FOUND' | 'EXPERIMENT_API_ERROR_TYPE_INVALID_TARGETING_CRITERIA' | 'EXPERIMENT_API_ERROR_TYPE_TARGETING_NOT_ALLOWED' | 'EXPERIMENT_API_ERROR_TYPE_INVALID_DURATION' | 'EXPERIMENT_API_ERROR_TYPE_CONFIGS_VARIANT_CONFIG_NOT_FOUND' | 'EXPERIMENT_API_ERROR_TYPE_INVALID_EXPERIMENT_NAME' | 'EXPERIMENT_API_ERROR_TYPE_CONDITIONAL_CONFIG_REQUIRES_NULL_BASELINE' | 'EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_CONTROL_VARIANT_MUST_MATCH_CURRENT_CONFIGURATION' | 'EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_VARIANTS_MUST_COVER_SAME_PLACES' | 'EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_VARIANT_HAS_DUPLICATE_PLACES' | 'EXPERIMENT_API_ERROR_TYPE_CONFIGS_KEY_HAS_RESERVED_PREFIX': Validation failures. EXPERIMENT_API_ERROR_TYPE_INVALID_VARIANT_CONFIGURATION EXPERIMENT_API_ERROR_TYPE_INVALID_VARIANT_LABEL EXPERIMENT_API_ERROR_TYPE_MUST_HAVE_EXACTLY_ONE_BASELINE_VARIANT EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_OVERLAPPING_RUNTIME EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_INVALID_SCORING_CONFIGURATIONS EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_UNEXPECTED_PRODUCT_TYPE EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_EMPTY_CONFIGURATION EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_EMPTY_VARIANT_METADATA EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_VARIANT_WEIGHT_MUST_BE_POSITIVE EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_VARIANT_WEIGHTS_UNBALANCED EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_PLACE_CONFIG_REQUIRES_SCORING_ID_OR_DEFAULT EXPERIMENT_API_ERROR_TYPE_CONFIGS_MISSING_VARIANT EXPERIMENT_API_ERROR_TYPE_CONFIGS_VARIANT_MISSING_KEY EXPERIMENT_API_ERROR_TYPE_CONFIGS_VARIANT_MISSING_VALUE EXPERIMENT_API_ERROR_TYPE_CONFIGS_KEY_ALREADY_IN_USE EXPERIMENT_API_ERROR_TYPE_SYSTEM_ERROR EXPERIMENT_API_ERROR_TYPE_EXPERIMENT_RESULTS_NOT_FOUND EXPERIMENT_API_ERROR_TYPE_INVALID_TARGETING_CRITERIA EXPERIMENT_API_ERROR_TYPE_TARGETING_NOT_ALLOWED EXPERIMENT_API_ERROR_TYPE_INVALID_DURATION EXPERIMENT_API_ERROR_TYPE_CONFIGS_VARIANT_CONFIG_NOT_FOUND EXPERIMENT_API_ERROR_TYPE_INVALID_EXPERIMENT_NAME EXPERIMENT_API_ERROR_TYPE_CONDITIONAL_CONFIG_REQUIRES_NULL_BASELINE EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_CONTROL_VARIANT_MUST_MATCH_CURRENT_CONFIGURATION EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_VARIANTS_MUST_COVER_SAME_PLACES EXPERIMENT_API_ERROR_TYPE_MATCHMAKING_VARIANT_HAS_DUPLICATE_PLACES EXPERIMENT_API_ERROR_TYPE_CONFIGS_KEY_HAS_RESERVED_PREFIX
      - `errorCode` string, nullable: Stable machine-readable error code.
      - `errorMessage` string, nullable: Human-readable description of the failure.
      - `errorContext` object, nullable: Optional structured context about the failure (field paths, offending values, etc.).
    - `experiment` ProductExperiment: Config-based experiment for a given product. Returned by the Get endpoint and embedded in a successful experiment operation.
      - `id` string, nullable: Experiment ID.
      - `name` string, nullable: Experiment display name.
      - `description` string, nullable: Experiment description.
      - `createdTime` string, date-time: UTC time the experiment was created.
      - `lastUpdatedTime` string, date-time, nullable: UTC time the experiment was last updated.
      - `startedTime` string, date-time, nullable: UTC time the experiment was started (running), if it has been.
      - `stoppedTime` string, date-time, nullable: UTC time the experiment was stopped, if it has been.
      - `state` 'EXPERIMENT_STATE_DRAFT' | 'EXPERIMENT_STATE_SCHEDULED' | 'EXPERIMENT_STATE_RUNNING' | 'EXPERIMENT_STATE_COMPLETED' | 'EXPERIMENT_STATE_CANCELLED' | 'EXPERIMENT_STATE_DELETED': Lifecycle state of an experiment. EXPERIMENT_STATE_DRAFT EXPERIMENT_STATE_SCHEDULED EXPERIMENT_STATE_RUNNING EXPERIMENT_STATE_COMPLETED EXPERIMENT_STATE_CANCELLED EXPERIMENT_STATE_DELETED
      - `experimentConfiguration` ExperimentConfiguration: Union of per-product experiment configurations. At most one of InGameConfigExperimentConfiguration or MatchmakingExperimentConfiguration may be set.
        - `productType` 'EXPERIMENT_PRODUCT_TYPE_IN_GAME_CONFIGS' | 'EXPERIMENT_PRODUCT_TYPE_MATCHMAKING': Type of product the experiment is targeting. EXPERIMENT_PRODUCT_TYPE_IN_GAME_CONFIGS EXPERIMENT_PRODUCT_TYPE_MATCHMAKING
        - `inGameConfigExperimentConfiguration` InGameConfigExperimentConfiguration: Configuration for an in-game-config experiment.
          - `variants` SingleConfigExperimentVariant[], nullable: Variants participating in the experiment. Exactly one must have IsBaseline set.
            - `variantMeta` VariantMeta: Metadata shared by every experiment variant.
              - …
            - `configEntry` ExperimentConfigEntry
              - …
        - `matchmakingExperimentConfiguration` MatchmakingExperimentConfiguration: Configuration for a matchmaking experiment.
          - `variants` MatchmakingExperimentVariant[], nullable: Variants participating in the experiment.
            - `variantMeta` VariantMeta: Metadata shared by every experiment variant.
              - …
            - `placeMatchmakingConfigs` PlaceScoringConfig[], nullable: Per-place matchmaking scoring configurations applied when this variant is selected.
              - …
      - `exposurePercent` integer: Exposure percent in range 0-100.
      - `targetingCriteria` TargetingCriteria: Eligibility criteria scoping which users an experiment can apply to.
        - `rule` ConditionalRuleDefinition: JSON shape of an RPN conditional rule in public API requests.
          - `tokens` RpnTokenDto[], nullable: Postfix RPN token sequence.
            - `operator` 'OPERATOR_AND' | 'OPERATOR_OR' | 'OPERATOR_NOT' | 'OPERATOR_EQ' | 'OPERATOR_NE' | 'OPERATOR_GT' | 'OPERATOR_LT' | 'OPERATOR_GTE' | 'OPERATOR_LTE' | 'OPERATOR_IN' | 'OPERATOR_NIN': RPN token operator values for public HTTP JSON, aligned with `roblox.creatorexperienceconfig.conditionrules.v1.Operator` numeric values `1`–`11`. The proto `OPERATOR_INVALID` (`0`) is not exposed here; unknown or invalid operators are rejected at deserialization. JSON uses proto symbolic names (`OPERATOR_AND`, …) via Google.Protobuf.Reflection.OriginalNameAttribute. OPERATOR_AND OPERATOR_OR OPERATOR_NOT OPERATOR_EQ OPERATOR_NE OPERATOR_GT OPERATOR_LT OPERATOR_GTE OPERATOR_LTE OPERATOR_IN OPERATOR_NIN
            - `operand` RpnOperandDto: RPN operand: attribute reference or literal value.
              - …
      - `operationalStatus` 'OPERATIONAL_STATUS_READY' | 'OPERATIONAL_STATUS_CREATING' | 'OPERATIONAL_STATUS_UPDATING' | 'OPERATIONAL_STATUS_STARTING' | 'OPERATIONAL_STATUS_STOPPING' | 'OPERATIONAL_STATUS_SCHEDULING' | 'OPERATIONAL_STATUS_DELETING' | 'OPERATIONAL_STATUS_RAMPING_UP' | 'OPERATIONAL_STATUS_SYNCING' | 'OPERATIONAL_STATUS_ROLLING_OUT': Current operational status reported on an experiment or an async operation performed on one. OPERATIONAL_STATUS_READY OPERATIONAL_STATUS_CREATING OPERATIONAL_STATUS_UPDATING OPERATIONAL_STATUS_STARTING OPERATIONAL_STATUS_STOPPING OPERATIONAL_STATUS_SCHEDULING OPERATIONAL_STATUS_DELETING OPERATIONAL_STATUS_RAMPING_UP OPERATIONAL_STATUS_SYNCING OPERATIONAL_STATUS_ROLLING_OUT
      - `createdBy` string, nullable: User ID of the creator of the experiment.
      - `scheduledTime` string, date-time, nullable: UTC time the experiment is scheduled to start, if scheduled.
      - `durationSeconds` integer: Experiment duration in whole seconds.
      - `universeMetricConfiguration` UniverseMetricConfiguration: Metric configuration for an experiment.
        - `goalMetric` 'UNIVERSE_EXPERIMENT_METRIC_AVERAGE_SESSION_TIME' | 'UNIVERSE_EXPERIMENT_METRIC_PLAYTIME_PER_USER' | 'UNIVERSE_EXPERIMENT_METRIC_DAY_1_RETENTION' | 'UNIVERSE_EXPERIMENT_METRIC_DAY_7_RETENTION' | 'UNIVERSE_EXPERIMENT_METRIC_PAYER_CONVERSION_RATE' | 'UNIVERSE_EXPERIMENT_METRIC_AVERAGE_REVENUE_PER_USER' | 'UNIVERSE_EXPERIMENT_METRIC_AVERAGE_REVENUE_PER_PAYING_USER': Metric tracked for a universe experiment. UNIVERSE_EXPERIMENT_METRIC_AVERAGE_SESSION_TIME UNIVERSE_EXPERIMENT_METRIC_PLAYTIME_PER_USER UNIVERSE_EXPERIMENT_METRIC_DAY_1_RETENTION UNIVERSE_EXPERIMENT_METRIC_DAY_7_RETENTION UNIVERSE_EXPERIMENT_METRIC_PAYER_CONVERSION_RATE UNIVERSE_EXPERIMENT_METRIC_AVERAGE_REVENUE_PER_USER UNIVERSE_EXPERIMENT_METRIC_AVERAGE_REVENUE_PER_PAYING_USER
        - `learningMetrics` UniverseExperimentMetric[], nullable: Learning (observation-only) metrics.

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `404`: Not Found

## Changes

- **2026-10-22** `bcfdc20689cd`: 23 breaking, 2 info
  - added `#/components/schemas/ConditionalRuleOperator` to the `allOf[#/components/schemas/CreateExperimentData]/targetingCriteria/allOf[#/components/schemas/TargetingCriteria]/rule/allOf[#/components/schemas/ConditionalRuleDefinition]/tokens/items/operator` request property `allOf` list (media type: application/json-patch+json)
  - added `#/components/schemas/ConditionalRuleOperator` to the `allOf[#/components/schemas/CreateExperimentData]/targetingCriteria/allOf[#/components/schemas/TargetingCriteria]/rule/allOf[#/components/schemas/ConditionalRuleDefinition]/tokens/items/operator` request property `allOf` list (media type: application/json)
  - added `#/components/schemas/ConditionalRuleOperator` to the `allOf[#/components/schemas/CreateExperimentData]/targetingCriteria/allOf[#/components/schemas/TargetingCriteria]/rule/allOf[#/components/schemas/ConditionalRuleDefinition]/tokens/items/operator` request property `allOf` list (media type: text/json)
  - added `#/components/schemas/ConditionalRuleOperator` to the `allOf[#/components/schemas/CreateExperimentData]/targetingCriteria/allOf[#/components/schemas/TargetingCriteria]/rule/allOf[#/components/schemas/ConditionalRuleDefinition]/tokens/items/operator` request property `allOf` list (media type: application/*+json)
  - …21 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/roblox/apis/roblox-api/changes/creator-configs-public-api/v1/experimentation/universes/:universeId/experiments/post.md)

---

[API](https://skmtc.dev/roblox/apis/roblox-api.md) - [All operations](https://skmtc.dev/roblox/apis/roblox-api/llms.txt) - [OpenAPI document](https://skmtc.dev/roblox/apis/roblox-api/revisions/bcfdc20689cd?raw)
