For clean Markdown of any page, append .md to the page URL. For a complete documentation index, see https://docs.getunleash.io/api/llms.txt. For full documentation content, see https://docs.getunleash.io/api/llms-full.txt.

# [BETA] Update a milestone strategy

PUT https://app.unleash-instance.example.com/api/admin/projects/{project}/features/{featureName}/environments/{environment}/milestone-strategies/{strategyId}
Content-Type: application/json

**Enterprise feature**

**[BETA]** This API is in beta state, which means it may change or be removed in the future.

Update a milestone strategy configuration for a feature flag in the specified environment.

Reference: https://docs.getunleash.io/api/update-project-milestone-strategy

## OpenAPI Specification

```yaml
openapi: 3.1.0
info:
  title: admin-api
  version: 1.0.0
paths:
  /api/admin/projects/{project}/features/{featureName}/environments/{environment}/milestone-strategies/{strategyId}:
    put:
      operationId: update-project-milestone-strategy
      summary: '[BETA] Update a milestone strategy'
      description: >-
        **Enterprise feature**


        **[BETA]** This API is in beta state, which means it may change or be
        removed in the future.


        Update a milestone strategy configuration for a feature flag in the
        specified environment.
      tags:
        - subpackage_features
      parameters:
        - name: project
          in: path
          required: true
          schema:
            type: string
        - name: featureName
          in: path
          required: true
          schema:
            type: string
        - name: environment
          in: path
          required: true
          schema:
            type: string
        - name: strategyId
          in: path
          required: true
          schema:
            type: string
        - name: Authorization
          in: header
          description: API key needed to access this API
          required: true
          schema:
            type: string
      responses:
        '200':
          description: '#/components/schemas/releasePlanMilestoneStrategySchema'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/releasePlanMilestoneStrategySchema'
        '400':
          description: The request data does not match what we expect.
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/UpdateProjectMilestoneStrategyRequestBadRequestError
        '401':
          description: >-
            Authorization information is missing or invalid. Provide a valid API
            token as the `authorization` header, e.g.
            `authorization:*.*.my-admin-token`.
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/UpdateProjectMilestoneStrategyRequestUnauthorizedError
        '403':
          description: >-
            The provided user credentials are valid, but the user does not have
            the necessary permissions to perform this operation
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/UpdateProjectMilestoneStrategyRequestForbiddenError
        '404':
          description: The requested resource was not found.
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/UpdateProjectMilestoneStrategyRequestNotFoundError
      requestBody:
        description: updateMilestoneStrategySchema
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/updateMilestoneStrategySchema'
servers:
  - url: https://app.unleash-instance.example.com
components:
  schemas:
    ConstraintSchemaOperator:
      type: string
      enum:
        - 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
        - REGEX
      description: >-
        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).
      title: ConstraintSchemaOperator
    constraintSchema:
      type: object
      properties:
        contextName:
          type: string
          description: The name of the context field that this constraint should apply to.
        operator:
          $ref: '#/components/schemas/ConstraintSchemaOperator'
          description: >-
            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:
          type: boolean
          default: false
          description: >-
            Whether the operator should be case sensitive or not. Defaults to
            `false` (being case sensitive).
        inverted:
          type: boolean
          default: false
          description: >-
            Whether the result should be negated or not. If `true`, will turn a
            `true` result into a `false` result and vice versa.
        values:
          type: array
          items:
            type: string
          description: >-
            The context values that should be used for constraint evaluation.
            Use this property instead of `value` for properties that accept
            multiple values.
        value:
          type: string
          description: >-
            The context value that should be used for constraint evaluation. Use
            this property instead of `values` for properties that only accept
            single values.
      required:
        - contextName
        - operator
      description: >-
        A strategy constraint. For more information, refer to [the strategy
        constraint reference
        documentation](https://docs.getunleash.io/concepts/activation-strategies#constraints)
      title: constraintSchema
    StrategyVariantSchemaWeightType:
      type: string
      enum:
        - variable
        - fix
      description: >-
        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).
      title: StrategyVariantSchemaWeightType
    StrategyVariantSchemaPayloadType:
      type: string
      enum:
        - json
        - csv
        - string
        - number
      description: >-
        The type of the value. Commonly used types are string, number, json and
        csv.
      title: StrategyVariantSchemaPayloadType
    StrategyVariantSchemaPayload:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/StrategyVariantSchemaPayloadType'
          description: >-
            The type of the value. Commonly used types are string, number, json
            and csv.
        value:
          type: string
          description: The actual value of payload
      required:
        - type
        - value
      description: Extra data configured for this variant
      title: StrategyVariantSchemaPayload
    strategyVariantSchema:
      type: object
      properties:
        name:
          type: string
          description: The variant name. Must be unique for this feature flag
        weight:
          type: integer
          description: >-
            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:
          $ref: '#/components/schemas/StrategyVariantSchemaWeightType'
          description: >-
            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:
          type: string
          description: >-
            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:
          $ref: '#/components/schemas/StrategyVariantSchemaPayload'
          description: Extra data configured for this variant
      required:
        - name
        - weight
        - weightType
        - stickiness
      description: >-
        This is an experimental property. It may change or be removed as we work
        on it. Please don't depend on it yet. A strategy variant allows you to
        attach any data to strategies instead of only returning `true`/`false`.
        Strategy variants take precedence over feature variants.
      title: strategyVariantSchema
    parametersSchema:
      type: object
      additionalProperties:
        type: string
      description: A list of parameters for a strategy
      title: parametersSchema
    updateMilestoneStrategySchema:
      type: object
      properties:
        sortOrder:
          type: number
          format: double
          description: >-
            The order of the strategy in the list in feature environment
            configuration
        constraints:
          type: array
          items:
            $ref: '#/components/schemas/constraintSchema'
          description: >-
            A list of the constraints attached to the strategy. See
            https://docs.getunleash.io/concepts/activation-strategies#constraints
        title:
          type:
            - string
            - 'null'
          description: A descriptive title for the strategy
        disabled:
          type:
            - boolean
            - 'null'
          description: >-
            A toggle to disable the strategy. defaults to true. Disabled
            strategies are not evaluated or returned to the SDKs
        variants:
          type: array
          items:
            $ref: '#/components/schemas/strategyVariantSchema'
          description: Strategy level variants
        segments:
          type: array
          items:
            type: number
            format: double
          description: A list of segment ids attached to the strategy
        parameters:
          $ref: '#/components/schemas/parametersSchema'
      description: Update a milestone strategy configuration for a feature flag
      title: updateMilestoneStrategySchema
    CreateStrategyVariantSchemaWeightType:
      type: string
      enum:
        - variable
        - fix
      description: >-
        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).
      title: CreateStrategyVariantSchemaWeightType
    CreateStrategyVariantSchemaPayloadType:
      type: string
      enum:
        - json
        - csv
        - string
        - number
      description: >-
        The type of the value. Commonly used types are string, number, json and
        csv.
      title: CreateStrategyVariantSchemaPayloadType
    CreateStrategyVariantSchemaPayload:
      type: object
      properties:
        type:
          $ref: '#/components/schemas/CreateStrategyVariantSchemaPayloadType'
          description: >-
            The type of the value. Commonly used types are string, number, json
            and csv.
        value:
          type: string
          description: The actual value of payload
      required:
        - type
        - value
      description: Extra data configured for this variant
      title: CreateStrategyVariantSchemaPayload
    createStrategyVariantSchema:
      type: object
      properties:
        name:
          type: string
          description: The variant name. Must be unique for this feature flag
        weight:
          type: integer
          description: >-
            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:
          $ref: '#/components/schemas/CreateStrategyVariantSchemaWeightType'
          description: >-
            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:
          type: string
          description: >-
            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:
          $ref: '#/components/schemas/CreateStrategyVariantSchemaPayload'
          description: Extra data configured for this variant
      required:
        - name
        - weight
        - weightType
        - stickiness
      description: >-
        This is an experimental property. It may change or be removed as we work
        on it. Please don't depend on it yet. A strategy variant allows you to
        attach any data to strategies instead of only returning `true`/`false`.
        Strategy variants take precedence over feature variants.
      title: createStrategyVariantSchema
    releasePlanMilestoneStrategySchema:
      type: object
      properties:
        id:
          type: string
          description: The milestone strategy's ID. Milestone strategy IDs are ulids.
        milestoneId:
          type: string
          description: The ID of the milestone that this strategy belongs to.
        sortOrder:
          type: number
          format: double
          description: The order of the strategy in the list
        title:
          type:
            - string
            - 'null'
          description: A descriptive title for the strategy
        name:
          type: string
          description: The name of the strategy type
        strategyName:
          type: string
          description: The name of the strategy type
        parameters:
          $ref: '#/components/schemas/parametersSchema'
          description: An object containing the parameters for the strategy
        constraints:
          type: array
          items:
            $ref: '#/components/schemas/constraintSchema'
          description: >-
            A list of the constraints attached to the strategy. See
            https://docs.getunleash.io/concepts/activation-strategies#constraints
        variants:
          type: array
          items:
            $ref: '#/components/schemas/createStrategyVariantSchema'
          description: Strategy level variants
        segments:
          type: array
          items:
            type: number
            format: double
          description: Ids of segments to use for this strategy
        disabled:
          type:
            - boolean
            - 'null'
          description: >-
            A toggle to disable the strategy. defaults to false. Disabled
            strategies are not evaluated or returned to the SDKs
      required:
        - id
        - milestoneId
        - sortOrder
        - name
        - strategyName
      description: Schema representing the creation of a release plan milestone strategy.
      title: releasePlanMilestoneStrategySchema
    UpdateProjectMilestoneStrategyRequestBadRequestError:
      type: object
      properties:
        id:
          type: string
          description: The ID of the error instance
        name:
          type: string
          description: The name of the error kind
        message:
          type: string
          description: A description of what went wrong.
      title: UpdateProjectMilestoneStrategyRequestBadRequestError
    UpdateProjectMilestoneStrategyRequestUnauthorizedError:
      type: object
      properties:
        id:
          type: string
          description: The ID of the error instance
        name:
          type: string
          description: The name of the error kind
        message:
          type: string
          description: A description of what went wrong.
      title: UpdateProjectMilestoneStrategyRequestUnauthorizedError
    UpdateProjectMilestoneStrategyRequestForbiddenError:
      type: object
      properties:
        id:
          type: string
          description: The ID of the error instance
        name:
          type: string
          description: The name of the error kind
        message:
          type: string
          description: A description of what went wrong.
      title: UpdateProjectMilestoneStrategyRequestForbiddenError
    UpdateProjectMilestoneStrategyRequestNotFoundError:
      type: object
      properties:
        id:
          type: string
          description: The ID of the error instance
        name:
          type: string
          description: The name of the error kind
        message:
          type: string
          description: A description of what went wrong.
      title: UpdateProjectMilestoneStrategyRequestNotFoundError
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: Authorization
      description: API key needed to access this API
    bearerToken:
      type: http
      scheme: bearer
      description: API key needed to access this API, in Bearer token format

```

## SDK Code Examples

```python
import requests

url = "https://app.unleash-instance.example.com/api/admin/projects/project/features/featureName/environments/environment/milestone-strategies/strategyId"

payload = {}
headers = {
    "Authorization": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.put(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://app.unleash-instance.example.com/api/admin/projects/project/features/featureName/environments/environment/milestone-strategies/strategyId';
const options = {
  method: 'PUT',
  headers: {Authorization: '<apiKey>', 'Content-Type': 'application/json'},
  body: '{}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://app.unleash-instance.example.com/api/admin/projects/project/features/featureName/environments/environment/milestone-strategies/strategyId"

	payload := strings.NewReader("{}")

	req, _ := http.NewRequest("PUT", url, payload)

	req.Header.Add("Authorization", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://app.unleash-instance.example.com/api/admin/projects/project/features/featureName/environments/environment/milestone-strategies/strategyId")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)
request["Authorization"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.put("https://app.unleash-instance.example.com/api/admin/projects/project/features/featureName/environments/environment/milestone-strategies/strategyId")
  .header("Authorization", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('PUT', 'https://app.unleash-instance.example.com/api/admin/projects/project/features/featureName/environments/environment/milestone-strategies/strategyId', [
  'body' => '{}',
  'headers' => [
    'Authorization' => '<apiKey>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://app.unleash-instance.example.com/api/admin/projects/project/features/featureName/environments/environment/milestone-strategies/strategyId");
var request = new RestRequest(Method.PUT);
request.AddHeader("Authorization", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = [] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://app.unleash-instance.example.com/api/admin/projects/project/features/featureName/environments/environment/milestone-strategies/strategyId")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PUT"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```