Optimizely Groups API
APIs to interact with mutual exclusion groups
APIs to interact with mutual exclusion groups
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/optimizely-groups-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
openapi: 3.2.0
info:
title: Optimizely Groups API
x-refined-note:
- x-logo differs across the merged source definitions and was not carried
version: '1.0'
description: 'Operations tagged Groups across 2 of this provider''s published API definitions: optimizely-feature-experimentation-optimizely-feature-experimentation-api-openapi.json, optimizely-web-experimentation-optimizely-api-openapi.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.optimizely.com/flags/v1/
- url: https://api.optimizely.com/v2
security:
- apiKey: []
- OAuth2:
- read
- write
tags:
- description: APIs to interact with mutual exclusion groups
name: Groups
paths:
/projects/{project_id}/groups:
get:
description: 'Get a list of exclusion groups within a project
You can use query parameters to filter/sort the response.
'
operationId: list_groups
parameters:
- $ref: '#/components/parameters/projectId'
- $ref: '#/components/parameters/perPage'
- $ref: '#/components/parameters/pageToken'
- $ref: '#/components/parameters/pageWindow'
- allowReserved: true
description: 'Sort the Groups based on the attributes from left to right.
'
in: query
name: sort
required: false
schema:
items:
enum:
- name:asc
- name:desc
- created_time:asc
- created_time:desc
- updated_time:asc
- updated_time:desc
type: string
type: array
- description: 'Filter the Groups by archived. A Group can be either archived (archived=true) or unarchived (archived=false)
'
in: query
name: archived
required: false
schema:
type: boolean
- description: 'Filter the Groups by enabled. A Group can be either enabled (enabled=true) or disabled (enabled=false)
'
in: query
name: enabled
required: false
schema:
type: boolean
- description: 'Filter the Groups by the environment
'
in: query
name: environment
required: false
schema:
items:
example: production
type: string
type: array
- description: 'Filter the Groups by name or
description substring
'
in: query
name: query
required: false
schema:
type: string
- description: 'Ensure that the group id listed is returned first
'
explode: false
in: query
name: include
required: false
schema:
items:
type: string
type: array
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Groups'
description: 'Successful retrieval of a page of Groups.
The response includes RESTful JSON (https://restfuljson.org/) styled links and pagination metadata.
Objects in this API MAY include a url property for a link to itself and MAY append _url to properties for related links.
If a link is not present in the response, it indicates a user is not authorized to access the related resource.
'
'400':
$ref: '#/components/responses/BadRequestResponse'
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'403':
$ref: '#/components/responses/ForbiddenResponse'
summary: List Exclusion Groups
tags:
- Groups
patch:
description: 'Update one or more Groups in a project using a json patch structure.
Properties that are readOnly that are present in the request body will be ignored as well as
unknown properties.
'
operationId: update_groups
parameters:
- $ref: '#/components/parameters/projectId'
requestBody:
content:
application/json-patch+json:
example:
- op: replace
path: /123/rules/456/traffic_allocation
value: 8000
schema:
items:
$ref: '#/components/schemas/PatchRequestBody'
type: array
required: true
responses:
'200':
content:
application/json:
example:
'987':
archive_url: /projects/12345/groups/archived
archived: false
created_time: '2019-05-08T00:00:00.000Z'
delete_url: /projects/12345/groups/456
description: Updated description for group
environment_key: production
id: 987
name: Promo Group
project_id: 12345
rules:
'456':
created_time: '2022-01-08T00:00:00.000Z'
flag_key: recurring_revenue
flag_name: Recurring Revenue
flag_status: unarchived
rule_key: experiment_one
rule_name: Experiment One
traffic_allocation: 2000
updated_time: '2022-01-08T00:00:00.000Z'
unarchive_url: /projects/12345/groups/unarchived
update_url: /projects/12345/groups
updated_time: '2019-05-08T00:00:00.000Z'
url: /projects/12345/groups/456
urn: groups.flag.optimizely.com::987
schema:
$ref: '#/components/schemas/GroupMap'
description: 'Successful update, archive or unarchive of Groups.
The response includes RESTful JSON (https://restfuljson.org/) styled links. If a
link is not present in the response, it indicates a user is not authorized to access
the related resource.
'
'400':
$ref: '#/components/responses/BadRequestResponse'
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'403':
$ref: '#/components/responses/ForbiddenResponse'
'404':
$ref: '#/components/responses/NotFoundResponse'
'409':
$ref: '#/components/responses/ConflictResponse'
summary: Update Exclusion Groups
tags:
- Groups
post:
description: 'Creates a new exclusion group in a project.
This operation corresponds to the `create_url` in a Groups response.
Required properties must be present in the request body.
Note that key for each object in "rules" (if provided), must be a stringified
rule ID.
'
operationId: create_group
parameters:
- $ref: '#/components/parameters/projectId'
requestBody:
$ref: '#/components/requestBodies/GroupRequest'
responses:
'201':
$ref: '#/components/responses/GroupSuccessResponse'
'400':
$ref: '#/components/responses/BadRequestResponse'
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'403':
$ref: '#/components/responses/ForbiddenResponse'
summary: Create an Exclusion Group
tags:
- Groups
servers:
- url: https://api.optimizely.com/flags/v1/
/projects/{project_id}/groups/archived:
post:
description: 'Archive one or more exclusion groups in a project.
This operation corresponds to the `archive_url` in a Groups response.
'
operationId: archive_groups
parameters:
- $ref: '#/components/parameters/projectId'
requestBody:
content:
application/json:
example:
keys:
- 1, 2
schema:
$ref: '#/components/schemas/BulkOperationsRequestBody'
required: true
responses:
'200':
content:
application/json:
example:
'987':
archive_url: /projects/12345/groups/archived
archived: true
created_time: '2019-05-08T00:00:00.000Z'
description: Promo group description
environment_key: production
id: 987
name: Promo group
project_id: 12345
revision: 1
rules:
'321':
created_time: '2022-01-08T00:00:00.000Z'
flag_key: recurring_revenue
flag_name: Recurring Revenue
flag_status: unarchived
rule_key: experiment_one
rule_name: Experiment One
traffic_allocation: 2000
updated_time: '2022-01-08T00:00:00.000Z'
unarchive_url: /projects/12345/groups/unarchived
update_url: /projects/12345/groups
updated_time: '2019-05-08T00:00:00.000Z'
url: /projects/12345/groups/123
urn: groups.flag.optimizely.com::987
schema:
$ref: '#/components/schemas/GroupMap'
description: 'Successful archive of Groups.
The response includes RESTful JSON (https://restfuljson.org/) styled links. If a
link is not present in the response, it indicates a user is not authorized to access
the related resource.
'
'400':
$ref: '#/components/responses/BadRequestResponse'
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'403':
$ref: '#/components/responses/ForbiddenResponse'
'404':
$ref: '#/components/responses/NotFoundResponse'
'409':
$ref: '#/components/responses/ConflictResponse'
summary: Archive Exclusion Groups
tags:
- Groups
servers:
- url: https://api.optimizely.com/flags/v1/
/projects/{project_id}/groups/unarchived:
post:
description: 'Unarchive one or more exclusion groups in a project.
This operation corresponds to the `unarchive_url` in a Groups response.
'
operationId: unarchive_groups
parameters:
- $ref: '#/components/parameters/projectId'
requestBody:
content:
application/json:
example:
keys:
- 1,2
schema:
$ref: '#/components/schemas/BulkOperationsRequestBody'
required: true
responses:
'200':
content:
application/json:
example:
'987':
archive_url: /projects/12345/groups/archived
archived: false
created_time: '2019-05-08T00:00:00.000Z'
description: Promo group description
environment_key: production
id: 987
name: Promo group
project_id: 12345
revision: 1
rules:
'321':
created_time: '2022-01-08T00:00:00.000Z'
flag_key: recurring_revenue
flag_name: Recurring Revenue
flag_status: unarchived
rule_key: experiment_one
rule_name: Experiment One
traffic_allocation: 2000
updated_time: '2022-01-08T00:00:00.000Z'
unarchive_url: /projects/12345/groups/unarchived
update_url: /projects/12345/groups
updated_time: '2019-05-08T00:00:00.000Z'
url: /projects/12345/groups/123
urn: groups.flag.optimizely.com::987
schema:
$ref: '#/components/schemas/GroupMap'
description: 'Successful unarchive of Groups.
The response includes RESTful JSON (https://restfuljson.org/) styled links. If a
link is not present in the response, it indicates a user is not authorized to access
the related resource.
'
'400':
$ref: '#/components/responses/BadRequestResponse'
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'403':
$ref: '#/components/responses/ForbiddenResponse'
'404':
$ref: '#/components/responses/NotFoundResponse'
'409':
$ref: '#/components/responses/ConflictResponse'
summary: Unarchive Exclusion Groups
tags:
- Groups
servers:
- url: https://api.optimizely.com/flags/v1/
/projects/{project_id}/groups/{group_id}:
delete:
description: 'Permanently delete an exclusion group by id.
There will be no way to access this data after deleting. If you want to
stop seeing a Group without deleting it permanently, archive
instead.
'
operationId: delete_group
parameters:
- $ref: '#/components/parameters/projectId'
- $ref: '#/components/parameters/groupId'
responses:
'204':
$ref: '#/components/responses/NoContentResponse'
'400':
$ref: '#/components/responses/BadRequestResponse'
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'403':
$ref: '#/components/responses/ForbiddenResponse'
'404':
$ref: '#/components/responses/NotFoundResponse'
summary: Delete an Exclusion Group
tags:
- Groups
get:
description: 'Fetch a single exclusion group by its id.
This operation corresponds to the `fetch_group_url` in a Groups response.
'
operationId: fetch_group
parameters:
- $ref: '#/components/parameters/projectId'
- $ref: '#/components/parameters/groupId'
responses:
'200':
$ref: '#/components/responses/GroupSuccessResponse'
'400':
$ref: '#/components/responses/BadRequestResponse'
'401':
$ref: '#/components/responses/UnauthorizedResponse'
'403':
$ref: '#/components/responses/ForbiddenResponse'
'404':
$ref: '#/components/responses/NotFoundResponse'
summary: Fetch a Single Exclusion Group
tags:
- Groups
servers:
- url: https://api.optimizely.com/flags/v1/
/groups:
get:
description: List Exclusion Groups under a Project
operationId: list_groups
parameters:
- $ref: '#/components/parameters/per_page'
- $ref: '#/components/parameters/page'
- description: The ID of the Project you would like to list all Exclusion Groups for
in: query
name: project_id
required: true
schema:
format: int64
type: integer
responses:
'200':
content:
application/json:
schema:
items:
$ref: '#/components/schemas/Group_2'
type: array
description: Return all Exclusion Groups in the specified Project
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Invalid credentials
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: You do not have permission to access the Exclusion Groups in the specified Project
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Exclusion Groups not found
default:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Unexpected error
summary: List Exclusion Groups
tags:
- Groups
post:
description: Create a new Exclusion Group in a provided project
operationId: create_group
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Group_2'
description: A string in JSON format that includes all the fields to create an Exclusion Group
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/Group_2'
description: Return the created Exclusion Group
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Invalid request body content
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Invalid credentials
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: You do not have permission to create an Exclusion Group under the specified Project
default:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Unexpected error
summary: Create an Exclusion Group
tags:
- Groups
servers:
- url: https://api.optimizely.com/v2
/groups/{group_id}:
delete:
description: Archive an Exclusion Group by ID
operationId: delete_group
parameters:
- description: The ID of the Exclusion Group you'd like to archive
in: path
name: group_id
required: true
schema:
format: int64
type: integer
responses:
'204':
description: Successfully archived Exclusion Group
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Invalid credentials
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: You do not have permission to archive the specified Exclusion Group
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Exclusion Group not found
default:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Unexpected error
summary: Archive an Exclusion Group
tags:
- Groups
get:
description: Get an Exclusion Group by ID
operationId: get_group
parameters:
- description: The ID of the Exclusion Group you'd like to get
in: path
name: group_id
required: true
schema:
format: int64
type: integer
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Group_2'
description: Return Exclusion Group info
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Invalid ID supplied
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Invalid credentials
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: You do not have permission to access the specified Exclusion Group
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Exclusion Group not found
default:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Unexpected error
summary: Get an Exclusion Group
tags:
- Groups
patch:
description: Update an exclusion group by ID.
operationId: update_group
parameters:
- description: The group ID of the Exclusion Group you want to change
in: path
name: group_id
required: true
schema:
format: int64
type: integer
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/GroupUpdate'
description: A string in JSON format that includes all the fields you'd like to change for an Exclusion Group
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Group_2'
description: Return the updated Exclusion Group
'400':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Invalid ID or request body supplied
'401':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Invalid credentials
'403':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: You do not have permission to edit the specified Exclusion Group
'404':
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Experimentation Group not found
default:
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
description: Unexpected error
summary: Update an Exclusion Group
tags:
- Groups
servers:
- url: https://api.optimizely.com/v2
components:
schemas:
AudienceConditionsString:
description: A valid AudienceConditionsArray represented as a JSON string
example: "[\n \"or\",\n {\n \"audience_id\": 1038980040\n },\n {\n \"audience_id\": 1033280055\n },\n [\n \"not\",\n {\n \"audience_id\": 1120870079\n }\n ]\n]"
type: string
PatchRequestBody:
description: A JSONPatch document as defined by RFC 6902
properties:
from:
description: A JSON Pointer to the resource attribute
type: string
op:
description: The operation to be performed
enum:
- add
- remove
- replace
- move
- copy
- test
type: string
path:
description: A JSON-Pointer to the resource or the resource attribute
type: string
value:
anyOf:
- type: object
- items:
type: string
type: array
- $ref: '#/components/schemas/AudienceConditions'
- type: string
- type: integer
- type: boolean
- items:
$ref: '#/components/schemas/SubMetric'
type: array
description: The value to be used within the operations.
required:
- op
- path
type: object
AudienceConditionsArray:
example:
- or
- audience_id: 123
- - and
- audience_id: 456
- audience_id: 789
items:
anyOf:
- description: The logical operator to use (e.g. "and", "or", or "not"). This must be the first item in the audience_conditions array. The "not" operator may only be used in conjunction with a single condition or list.
type: string
- description: An invidual conditional, consisting of a JSON object with an "audience_id" value.
properties:
audience_id:
type: integer
required:
- audience_id
type: object
- $ref: '#/components/schemas/AudienceConditionsArray'
description: A nested AudienceConditionsArray
example:
- - and
- audience_id: 456
- audience_id: 789
type: array
SubMetric:
properties:
aggregator:
type: string
event_id:
type: integer
event_type:
type: string
field:
type:
- string
- 'null'
role:
enum:
- numerator
- denominator
type: string
scope:
type: string
type: object
GroupRule:
example:
traffic_allocation: 5000
properties:
flag_key:
description: The Key of the Flag this GroupRule is related
example: flag_key
readOnly: true
type: string
flag_name:
description: The name of the Flag this GroupRule is related to.
example: A Feature Flag
readOnly: true
type: string
flag_status:
description: Status of the Flag thie GroupRule is related
enum:
- archived
- unarchived
example: archived
readOnly: true
type: string
rule_enabled:
description: If the underlying Rule and Ruleset are both enabled
example: true
readOnly: true
type: boolean
rule_key:
description: The Key of the Rule this GroupRule belongs to
example: paid_users
readOnly: true
type: string
rule_name:
description: The Name of the Rule this GroupRule belongs to
example: Paid Users
readOnly: true
type: string
rule_status:
description: The status of the rule
example: draft
readOnly: true
type: string
traffic_allocation:
description: The traffic allocation for the Rule
example: 2000
maximum: 10000
minimum: 0
type: integer
required:
- traffic_allocation
type: object
GroupRuleMap:
additionalProperties:
$ref: '#/components/schemas/GroupRule'
description: Map of group rules that include rule id as key and group rule as value.
type: object
BulkOperationsRequestBody:
properties:
keys:
description: The list of resource keys to perform the desired operation
items:
type: string
type: array
type: object
Group:
example:
archive_url: /projects/12345/groups/archived
archived: false
created_time: '2019-05-08T00:00:00.000Z'
description: Promo group description
environment_key: production
id: 1
name: Promo group
project_id: 12345
revision: 1
role: viewer
rules:
'321':
created_time: '2022-01-08T00:00:00.000Z'
flag_key: recurring_revenue
flag_name: Recurring Revenue
flag_status: unarchived
rule_key: experiment_one
rule_name: Experiment One
traffic_allocation: 2000
updated_time: '2022-01-08T00:00:00.000Z'
unarchive_url: /projects/12345/groups/unarchived
update_url: /projects/12345/groups
updated_time: '2019-05-08T00:00:00.000Z'
url: /projects/12345/groups/123
urn: groups.flag.optimizely.com::1
properties:
archive_url:
allOf:
- $ref: '#/components/schemas/UrlValue'
example: '...'
readOnly: true
archived:
example: false
type: boolean
created_time:
example: '2019-05-08T00:00:00.000Z'
format: date-time
readOnly: true
type: string
delete_url:
allOf:
- $ref: '#/components/schemas/UrlValue'
readOnly: true
description:
example: promotion group
type: string
environment_key:
example: production
minLength: 1
type: string
id:
example: 1
readOnly: true
type: integer
name:
example: PromoGroup
type: string
project_id:
description: The ID of the Project this Group belongs to
format: int64
type: integer
revision:
description: Revision number for tracking changes
readOnly: true
type: integer
role:
description: Granular permission role
example: admin
readOnly: true
type: string
rules:
allOf:
- $ref: '#/components/schemas/GroupRuleMap'
unarchive_url:
allOf:
- $ref: '#/components/schemas/UrlValue'
example: '...'
readOnly: true
update_url:
allOf:
- $ref: '#/components/schemas/UrlValue'
example: '...'
readOnly: true
updated_time:
example: '2019-05-08T00:00:00.000Z'
format: date-time
readOnly: true
type: string
url:
allOf:
- $ref: '#/components/schemas/UrlValue'
description: Link to self
example: '...'
readOnly: true
urn:
description: The URN for the Group
example: groups.flag.optimizely.com::1
readOnly: true
type: string
required:
- id
- urn
- name
- environment_key
- created_time
- updated_time
type: object
Groups:
properties:
count:
description: Number of Groups on the current page.
example: 2
type: integer
create_url:
allOf:
- $ref: '#/components/schemas/UrlValue'
filter_url:
allOf:
- $ref: '#/components/schemas/UrlValue'
description: Url template like '.../{?filter}'
first_url:
allOf:
- $ref: '#/components/schemas/UrlValue'
description: Link to first page of Groups in a series.
example: /projects/123/groups?page_token=gASVCQAAAAAAAACMBTF8MnwylC4%3D#1
items:
items:
$ref: '#/components/schemas/Group'
type: array
last_url:
allOf:
- $ref: '#/components/schemas/UrlValue'
description: Link to the last page of Groups in a series.
example: /projects/123/groups?page_token=gASVCQAAAAAAAACMBTF8MnwylC4%3D#10
next_url:
allOf:
- $ref: '#/components/schemas/UrlList'
description: "List of links to next pages of Groups in a series.\n\n The first element in the array is the exact next page after the current record, etc.\n"
example:
- /projects/123/groups?page_token=gASVCQAAAAAAAACMBTF8MnwylC4%3D#6
- /projects/123/groups?page_token=gASVCQAAAAAAAACMBTF8MnwylC4%3D#7
page:
description: Number of the current page. 1-index based.
example: 5
type: integer
prev_url:
allOf:
- $ref: '#/components/schemas/UrlList'
description: 'List of links to previous pages of Groups in a series.
The first element in the array is the exact previous page before the current record, etc.
'
example:
- /projects/123/groups?page_token=gASVCQAAAAAAAACMBTF8MnwylC4%3D#4
- /projects/123/groups?page_token=gASVCQAAAAAAAACMBTF8MnwylC4%3D#3
reset_url:
allOf:
- $ref: '#/components/schemas/UrlValue'
description: Link to the default pages of Groups
example: '...'
sort_url:
allOf:
- $ref: '#/components/schemas/UrlValue'
description: Url template like '.../{?sort}'
total_count:
description: Total number of Groups for this series.
example: 20
type: integer
total_pages:
description: Total number of pages for this series.
example: 10
type: integer
url:
allOf:
- $ref: '#/components/schemas/UrlValue'
description: Link to self
# --- truncated at 32 KB (41 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/optimizely/refs/heads/main/openapi/optimizely-groups-api-openapi.yml