# TESTING # QA team test cases. Test code exists but were these based on a list of steps required to produce a result? # Are there any real-world users of Unleash who are happy to read and test the Open API specification and make suggestions for improvement? Would they be happy to screen-record what they are doing (how they use the API will give invaluable insights)? # Ideally, you'd want developers using Java, Node.js, Go, Ruby, Python and .Net to test # Could there be a simple sample app that implemented all API calls (using realistic scenarios)? Might just be a consolidated version of the tests/e2e code with some triggers (buttons) and some UI to display outcomes. # OAS REVIEW # Move responses to root responses section in components (from schema section) # Issues with rendering as nested externaldocs from Swagger UI. See GET /admin/feature-types. Not an issue in other tools (see redoc.html) # Other candidates for $ref: createdAt, lastSeen/updatedAt, instanceId, appName/appNamePath, sdkVersion, feature toggle type titles, enabled, stale, weight # STYLE # Add style guide MD. UK/US = US, Newspaper/Movie, Plurals. &. What 's the closest match for Unleash? http://apistylebook.com/design/guidelines/ # OAS styler - Only use backticks for code samples and API paths. Use bold for schema items and italic for schema item settings openapi: 3.0.3 servers: - description: Local host url: 'http://localhost:4242/api' - description: Unleash open source demo url: 'http://unleash.herokuapp.com/api' # - description: Windows server # url: 'http://192.168.178.108:4242/api' tags: - name: Feature toggles description: Accessing feature toggles - name: Archive description: Handling Feature Toggle archiving and un-archiving - name: Events description: Identifying events on the Unleash server - name: Feature types description: Details of the five Unleash Feature Toggle types - name: Import and export description: Importing and exporting feature toggles and strategies - name: Metrics description: Determining usage of feature toggles and applications - name: Strategies description: Accessing and updating strategies - name: Client description: Client application aspects of the Unleash API info: title: Unleash API description: |- Unleash is an open source feature flag and toggle system for all your applications and services. # Try it out ## Try it in your browser Once you have [set your Unleash server up](https://unleash.github.io/docs/getting_started), you can test the API from inside your browser. The following assumes the server is running on localhost:4242. The following 'endpoints' (such as `GET /admin/metrics/applications`) provide reference documentation for the Unleash REST API. To try out API calls: 1. Navigate to an endpoint 2. Click **Try it out** - in the right-hand (black) panel 3. Customize the **Request body** and/or **Parameters**. 4. Click **Execute**. You will see the cURL request submitted to the API server and the corresponding response. ## Try it in Postman Alternatively, you can test the API in [Postman](https://app.getpostman.com/run-collection/8552ddcd4cc9fc012548) [![Run in Postman](https://run.pstmn.io/button.svg)](https://app.getpostman.com/run-collection/8552ddcd4cc9fc012548) version: 4.0.13 contact: name: The Unleash team url: 'https://unleash.github.io/' externalDocs: description: Unleash documentation url: 'https://unleash.github.io/docs/getting_started' paths: /client/register: post: summary: Registers a client instance with the Unleash server. description: You can retrieve this data with a `GET /admin/metrics/applications/{appName}` API call. operationId: clientRegister externalDocs: description: Client specification url: 'https://unleash.github.io/docs/client_specification' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/clientRegistrationSchema' tags: - Client responses: '202': description: Successful response - client has been registered '400': description: 'Bad body request (for example, appName is not correct)' '401': $ref: '#/components/responses/notAuthorizedResponse' x-code-samples: - lang: 'cURL' source: | curl --request POST \ --url http://localhost:4242/api/client/register \ --data '{"appName":"my-application","instanceId":"generated-732038-17080","sdkVersion":"unleash-client-node:3.4.0","strategies":[{"strategy":"default"}],"started":"2016-11-03T07:16:43.572Z","interval":10000}' /client/metrics: post: summary: Register a metrics *bucket*. description: A *bucket* is a set of metrics data that tells you how often a Feature Toggle was enabled or disabled during a specified period of time operationId: sendMetrics requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/metricsPayloadSchema' tags: - Client - Metrics responses: '202': description: Successful response - payload has been accepted '400': description: 'Bad body request (for example, appName is not correct)' '401': $ref: '#/components/responses/notAuthorizedResponse' x-code-samples: - lang: 'cURL' source: | curl --request POST \ --url http://localhost:4242/api/client/metrics \ --data '{"appName":"my-application","instanceId":"generated-732038-17080","bucket":{"start":"2020-12-08T13:50:00.000Z","stop":"2020-12-08T13:55:00.000Z","toggles":{"yesno":{"yesorno":"yes"},"metricsCount":{"count":1}}}}' /client/features: # Would normally $ref here but it tangles with an OAS bug - which affects both Redoc and Swagger UI - https://github.com/swagger-api/swagger-ui/issues/6249 (closed issue but still broken in latest release) get: summary: Fetches all feature toggles from the Unleash server. description: |- The response returns all active feature toggles and their current strategy configuration: - Feature toggles will have *at least* one strategy - Strategies have a `name` and `parameters` map. operationId: getClientFeatures externalDocs: description: Activation strategies url: 'https://unleash.github.io/docs/activation_strategy' tags: - Client - Feature toggles responses: '200': $ref: '#/components/responses/clientResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' x-code-samples: - lang: 'cURL' source: | curl --request GET \ --url http://localhost:4242/api/client/features '/client/features/{featureName}': get: summary: Fetches a specific Feature Toggle from the Unleash server. description: | The response returns the Feature Toggle's current strategy configuration: - It will have *at least* one configured strategy. - A strategy will have a *name* and *parameters* map. **This is mainly provided to help debug the API. Do not use for client implementations.** externalDocs: description: Activation strategies url: 'https://unleash.github.io/docs/activation_strategy' operationId: getClientFeature parameters: - $ref: '#/components/parameters/featureNamePath' tags: - Client - Feature toggles responses: '200': $ref: '#/components/responses/successResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' x-code-samples: - lang: 'cURL' source: | curl --request GET \ --url http://localhost:4242/api/client/features/featureName /admin/features: get: summary: Fetches all feature toggles from the Unleash server. description: | The response returns all active feature toggles and their current strategy configuration: - A feature toggle will have *at least* one configured strategy. - A strategy will have a `name` and `parameters` map. externalDocs: description: Activation strategies url: 'https://unleash.github.io/docs/activation_strategy' operationId: getFeatures tags: - Feature toggles responses: '200': $ref: '#/components/responses/successResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' x-code-samples: - lang: 'cURL' source: | curl --request GET \ --url http://localhost:4242/api/admin/features post: summary: Create a Feature Toggle description: Create a new Feature Toggle tags: - Feature toggles operationId: createFeatureToggle requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/featureToggleSchema' responses: '201': description: Feature Toggle successfully created '400': description: 'Bad body request (for example, Feature Toggle name is not unique)' '401': $ref: '#/components/responses/notAuthorizedResponse' x-code-samples: - lang: 'cURL' source: | curl --request POST \ --url http://localhost:4242/api/admin/features \ --data '[{"name":"featureX","description":"Toggles featureX on and off","type":"release","enabled":true,"stale":false,"strategies":[{"name":"default","editable":true,"description":"Default on/off strategy.","parameters":{"parameter":{"name":"groupId","type":"string","description":"Define activation groups to allow you to correlate across feature toggles.","required":false}}}],"variants":[{"name":"yellow","weight":20}],"createdAt":"string"}]' '/admin/features/{featureName}': get: summary: Fetches a specific Feature Toggle from the Unleash server. description: | The response returns the Feature Toggle's current strategy configuration: - It will have *at least* one configured strategy. - A strategy will have a *name* and *parameters* map. externalDocs: description: Activation strategies url: 'https://unleash.github.io/docs/activation_strategy' operationId: getFeature parameters: - $ref: '#/components/parameters/featureNamePath' tags: - Feature toggles responses: '200': $ref: '#/components/responses/successResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' x-code-samples: - lang: 'cURL' source: | curl --request GET \ --url http://localhost:4242/api/admin/features/featureName put: summary: Update a Feature Toggle description: Update a Feature Toggle. operationId: featureName tags: - Feature toggles parameters: - $ref: '#/components/parameters/featureNamePath' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/featureToggleSchema' responses: '200': $ref: '#/components/responses/successResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' '400': description: Bad body request (for example 'strategies' is not an array) '404': description: Feature Toggle not found x-code-samples: - lang: 'cURL' source: | curl --request PUT \ --url http://localhost:4242/api/admin/features/featureName \ --data '[{"name":"featureX","description":"Toggles featureX on and off","type":"release","enabled":true,"stale":false,"strategies":[{"name":"default","editable":true,"description":"Default on/off strategy.","parameters":{"parameter":{"name":"groupId","type":"string","description":"Define activation groups to allow you to correlate across feature toggles.","required":false}}}],"variants":[{"name":"yellow","weight":20}],"createdAt":"string"}]' - lang: 'Go' source: | package main import ( "fmt" "strings" "net/http" "io/ioutil" ) func main() { url := "http://localhost:4242/api/admin/features/featureName" payload := strings.NewReader("[{\"name\":\"featureX\",\"description\":\"Toggles featureX on and off\",\"type\":\"release\",\"enabled\":true,\"stale\":false,\"strategies\":[{\"name\":\"default\",\"editable\":true,\"description\":\"Default on/off strategy.\",\"parameters\":{\"parameter\":{\"name\":\"groupId\",\"type\":\"string\",\"description\":\"Define activation groups to allow you to correlate across feature toggles.\",\"required\":false}}}],\"variants\":[{\"name\":\"yellow\",\"weight\":20}],\"createdAt\":\"string\"}]") req, _ := http.NewRequest("PUT", url, payload) res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := ioutil.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } - lang: 'Java' source: | AsyncHttpClient client = new DefaultAsyncHttpClient(); client.prepare("PUT", "http://localhost:4242/api/admin/features/featureName") .setBody("[{\"name\":\"featureX\",\"description\":\"Toggles featureX on and off\",\"type\":\"release\",\"enabled\":true,\"stale\":false,\"strategies\":[{\"name\":\"default\",\"editable\":true,\"description\":\"Default on/off strategy.\",\"parameters\":{\"parameter\":{\"name\":\"groupId\",\"type\":\"string\",\"description\":\"Define activation groups to allow you to correlate across feature toggles.\",\"required\":false}}}],\"variants\":[{\"name\":\"yellow\",\"weight\":20}],\"createdAt\":\"string\"}]") .execute() .toCompletableFuture() .thenAccept(System.out::println) .join(); client.close(); - lang: 'Python' source: | import requests url = "http://localhost:4242/api/admin/features/featureName" payload = "[{\"name\":\"featureX\",\"description\":\"Toggles featureX on and off\",\"type\":\"release\",\"enabled\":true,\"stale\":false,\"strategies\":[{\"name\":\"default\",\"editable\":true,\"description\":\"Default on/off strategy.\",\"parameters\":{\"parameter\":{\"name\":\"groupId\",\"type\":\"string\",\"description\":\"Define activation groups to allow you to correlate across feature toggles.\",\"required\":false}}}],\"variants\":[{\"name\":\"yellow\",\"weight\":20}],\"createdAt\":\"string\"}]" response = requests.request("PUT", url, data=payload) print(response.text) - lang: 'Ruby' source: | require 'uri' require 'net/http' url = URI("http://localhost:4242/api/admin/features/featureName") http = Net::HTTP.new(url.host, url.port) request = Net::HTTP::Put.new(url) request.body = "[{\"name\":\"featureX\",\"description\":\"Toggles featureX on and off\",\"type\":\"release\",\"enabled\":true,\"stale\":false,\"strategies\":[{\"name\":\"default\",\"editable\":true,\"description\":\"Default on/off strategy.\",\"parameters\":{\"parameter\":{\"name\":\"groupId\",\"type\":\"string\",\"description\":\"Define activation groups to allow you to correlate across feature toggles.\",\"required\":false}}}],\"variants\":[{\"name\":\"yellow\",\"weight\":20}],\"createdAt\":\"string\"}]" response = http.request(request) puts response.read_body - lang: 'JavaScript' source: | fetch("http://localhost:4242/api/admin/features/featureName", { "method": "PUT", "headers": {}, "body": "[{\"name\":\"featureX\",\"description\":\"Toggles featureX on and off\",\"type\":\"release\",\"enabled\":true,\"stale\":false,\"strategies\":[{\"name\":\"default\",\"editable\":true,\"description\":\"Default on/off strategy.\",\"parameters\":{\"parameter\":{\"name\":\"groupId\",\"type\":\"string\",\"description\":\"Define activation groups to allow you to correlate across feature toggles.\",\"required\":false}}}],\"variants\":[{\"name\":\"yellow\",\"weight\":20}],\"createdAt\":\"string\"}]" }) .then(response => { console.log(response); }) .catch(err => { console.error(err); }); delete: summary: Archive a Feature Toggle. description: | Feature toggles can only be archived - they cannot be deleted. If an old Feature Toggle *re-appears*, this is because someone else has created a new one with the same name. operationId: archiveFeatureToggle tags: - Feature toggles - Archive parameters: - $ref: '#/components/parameters/featureNamePath' responses: '200': description: Feature Toggle successfully archived '401': $ref: '#/components/responses/notAuthorizedResponse' '404': description: Feature Toggle not found x-code-samples: - lang: 'cURL' source: | curl --request DELETE \ --url http://localhost:4242/api/admin/features/featureName '/admin/features/{featureName}/toggle/on': post: summary: Enable a Feature Toggle. description: '**featureName** must match an existing Feature Toggle.' operationId: enableFeatureToggle tags: - Feature toggles parameters: - $ref: '#/components/parameters/featureNamePath' responses: '200': $ref: '#/components/responses/successResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' '404': description: Feature Toggle not found x-code-samples: - lang: 'cURL' source: | curl --request POST \ --url http://localhost:4242/api/admin/features/featureName/toggle/on '/admin/features/{featureName}/toggle/off': post: summary: Disable a Feature Toggle. description: '**featureName** must match an existing Feature Toggle.' operationId: disableFeatureToggle tags: - Feature toggles parameters: - $ref: '#/components/parameters/featureNamePath' responses: '200': $ref: '#/components/responses/successResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' '404': description: Feature Toggle not found x-code-samples: - lang: 'cURL' source: | curl --request POST \ --url http://localhost:4242/api/admin/features/featureName/toggle/off '/admin/features/{featureName}/stale/on': post: summary: Mark a Feature Toggle as 'stale' (deprecated). description: '**featureName** must match an existing Feature Toggle.' externalDocs: description: Feature Toggle types url: 'https://unleash.github.io/docs/feature_toggle_types' operationId: markFeatureToggleStale tags: - Feature toggles parameters: - $ref: '#/components/parameters/featureNamePath' responses: '200': $ref: '#/components/responses/successResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' '404': description: Feature Toggle not found x-code-samples: - lang: 'cURL' source: | curl --request POST \ --url http://localhost:4242/api/admin/features/featureName/stale/on '/admin/features/{featureName}/stale/off': post: summary: Mark a Feature Toggle as active. description: '**featureName** must match an existing Feature Toggle.' externalDocs: description: Feature Toggle types url: 'https://unleash.github.io/docs/feature_toggle_types' operationId: markFeatureToggleActive tags: - Feature toggles parameters: - $ref: '#/components/parameters/featureNamePath' responses: '200': $ref: '#/components/responses/successResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' '404': description: Feature Toggle not found x-code-samples: - lang: 'cURL' source: | curl --request POST \ --url http://localhost:4242/api/admin/features/featureName/stale/off /admin/archive/features: get: summary: List all the archived feature toggles on the Unleash server description: Archived feature toggles are those that have been previously deleted operationId: fetchArchivedToggles tags: - Archive responses: '200': $ref: '#/components/responses/successResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' '404': description: Feature Toggle not found x-code-samples: - lang: 'cURL' source: | curl --request GET \ --url http://localhost:4242/api/admin/archive/features '/admin/archive/revive/{featureName}': post: summary: Un-archive a Feature Toggle description: Restore a Feature Toggle that has been previously deleted operationId: reviveFeatureToggle tags: - Archive parameters: - $ref: '#/components/parameters/featureNamePath' responses: '200': description: Feature Toggle successfully revived '404': description: Feature Toggle not found x-code-samples: - lang: 'cURL' source: | curl --request POST \ --url http://localhost:4242/api/admin/archive/revive/featureName /admin/strategies: get: summary: Fetch all strategies and their parameters. description: Fetch all strategies and their parameters. operationId: getStrategies tags: - Strategies responses: '200': $ref: '#/components/responses/strategyExistsResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' x-code-samples: - lang: 'cURL' source: | curl --request GET \ --url http://localhost:4242/api/admin/strategies post: summary: Create Strategy description: Create Strategy operationId: createStrategy tags: - Strategies requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/createStrategy' responses: '201': description: Strategy successfully added '400': description: Bad body request (for example 'strategies' is not an array) '401': $ref: '#/components/responses/notAuthorizedResponse' '409': $ref: '#/components/responses/strategyExistsResponse' x-code-samples: - lang: 'cURL' source: | curl --request POST \ --url http://localhost:4242/api/admin/strategies \ --data '{"name":"gradualRollout","description":"Gradual rollout to logged in users","parameters":[{"name":"percentage","type":"percentage","description":"What percent of users should the new Feature Toggle be active for?","required":true}]}' '/admin/strategies/{strategyName}': put: summary: Update Strategy description: | Use to update a Strategy definition. **name** and **strategyName** must match and must also match an existing Strategy name. **Caution: It can be dangerous to change a Strategy (as the implementation also might need to be changed).** operationId: updateStrategy tags: - Strategies parameters: - $ref: '#/components/parameters/strategyNamePath' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/createStrategy' responses: '200': description: Strategy successfully updated. '401': $ref: '#/components/responses/notAuthorizedResponse' '404': description: Strategy not updated due to errors in query and/or request body (such as **name** and **strategyName** not matching). x-code-samples: - lang: 'cURL' source: | curl --request PUT \ --url http://localhost:4242/api/admin/strategies/strategyName \ --data '{"name":"gradualRollout","description":"Gradual rollout to logged in users","parameters":[{"name":"percentage","type":"percentage","description":"What percent of users should the new Feature Toggle be active for?","required":true}]}' /admin/metrics/seen-toggles: get: summary: Returns a list of applications and the feature toggles that Unleash has 'seen' for each application. description: 'It is only guaranteed that feature toggles reported by client applications within the last hour will be returned. However, in most cases, earlier reported feature toggles will also be returned.' operationId: seenToggles tags: - Metrics responses: '200': $ref: '#/components/responses/seenTogglesResponse' x-code-samples: - lang: 'cURL' source: | curl --request GET \ --url http://localhost:4242/api/admin/metrics/seen-toggles /admin/metrics/feature-toggles: get: summary: Gives 'last minute' and 'last hour' metrics for all active feature toggles (based on what was reported by the client applications). description: |- - **Yes** is the number of times a given feature toggle was enabled in a client applucation - **No** is the number of times it was disabled. operationId: featureToggles tags: - Metrics responses: '200': $ref: '#/components/responses/featureAccessResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' x-code-samples: - lang: 'cURL' source: | curl --request GET \ --url http://localhost:4242/api/admin/metrics/feature-toggles /admin/metrics/applications: get: summary: A list of known applications ('seen' by Unleash in the last two days) description: Also has a link for more details. operationId: getApplications tags: - Metrics responses: '200': $ref: '#/components/responses/applicationsResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' x-code-samples: - lang: 'cURL' source: | curl --request GET \ --url http://localhost:4242/api/admin/metrics/applications '/admin/metrics/applications/{appName}': get: summary: Details about a client application. description: 'Details include things such as instances, strategies implemented and seen feature toggles.' operationId: getApplicationDetails tags: - Metrics parameters: - $ref: '#/components/parameters/appNamePath' responses: '200': $ref: '#/components/responses/appDetailsResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' '500': description: Application name not found x-code-samples: - lang: 'cURL' source: | curl --request GET \ --url http://localhost:4242/api/admin/metrics/applications/appName /admin/metrics/seen-apps: get: summary: Details about seen applications description: (per Feature Toggle) operationId: seenApps tags: - Metrics responses: '200': $ref: '#/components/responses/applicationsResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' x-code-samples: - lang: 'cURL' source: | curl --request GET \ --url http://localhost:4242/api/admin/metrics/seen-apps /admin/events: get: operationId: get-admin-events summary: Fetch all changes in the Unleash system description: |- Returns one of the six event types: - feature-created - feature-updated - feature-archived - feature-revived - strategy-created - strategy-deleted tags: - Events responses: '200': $ref: '#/components/responses/eventsResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' x-code-samples: - lang: 'cURL' source: | curl --request GET \ --url http://localhost:4242/api/admin/events /admin/state/export: get: operationId: get-admin-state-export summary: Export feature toggles and strategies description: Exports a list of feature toggles and/or strategies in either JSON or YAML format. externalDocs: description: Import and export url: 'https://unleash.github.io/docs/import_export' tags: - Import and export parameters: - schema: type: string enum: - json - yaml in: query name: format description: | Choose export format, either json or yaml. json is the default example: json - schema: type: boolean in: query name: download example: false description: Do you want to export the data as a file? Default is false - schema: type: boolean in: query name: featureToggles description: Do you want to include feature toggles in the export? Default is true example: true - schema: type: boolean in: query name: strategies description: Do you want to include strategies in the export? Default is true example: true responses: '200': $ref: '#/components/responses/exportResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' x-code-samples: - lang: 'cURL' source: | curl --request GET \ --url http://localhost:4242/api/admin/state/export /admin/state/import: post: summary: Import feature toggles and strategies operationId: post-admin-state-import tags: - Import and export description: |- Upload the data, in JSON or YAML format. You can add in the POST body or upload a file - **POST body** (JSON format only) - next to **Request body**, choose the *application/json* dropdown option. - **File upload** (JOSN or YAML format) - next to **Request body**, choose the *multipart/form-data* dropdown option. This adopts the same schema as `GET /admin/state/export` externalDocs: description: Import and export url: 'https://unleash.github.io/docs/import_export' parameters: - schema: type: boolean default: 'false' example: false in: query name: drop description: Be careful using this in production environments. Set to true if you want the to remove all strategies and feature toggles from the datebase before import. Default is false. - schema: type: boolean default: 'false' example: false in: query name: keep description: Set to *true* if you want keep all existing feature toggles and strategies as is; only the missing feature toggles and strategies will be inserted from the import data. Default is true. example: true requestBody: content: multipart/form-data: schema: type: object properties: fileName: type: string format: binary application/json: schema: $ref: '#/components/schemas/200export' responses: '200': description: Successful import. '401': $ref: '#/components/responses/notAuthorizedResponse' '404': description: No import data provided. x-code-samples: - lang: 'cURL' source: | curl --request POST \ --url 'http://localhost:4242/api/admin/state/import?drop=false&keep=false' \ --data '{"fileName":"string"}' /admin/feature-types: get: summary: Fetch the list of Unleash feature types description: |- - release - experiment - ops - killswitch - permission operationId: get-admin-feature-types tags: - Feature types responses: '200': $ref: '#/components/responses/featureTypeResponse' '401': $ref: '#/components/responses/notAuthorizedResponse' x-code-samples: - lang: 'cURL' source: | curl --request GET \ --url http://localhost:4242/api/admin/feature-types components: parameters: featureNamePath: name: featureName description: Must match an existing Feature Toggle name. example: featureX required: true in: path schema: type: string strategyNamePath: name: strategyName required: true in: path description: Must match an existing Strategy name. example: flexibleRollout schema: type: string appNamePath: name: appName required: true in: path description: Must match an existing application name. example: my-application schema: type: string responses: successResponse: description: "Successful response" content: application/json: schema: $ref: '#/components/schemas/200' notAuthorizedResponse: description: "Not authorized" content: application/json: schema: $ref: '#/components/schemas/401' clientResponse: description: "Successful response" content: application/json: schema: $ref: '#/components/schemas/200Client' strategyExistsResponse: description: "Strategy already exists" content: application/json: schema: $ref: '#/components/schemas/409' strategyResponse: description: "Successful response" content: application/json: schema: $ref: '#/components/schemas/200strategy' seenTogglesResponse: description: "Successful response" content: application/json: schema: $ref: '#/components/schemas/200seen' featureAccessResponse: description: "Successful response" content: application/json: schema: $ref: '#/components/schemas/200feature' appDetailsResponse: description: "Successful response" content: application/json: schema: $ref: '#/components/schemas/200appdetails' applicationsResponse: description: "Successful response" content: application/json: schema: $ref: '#/components/schemas/applicationArray' eventsResponse: description: "Successful response" content: application/json: schema: $ref: '#/components/schemas/200-events' exportResponse: description: "Successful response" content: application/json: schema: $ref: '#/components/schemas/200export' featureTypeResponse: description: "Successful response" content: application/json: schema: $ref: '#/components/schemas/200featuretype' schemas: '200': type: object properties: version: $ref: '#/components/schemas/versionSchema' features: $ref: '#/components/schemas/featureToggleSchema' x-tags: - Responses '401': type: object properties: type: type: string minLength: 1 path: type: string minLength: 1 message: type: string minLength: 1 required: - type - path - message x-tags: - Responses '409': type: object required: - isJoi - name - details properties: isJoi: description: For internal use by the Unleash developers type: boolean name: description: Title of error type: string minLength: 1 details: type: array uniqueItems: true minItems: 1 items: required: - message properties: message: description: Error message type: string minLength: 1 x-tags: - Responses 200strategy: type: object required: - version - strategies properties: version: $ref: '#/components/schemas/versionSchema' strategies: $ref: '#/components/schemas/strategySchema' x-tags: - Responses createStrategy: type: object properties: name: type: string minLength: 1 example: gradualRollout description: type: string minLength: 1 example: Gradual rollout to logged in users parameters: type: array uniqueItems: true minItems: 1 items: required: - name - type - description - required properties: name: type: string minLength: 1 example: percentage type: type: string minLength: 1 example: percentage description: type: string minLength: 1 example: What percent of users should the new Feature Toggle be active for? required: type: boolean example: true required: - name - description - parameters x-tags: - Schemas 200seen: type: array minItems: 1 uniqueItems: true items: type: object required: - appName - seenToggles - metricsCount properties: appName: type: string minLength: 1 description: 'Application name' example: 'my-application' seenToggles: $ref: '#/components/schemas/toggleSchema' x-tags: - Responses 200feature: description: |- - **lastHour** - how many times a Feature Toggle was accessed in the last hour. - **lastMinute** - how many times a Feature Toggle was accessed in the last minute. type: array minItems: 1 uniqueItems: true items: type: object required: - appName - seenToggles properties: appName: type: string enum: - lastHour - lastMinute minLength: 1 example: lastHour seenToggles: $ref: '#/components/schemas/toggleSchema' x-tags: - Responses metricsPayloadSchema: description: A *bucket* of metrics data that tells you how often a Feature Toggle was enabled or disabled during a specified period of time type: object required: - appName - instanceId - bucket properties: appName: type: string description: 'The name of your application' example: 'my-application' instanceId: description: The name of the system running the application type: string minLength: 1 example: generated-732038-17080 bucket: type: object required: - start - stop - toggles properties: start: type: string description: 'The start time for your metrics (in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime))' example: '2020-12-08T13:50:00.000Z' stop: type: string description: 'The end time for your metrics (in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime))' example: '2020-12-08T13:55:00.000Z' toggles: $ref: '#/components/schemas/toggleSchema' x-tags: - Schemas toggleSchema: type: object required: - yesno - metricsCount properties: yesno: description: Was a Feature Toggle enabled (yes) or disabled (no)? type: object properties: yesorno: type: string enum: - 'yes' - 'no' example: 'yes' metricsCount: description: The number of times a Feature Toggle was enabled or disabled during the specified start and end time type: object properties: count: type: number example: 1 x-tags: - Schemas clientRegistrationSchema: type: object required: - appName - instanceId - strategies - started - interval properties: appName: type: string description: 'The name of your application' example: 'my-application' instanceId: type: string description: The name of the system running the application minLength: 1 example: generated-732038-17080 sdkVersion: description: The version of the Unleash client SDK running the application type: string example: 'unleash-client-node:3.4.0' strategies: type: array description: List of strategy names implemented by this application items: required: - strategy properties: strategy: type: string description: Strategy name minLength: 1 example: 'default' started: type: string description: 'When the client started (in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime))' example: '2016-11-03T07:16:43.572Z' interval: type: number description: 'How often to send metrics to the Unleash API (in milliseconds)' example: 10000 x-tags: - Schemas applicationArray: type: array items: $ref: '#/components/schemas/application' x-tags: - Schemas application: type: object required: - applications properties: applications: type: array uniqueItems: true minItems: 1 items: required: - appName - createdAt - updatedAt - strategies properties: appName: description: Application name type: string example: my-application createdAt: description: 'The first time the application registered with Unleash (in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime))' type: string example: '2016-12-09T14:56:36.730Z' updatedAt: description: 'The last time the application ''talked'' to Unleash (sent metrics, registered, fetched feature toggles) - in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime)' type: string example: '2020-11-14T09:55:23.653Z' description: description: A description of what the application does type: string strategies: description: A description of what the application does type: string url: description: Absolute URL to the actual application type: string example: 'http://someapp.internal.url' color: description: Deprecated. Do not use type: string icon: description: 'The application''s icon. Must be one of the [Material Design icon names](https://material.io/resources/icons/?style=baseline)' type: string example: comment_bank x-tags: - Schemas 200appdetails: type: object required: - application - instances - strategies - seenToggles properties: application: $ref: '#/components/schemas/application' strategies: $ref: '#/components/schemas/strategySchema' instances: type: object required: - appName - instanceId - sdkVersion - clientIp - lastSeen - createdAt properties: appName: description: Application name type: string minLength: 1 example: my-application instanceId: description: The name of the system running the application type: string minLength: 1 example: generated-732038-17080 sdkVersion: description: The version of the Unleash client SDK running the application type: string minLength: 1 example: 'unleash-client-node:3.4.0' clientIp: description: The IP address of the system running this instance of the application type: string minLength: 1 example: '::ffff:127.0.0.1' lastSeen: description: 'The last time the application ''talked'' to Unleash (sent metrics, registered, fetched feature toggles) - in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime)' type: string minLength: 1 example: '2020-11-14T11:17:24.482Z' createdAt: description: 'The first time the application registered with Unleash (in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime))' type: string minLength: 1 example: '2020-11-13T16:56:29.279Z' seenToggles: $ref: '#/components/schemas/featureToggleSchema' links: type: object properties: self: description: Deprecated. Do not use type: string minLength: 1 x-tags: - Responses featureToggleTypeSchema: type: string enum: - release - experiment - ops - killswitch - permission description: |- 'One of the five Unleash Feature Toggle types. **type** is optional. If not defined, it defaults to *release*' default: release externalDocs: description: Feature Toggle types url: 'https://unleash.github.io/docs/feature_toggle_types' minLength: 1 example: release x-tags: - Schemas versionSchema: type: number description: For internal use by the Unleash developers example: 1 x-tags: - Schemas featureToggleSchema: type: array items: type: object required: - name - description - type - enabled - stale - strategies properties: name: description: Feature Toggle name must be unique. type: string minLength: 1 example: featureX description: type: string minLength: 1 example: Toggles featureX on and off type: $ref: '#/components/schemas/featureToggleTypeSchema' enabled: description: Is the Feature Toggle enabled? type: boolean example: true stale: description: Is the Feature Toggle 'stale' (deprecated)? type: boolean example: false strategies: $ref: '#/components/schemas/strategySchema' variants: $ref: '#/components/schemas/variantsSchema' createdAt: type: string minLength: 1 x-tags: - Schemas strategySchema: type: array items: type: object properties: name: description: Name of the Strategy type: string minLength: 1 example: default editable: type: boolean example: true description: description: What the Strategy is type: string example: Default on/off strategy. parameters: type: object properties: parameter: type: object required: - name - type properties: name: description: The name of the parameter type: string example: groupId type: description: The type of the parameter type: string example: string description: description: What the parameter does type: string example: Define activation groups to allow you to correlate across feature toggles. required: description: Is this a required parameter? type: boolean example: false x-tags: - Schemas variantsSchema: externalDocs: description: How to use Feature Toggle variants url: 'https://unleash.github.io/docs/toggle_variants' type: array items: required: - name - weight properties: name: description: The name of the Feature Toggle variant type: string minLength: 1 example: yellow weight: description: |- A number between 0 and 1,000. The client SDK will summarize all variant weights, hash the number and divide the users among them. The distribution will be according to the weight as a fraction of the sum of weight. type: number example: 20 x-tags: - Schemas 200Client: type: object properties: version: $ref: '#/components/schemas/versionSchema' features: type: array uniqueItems: true minItems: 1 items: required: - name - description - type - enabled - stale - strategies - createdAt properties: name: type: string description: 'Feature Toggle name' minLength: 1 example: 'Demo' description: type: string description: 'A description of the Feature Toggle' minLength: 1 example: 'Show off fedfdfature toggles' type: type: string enum: - Release - Experiment - Operational - Kill switch - Permission description: 'The title of one of the five Feature Toggle types' minLength: 1 example: 'Operational' enabled: description: Is the Feature Toggle enabled? type: boolean example: true stale: description: Is the Feature Toggle 'stale' (deprecated)? type: boolean example: false strategies: $ref: '#/components/schemas/strategySchema' variants: type: array uniqueItems: true items: properties: name: type: string description: 'Variant name' minLength: 1 example: 'Red' weight: description: |- A number between 0 and 1,000. The client SDK will allocate traffic to each variant based on this weighting (as a fraction of the sum of all variant weights). **Examples** - You have four variants, each with a weight of 1000. The SDK will distribute traffic evenly: 25% each - You have two variants, one with a weight of 100 and one with a weight of 900. The SDK will send 90% of traffic to the variant with a weight of 900 type: number example: 20 weightType: type: string minLength: 1 example: 'variable' payload: type: object description: 'Optional data associated with the variant, consisting of a *type/value* pair (as defined in the SDK)' properties: type: type: string example: 'string' value: type: string example: 'Something' overrides: type: array description: An optional array of overrides. If any [context](https://unleash.github.io/docs/unleash_context) field matches any of these overrides, *this* variant will be selected. items: type: object properties: contextName: type: string description: 'One of the six context fields' enum: - userId - sessionId - remoteAddress - properties - appName - environment example: 'userId' values: type: array description: 'The value(s) for the context field' items: properties: value: type: string example: '123' createdAt: type: string minLength: 1 x-tags: - Responses 200-events: type: object properties: version: $ref: '#/components/schemas/versionSchema' events: type: array required: - id - type - createdBy - createdAt uniqueItems: true minItems: 1 items: properties: id: description: The event number. All events have a unique id. type: number example: 55 type: description: One of the six event types type: string enum: - feature-created - feature-updated - feature-archived - feature-revived - strategy-created - strategy-deleted minLength: 1 example: feature-updated createdBy: description: The current user's *email* or *username* (taken from the *User* object on the current session) type: string minLength: 1 createdAt: description: 'The first time the application registered with Unleash (in [ISO8601 format](https://www.w3.org/TR/NOTE-datetime))' type: string example: '2016-12-09T14:56:36.730Z' data: $ref: '#/components/schemas/featureToggleSchema' diffs: description: |- The JSON differences between the current and last version of the Feature Toggle. (Uses the [deep-diff Node.js module](https://www.npmjs.com/package/deep-diff)) externalDocs: description: Activation strategies url: 'https://www.npmjs.com/package/deep-diff#differences' type: array items: required: - kind - lhs - rhs properties: kind: description: |- The kind of change: - **N** - a newly-added property or element - **D** - a property or element was deleted - **E** - a property or element was edited - **A** - a change occurred within an array type: string enum: - 'N' - D - E - A example: E path: type: array items: required: - pathItem properties: pathItem: description: The property path (from the left-hand-side root) type: string example: enabled lhs: description: The value on the left-hand-side of the comparison (*undefined* if **kind** is *N*) type: boolean example: true rhs: description: The value on the right-hand-side of the comparison (*undefined* if **kind** is *D*) type: boolean example: false x-tags: - Responses 200export: type: object required: - version - features - strategies properties: version: $ref: '#/components/schemas/versionSchema' features: $ref: '#/components/schemas/featureToggleSchema' strategies: $ref: '#/components/schemas/strategySchema' x-tags: - Responses 200featuretype: type: object required: - version - types properties: version: $ref: '#/components/schemas/versionSchema' types: type: array uniqueItems: true minItems: 1 items: required: - id - name - description - lifetimeDays properties: id: $ref: '#/components/schemas/featureToggleTypeSchema' name: description: The title of the Feature Toggle type type: string enum: - Release - Experiment - Operational - Kill switch - Permission minLength: 1 example: Release description: description: A description of what this Feature Toggle type could be used for type: string enum: - Enables trunk-based development for teams practicing continuous delivery - Performs multivariate or A/B testing - Controls operational aspects of the system behavior - Gracefully degrades system functionality - Changes the features or product experiences that certain users receive minLength: 1 lifetimeDays: description: The number of days this Feature Toggle is intended to be used. This information is used to issue deprecation notices externalDocs: description: Feature Toggle types url: 'https://unleash.github.io/docs/feature_toggle_types' type: number example: 40 x-tags: - Responses