---
title: "Add a release plan."
method: POST
path: "/api/admin/projects/{project}/features/{featureName}/environments/{environment}/release-plans"
tags: ["Release Templates"]
---

# Add a release plan.

`POST /api/admin/projects/{project}/features/{featureName}/environments/{environment}/release-plans`

**Enterprise feature**

Adds a release plan to a specific feature flag and environment.

## Path parameters

- `project` string, required
- `featureName` string, required
- `environment` string, required

## Request body

- ReleasePlanTemplateIdSchema — Schema for creating a release plan for a feature flag environment by copying and applying the configuration from a release plan template.
  - `templateId` string, required — The release plan template's ID. Release template IDs are ulids.

## Response `200`

#/components/schemas/releasePlanSchema

- ReleasePlanSchema — Schema representing the creation of a release plan.
  - `id` string, required — The release plan/template's ID. Release template IDs are ulids.
  - `discriminator` 'plan', required — A field to distinguish between release plans and release templates.
  - `name` string, required — The name of the release template.
  - `description` string, nullable — A description of the release template.
  - `featureName` string, required — The name of the feature that uses this release plan.
  - `environment` string, required — The environment that this release plan is for.
  - `createdByUserId` number, required — Release template: The ID of the user who created this template.
  - `createdAt` string, date-time, required — The date and time that the release template was created.
  - `activeMilestoneId` string, nullable — The ID of the currently active milestone in this release plan.
  - `milestones` ReleasePlanMilestoneSchema[], required — A list of the milestones in this release template.
    - `id` string, required — The milestone's ID. Milestone IDs are ulids.
    - `name` string, required — The name of the milestone.
    - `sortOrder` integer, required — The order of the milestone in the release plan.
    - `releasePlanDefinitionId` string, required — The ID of the release plan/template that this milestone belongs to.
    - `startedAt` string, date-time, nullable — The date and time when the milestone was started.
    - `transitionCondition` object, nullable — The condition configuration for the transition
      - `intervalMinutes` integer, required — The interval in minutes before transitioning
    - `progressionExecutedAt` string, date-time, nullable — The date and time when the milestone progression was executed.
    - `pausedAt` string, date-time, nullable — The date and time when the milestone was paused.
    - `strategies` ReleasePlanMilestoneStrategySchema[] — A list of strategies that are attached to this milestone.
      - `id` string, required — The milestone strategy's ID. Milestone strategy IDs are ulids.
      - `milestoneId` string, required — The ID of the milestone that this strategy belongs to.
      - `sortOrder` number, required — The order of the strategy in the list
      - `title` string, nullable — A descriptive title for the strategy
      - `name` string, required — The name of the strategy type
      - `strategyName` string, required — The name of the strategy type
      - `parameters` ParametersSchema — A list of parameters for a strategy
      - `constraints` ConstraintSchema[] — A list of the constraints attached to the strategy. See https://docs.getunleash.io/concepts/activation-strategies#constraints
        - `contextName` string, required — The name of the context field that this constraint should apply to.
        - `operator` 'NOT_IN' | 'IN' | 'STR_ENDS_WITH' | 'STR_STARTS_WITH' | 'STR_CONTAINS' | 'NUM_EQ' | 'NUM_GT' | 'NUM_GTE' | 'NUM_LT' | 'NUM_LTE' | 'DATE_AFTER' | 'DATE_BEFORE' | 'SEMVER_EQ' | 'SEMVER_GT' | 'SEMVER_LT' | 'SEMVER_GTE' | 'SEMVER_LTE' | 'REGEX', required — The operator to use when evaluating this constraint. For more information about the various operators, refer to [the strategy constraint operator documentation](https://docs.getunleash.io/concepts/activation-strategies#constraint-operators).
        - `caseInsensitive` boolean — Whether the operator should be case sensitive or not. Defaults to `false` (being case sensitive).
        - `inverted` boolean — Whether the result should be negated or not. If `true`, will turn a `true` result into a `false` result and vice versa.
        - `values` string[] — The context values that should be used for constraint evaluation. Use this property instead of `value` for properties that accept multiple values.
        - `value` string — The context value that should be used for constraint evaluation. Use this property instead of `values` for properties that only accept single values.
      - `variants` CreateStrategyVariantSchema[] — Strategy level variants
        - `name` string, required — The variant name. Must be unique for this feature flag
        - `weight` integer, required — The weight is the likelihood of any one user getting this variant. It is an integer between 0 and 1000. See the section on [variant weights](https://docs.getunleash.io/concepts/feature-flag-variants#variant-weight) for more information
        - `weightType` 'variable' | 'fix', required — Set to `fix` if this variant must have exactly the weight allocated to it. If the type is `variable`, the weight will adjust so that the total weight of all variants adds up to 1000. Refer to the [variant weight documentation](https://docs.getunleash.io/concepts/feature-flag-variants#variant-weight).
        - `stickiness` string, required — The [stickiness](https://docs.getunleash.io/concepts/feature-flag-variants#variant-stickiness) to use for distribution of this variant. Stickiness is how Unleash guarantees that the same user gets the same variant every time
        - `payload` object — Extra data configured for this variant
          - `type` 'json' | 'csv' | 'string' | 'number', required — The type of the value. Commonly used types are string, number, json and csv.
          - `value` string, required — The actual value of payload
      - `segments` number[] — Ids of segments to use for this strategy
      - `disabled` boolean, nullable — A toggle to disable the strategy. defaults to false. Disabled strategies are not evaluated or returned to the SDKs
  - `releasePlanTemplateId` string, required — The ID of the release plan template that this release plan is based on.
  - `safeguards` ReleasePlanSafeguardSchema[] — An array of safeguards configured for this release plan.
    - `id` string, required — The unique ULID identifier for this safeguard
    - `action` object, required — The action to take when the safeguard is triggered.
      - `type` string, required — The type of action to perform.
      - `id` string, required — The ID of the release plan this safeguard applies to.
    - `triggerCondition` SafeguardTriggerConditionSchema, required — The condition that triggers the safeguard.
      - `operator` '>' | '<', required — The comparison operator for the threshold check.
      - `threshold` number, required — The threshold value to compare against.
    - `impactMetric` object, required — The metric configuration used to evaluate the safeguard condition.
      - `id` string, required — The unique identifier for this impact metric
      - `metricName` string, required — The Prometheus metric series to query. It includes both unleash prefix and metric type and display name
      - `timeRange` 'hour' | 'day' | 'week' | 'month', required — The time range for the metric data.
      - `aggregationMode` 'rps' | 'count' | 'avg' | 'sum' | 'p95' | 'p99' | 'p50', required — The aggregation mode for the metric data.
      - `labelSelectors` object, required — The selected labels and their values for filtering the metric data.
      - `source` 'internal' | 'external' — The Prometheus data source for this metric. Internal is the Unleash-managed Prometheus, external is a customer-provided Prometheus instance. Defaults to internal if not specified.

## Other responses

- `401` — Authorization information is missing or invalid. Provide a valid API token as the `authorization` header, e.g. `authorization:*.*.my-admin-token`.
- `409` — The provided resource can not be created or updated because it would conflict with the current state of the resource or with an already existing resource, respectively.

## Changes

- **2026-07-31** `b2c3116e633e` — 2 warning
  - added the new `SEMVER_GTE` enum value to the `milestones/items/strategies/items/constraints/items/operator` response property for the response status `200`
  - added the new `SEMVER_LTE` enum value to the `milestones/items/strategies/items/constraints/items/operator` response property for the response status `200`
- **2026-06-15** `774670258f04` — 1 warning, 4 info
  - added the new `REGEX` enum value to the `milestones/items/strategies/items/constraints/items/operator` response property for the response status `200`
  - added the optional property `milestones/items/strategies/items/disabled` to the response with the `200` status
  - added the optional property `safeguards/items/impactMetric/source` to the response with the `200` status
  - response property `milestones/items/strategies/items/strategyName` deprecated (stability: stable)
  - …1 more

[Change history](https://skmtc.dev/unleash/apis/unleash-api-3/changes/api/admin/projects/:project/features/:featureName/environments/:environment/release-plans/post.md)

---

[API](https://skmtc.dev/unleash/apis/unleash-api-3.md) · [All operations](https://skmtc.dev/unleash/apis/unleash-api-3/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/unleash/unleash-api-3/revisions/b2c3116e633e/schema)
