---
title: "Gets an experiment by ID."
method: GET
path: "/creator-configs-public-api/v1/experimentation/universes/{universeId}/experiments/{experimentId}"
tags: ["Experiments"]
---

# Gets an experiment by ID.

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

## Request

- Base URL: `https://apis.roblox.com`
- URL: `https://apis.roblox.com/creator-configs-public-api/v1/experimentation/universes/{universeId}/experiments/{experimentId}`
- 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:read`

Returns the `experiment`. Returns 404 if the experiment doesn't exist for the universe.

## Path parameters

- `universeId` integer, required
- `experimentId` string, required

## Response `200`

OK

- GetExperimentResponse: Response body for GET /v1/universes/{universeId}/experiment/{experimentId}.
  - `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.
            - `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.
    - `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.
              - …
    - `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`: 4 breaking, 1 info
  - the `experiment/allOf[#/components/schemas/ProductExperiment]/targetingCriteria/allOf[#/components/schemas/TargetingCriteria]/rule/allOf[#/components/schemas/ConditionalRuleDefinition]/tokens/items/operand/allOf[#/components/schemas/RpnOperandDto]/literalValue/allOf[#/components/schemas/LiteralValueDto]/booleanValue` response's property type changed from `string` to `boolean` for status `200`
  - the `experiment/allOf[#/components/schemas/ProductExperiment]/targetingCriteria/allOf[#/components/schemas/TargetingCriteria]/rule/allOf[#/components/schemas/ConditionalRuleDefinition]/tokens/items/operand/allOf[#/components/schemas/RpnOperandDto]/literalValue/allOf[#/components/schemas/LiteralValueDto]/doubleValue` response's property type changed from `string` to `number`, and format from no format to `double` for status `200`
  - the `experiment/allOf[#/components/schemas/ProductExperiment]/targetingCriteria/allOf[#/components/schemas/TargetingCriteria]/rule/allOf[#/components/schemas/ConditionalRuleDefinition]/tokens/items/operand/allOf[#/components/schemas/RpnOperandDto]/literalValue/allOf[#/components/schemas/LiteralValueDto]/integerValue` response's property type changed from `string` to `integer`, and format from no format to `int64` for status `200`
  - the `experiment/allOf[#/components/schemas/ProductExperiment]/targetingCriteria/allOf[#/components/schemas/TargetingCriteria]/rule/allOf[#/components/schemas/ConditionalRuleDefinition]/tokens/items/operator` response's property type changed from `string` to no type for status `200`
  - …1 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/roblox/apis/roblox-api/changes/creator-configs-public-api/v1/experimentation/universes/:universeId/experiments/:experimentId/get.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)
