# [BETA] Change a safeguard PUT https://app.unleash-instance.example.com/api/admin/projects/{project}/features/{featureName}/environments/{environment}/release-plans/{planId}/safeguards Content-Type: application/json **Enterprise feature** **[BETA]** This API is in beta state, which means it may change or be removed in the future. Creates or updates a safeguard for a specific feature, environment, and release plan. Reference: https://docs.getunleash.io/api/change-safeguard ## OpenAPI Specification ```yaml openapi: 3.1.1 info: title: '[BETA] Change a safeguard' version: endpoint_unstable.changeSafeguard paths: /api/admin/projects/{project}/features/{featureName}/environments/{environment}/release-plans/{planId}/safeguards: put: operationId: change-safeguard summary: '[BETA] Change a safeguard' description: >- **Enterprise feature** **[BETA]** This API is in beta state, which means it may change or be removed in the future. Creates or updates a safeguard for a specific feature, environment, and release plan. tags: - - subpackage_unstable 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: planId in: path required: true schema: type: string - name: Authorization in: header description: Header authentication of the form `undefined ` required: true schema: type: string responses: '204': description: This response has no body. content: application/json: schema: $ref: '#/components/schemas/Unstable_changeSafeguard_Response_204' '401': description: >- Authorization information is missing or invalid. Provide a valid API token as the `authorization` header, e.g. `authorization:*.*.my-admin-token`. content: {} '403': description: >- The provided user credentials are valid, but the user does not have the necessary permissions to perform this operation content: {} requestBody: description: createSafeguardSchema content: application/json: schema: $ref: '#/components/schemas/createSafeguardSchema' components: schemas: CreateSafeguardSchemaImpactMetricTimeRange: type: string enum: - value: hour - value: day - value: week - value: month CreateSafeguardSchemaImpactMetricAggregationMode: type: string enum: - value: rps - value: count - value: avg - value: sum - value: p95 - value: p99 - value: p50 CreateSafeguardSchemaImpactMetric: type: object properties: metricName: type: string description: >- The Prometheus metric series to query. It includes both unleash prefix and metric type and display name timeRange: $ref: '#/components/schemas/CreateSafeguardSchemaImpactMetricTimeRange' description: The time range for the metric data. aggregationMode: $ref: >- #/components/schemas/CreateSafeguardSchemaImpactMetricAggregationMode description: The aggregation mode for the metric data. labelSelectors: type: object additionalProperties: type: array items: type: string description: The selected labels and their values for filtering the metric data. required: - metricName - timeRange - aggregationMode - labelSelectors SafeguardTriggerConditionSchemaOperator: type: string enum: - value: '>' - value: < safeguardTriggerConditionSchema: type: object properties: operator: $ref: '#/components/schemas/SafeguardTriggerConditionSchemaOperator' description: The comparison operator for the threshold check. threshold: type: number format: double description: The threshold value to compare against. required: - operator - threshold createSafeguardSchema: type: object properties: impactMetric: $ref: '#/components/schemas/CreateSafeguardSchemaImpactMetric' description: Metric configuration that should be evaluated for the safeguard. triggerCondition: $ref: '#/components/schemas/safeguardTriggerConditionSchema' description: The condition that triggers the safeguard. required: - impactMetric - triggerCondition Unstable_changeSafeguard_Response_204: type: object properties: {} ``` ## SDK Code Examples ```python import requests url = "https://app.unleash-instance.example.com/api/admin/projects/project/features/featureName/environments/environment/release-plans/planId/safeguards" payload = { "impactMetric": { "metricName": "unleash_counter_feature_toggle_usage_total", "timeRange": "day", "aggregationMode": "rps", "labelSelectors": { "environment": ["development"], "project": ["default"] } }, "triggerCondition": { "operator": ">", "threshold": 100 } } headers = { "Authorization": "", "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/release-plans/planId/safeguards'; const options = { method: 'PUT', headers: {Authorization: '', 'Content-Type': 'application/json'}, body: '{"impactMetric":{"metricName":"unleash_counter_feature_toggle_usage_total","timeRange":"day","aggregationMode":"rps","labelSelectors":{"environment":["development"],"project":["default"]}},"triggerCondition":{"operator":">","threshold":100}}' }; 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/release-plans/planId/safeguards" payload := strings.NewReader("{\n \"impactMetric\": {\n \"metricName\": \"unleash_counter_feature_toggle_usage_total\",\n \"timeRange\": \"day\",\n \"aggregationMode\": \"rps\",\n \"labelSelectors\": {\n \"environment\": [\n \"development\"\n ],\n \"project\": [\n \"default\"\n ]\n }\n },\n \"triggerCondition\": {\n \"operator\": \">\",\n \"threshold\": 100\n }\n}") req, _ := http.NewRequest("PUT", url, payload) req.Header.Add("Authorization", "") 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/release-plans/planId/safeguards") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Put.new(url) request["Authorization"] = '' request["Content-Type"] = 'application/json' request.body = "{\n \"impactMetric\": {\n \"metricName\": \"unleash_counter_feature_toggle_usage_total\",\n \"timeRange\": \"day\",\n \"aggregationMode\": \"rps\",\n \"labelSelectors\": {\n \"environment\": [\n \"development\"\n ],\n \"project\": [\n \"default\"\n ]\n }\n },\n \"triggerCondition\": {\n \"operator\": \">\",\n \"threshold\": 100\n }\n}" response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.put("https://app.unleash-instance.example.com/api/admin/projects/project/features/featureName/environments/environment/release-plans/planId/safeguards") .header("Authorization", "") .header("Content-Type", "application/json") .body("{\n \"impactMetric\": {\n \"metricName\": \"unleash_counter_feature_toggle_usage_total\",\n \"timeRange\": \"day\",\n \"aggregationMode\": \"rps\",\n \"labelSelectors\": {\n \"environment\": [\n \"development\"\n ],\n \"project\": [\n \"default\"\n ]\n }\n },\n \"triggerCondition\": {\n \"operator\": \">\",\n \"threshold\": 100\n }\n}") .asString(); ``` ```php request('PUT', 'https://app.unleash-instance.example.com/api/admin/projects/project/features/featureName/environments/environment/release-plans/planId/safeguards', [ 'body' => '{ "impactMetric": { "metricName": "unleash_counter_feature_toggle_usage_total", "timeRange": "day", "aggregationMode": "rps", "labelSelectors": { "environment": [ "development" ], "project": [ "default" ] } }, "triggerCondition": { "operator": ">", "threshold": 100 } }', 'headers' => [ 'Authorization' => '', '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/release-plans/planId/safeguards"); var request = new RestRequest(Method.PUT); request.AddHeader("Authorization", ""); request.AddHeader("Content-Type", "application/json"); request.AddParameter("application/json", "{\n \"impactMetric\": {\n \"metricName\": \"unleash_counter_feature_toggle_usage_total\",\n \"timeRange\": \"day\",\n \"aggregationMode\": \"rps\",\n \"labelSelectors\": {\n \"environment\": [\n \"development\"\n ],\n \"project\": [\n \"default\"\n ]\n }\n },\n \"triggerCondition\": {\n \"operator\": \">\",\n \"threshold\": 100\n }\n}", ParameterType.RequestBody); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = [ "Authorization": "", "Content-Type": "application/json" ] let parameters = [ "impactMetric": [ "metricName": "unleash_counter_feature_toggle_usage_total", "timeRange": "day", "aggregationMode": "rps", "labelSelectors": [ "environment": ["development"], "project": ["default"] ] ], "triggerCondition": [ "operator": ">", "threshold": 100 ] ] 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/release-plans/planId/safeguards")! 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() ```