# Could do withe an overview. What is it? What does it do? Who is it for? Why would I use this? For a good example, see https://ionicframework.com/docs or https://cloud.ibm.com/docs/assistant?topic=assistant-index#index
# Getting started - I have made some tweaks to this but it would be handy to also provide some JS code to make an example API call. PUT /admin/features/{featureName} is a good choice (since it has both a Request body and a query parameter). Twilio is brilliant example of this kind of stuff. https://www.twilio.com/docs/quickstart
# Status and error codes - It would be useful to generate a simple table listing all status codes. See how Clearbit does it: https://clearbit.com/docs?python#errors
# Rate limiting and thresholds - Need to inform people of this even if it's not a 'thing', they will ask. See https://unleash-community.slack.com/archives/CGP2MCHPF/p1603106990003200 See how Twitter API describes their limits: https://developer.twitter.com/en/docs/twitter-api/rate-limits
# Glossary - Need definitions for, as a start, the project specific stuff: Unleash server, Unleash client, Feature Toggle, Strategy, Variant, Diff. Doesn't need to be massive. For instance, see the Lyft glossary - https://developer.lyft.com/docs/glossary
# Reference - Is the guidance on the documentation site complete? Add 'workflows': tasks that bundle several API calls to achieve common goals. Check Unleash Slack channel for potential examples
# 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)
# Create output in other non-Swagger styles (as well as Redoc) - such as Readme
# Other candidates for $ref: createdAt, lastSeen/updatedAt
# REDOC
# 'Try it out' instructions do not apply since the free version of Redoc has no such feature.
# 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
description:Handling Feature Toggle archiving and un-archiving
- name:Events
description:Identifying events on the Unleash server
- name:Feature toggles
description:Accessing feature toggles
- 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
info:
title:Unleash API
description:|-
Unleash is an open source feature flag and toggle system for all your applications and services.
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. Expand an endpoint
2. Click **Try it out**
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.
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)
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();
.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\"}]")
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\"}]"
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\"}]"
"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':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
'404':
description:Feature Toggle not found
'/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':
description:Successful response
content:
application/json:
schema:
$ref:'#/components/schemas/200'
'401':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
'404':
description:Feature Toggle not found
'/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':
description:Successful response
content:
application/json:
schema:
$ref:'#/components/schemas/200'
'401':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
'404':
description:Feature Toggle not found
'/admin/features/{featureName}/stale/on':
post:
summary:Mark a Feature Toggle as 'stale' (deprecated).
description:'**featureName** must match an existing Feature Toggle.'
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':
description:Successful response
content:
application/json:
schema:
$ref:'#/components/schemas/200'
'401':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
'404':
description:Feature Toggle not found
'/admin/archive/revive/{featureName}':
post:
summary:Un-archive a Feature Toggle
description:The Feature Toggle had 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
/admin/strategies:
get:
summary:Fetch all strategies and their parameters.
description:Fetch all strategies and their parameters.
operationId:getStrategies
tags:
- Strategies
responses:
'200':
description:Successful response
content:
application/json:
schema:
$ref:'#/components/schemas/200strategy'
'401':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
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':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
'409':
description:Strategy already exists
content:
application/json:
schema:
$ref:'#/components/schemas/409'
'/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':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
'404':
description:Strategy not updated due to errors in query and/or request body (such as **name** and **strategyName** not matching).
/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':
description:Successful response
content:
application/json:
schema:
$ref:'#/components/schemas/200seen'
/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':
description:Successful response
content:
application/json:
schema:
$ref:'#/components/schemas/200feature'
'401':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
/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':
description:Successful response
content:
application/json:
schema:
$ref:'#/components/schemas/applicationArray'
'401':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
'/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':
description:Successful response
content:
application/json:
schema:
$ref:'#/components/schemas/200appdetails'
'401':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
'500':
description:Application name not found
/admin/metrics/seen-apps:
get:
summary:Details about seen applications
description:(per Feature Toggle)
operationId:seenApps
tags:
- Metrics
responses:
'200':
description:Successful response
content:
application/json:
schema:
$ref:'#/components/schemas/applicationArray'
'401':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
/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':
description:OK
content:
application/json:
schema:
$ref:'#/components/schemas/200-events'
'401':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
/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.
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':
description:OK
content:
application/json:
schema:
$ref:'#/components/schemas/200export'
'401':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
/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
- **POSTbody** (JSON format only) - next to **Request body**, choose the *application/json* dropdown option.
- **Fileupload** (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`
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':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
'404':
description:Noimport data provided.
/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':
description:OK
content:
application/json:
schema:
$ref:'#/components/schemas/200featuretype'
'401':
description:Not authorized
content:
application/json:
schema:
$ref:'#/components/schemas/401'
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
schemas:
'200':
title:Successful response
type:object
properties:
version:
$ref:'#/components/schemas/versionSchema'
features:
$ref:'#/components/schemas/featureToggleSchema'
x-tags:
- Responses
'401':
description:Not authorized
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
seenToggles:
type:array
items:
properties:{}
metricsCount:
type:number
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:
type:object
required:
- yesno
- metricsCount
properties:
yesno:
type:string
enum:
- 'yes'
- 'no'
metricsCount:
type:number
x-tags:
- Responses
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*'
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
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))