Introduction to Groups
See also:
In OpenReview, a Group object represents a collection of users (individuals or other groups) and serves as the core mechanism for managing permissions, roles, and access control. Groups define who can read, write, sign, or modify content such as Notes and Invitations. They are hierarchical and addressable using a path-like ID (e.g., ICLR.cc/2025/Conference/Reviewers
).
To give fine-grained control over readership, individuals within a conference are typically members of many groups. For example, a reviewer for the conference Test/2025/Conference
assigned to Submissions 1 and 10 would likely be in the following groups:
Reviewer group: This contains all reviewers that accepted the recruitment invitation
Test/2025/Conference/Reviewers
Relevant submission groups: These groups give assigned reviewers (rather than all reviewers) the ability to view and post reviews for submissions they are assigned to. In this case it would be:
Test/2025/Conference/Submission1/Reviewers
Test/2025/Conference/Submission10/Reviewers
Relevant anonymous groups: These groups give the reviewer the ability to remain anonymous during the review process:
Test/2025/Conference/Submission1/Reviewer_Axyz
,Test/2025/Conference/Submission10/Reviewer_Xyab
Structure
You can find a description of all fields of the Group
object in the API Reference. You will most often interact with the following key fields:
id: Unique identifier for the group (e.g.,
ICLR.cc/2025/Conference/Reviewers
).members: List of user IDs or group IDs that are members.
Retrieving Groups
You can retrieve groups using the get_group
or get_groups
method:
reviewer_group = client.get_group('Test/2025/Conference/Reviewers')
conference_groups = client.get_groups(prefix='Test/2025/Conference')
The prefix
parameter allows filtering by group ID hierarchy.
Quickstart: Get a list of all active venues
venues = client_v2.get_group(id='active_venues').members
print(venues)
Quickstart: See a venue's information
venue_group = client_v2.get_group("<VENUE_ID>")
Within this group, content
is a dictionary that contains information about the venue.
To see all possible keys contained in a venue group's content
object, you can use the following:
venue_group.content.keys()
You can query the information within this dictionary to get more information about the venue. For example: venue_group.get_content_value('submission_id')
will tell you the name of the Submission invitation.
Quickstart: Get pending invited Area Chairs/ Reviewers
#venue_id
venue_id = "<VENUE_ID>"
role = "Area_Chairs" #Alternatively, Reviewers, Senior_Area_Chairs
accepted = client_v2.get_group(venue_id + '/' + role)
invited = client_v2.get_group(venue_id + '/' + role +'/Invited')
declined = client_v2.get_group(venue_id + '/' + role + '/Declined')
pending_members = [m for m in invited.members if not m in accepted.members and not m in declined.members]
Working with groups
Most of the changes that you want to make with groups can be made from the UI. See the section Managing Groups for specific instructions on working with groups. In some specific cases, you may need to programmatically create or modify groups.
Creating Groups
The majority of groups are created automatically in the workflow. However, Program Chairs (but not other roles) have the access necessary to create groups, should they need to.
To add a group, you would use post_group_edit
function. This creates a group with a specific id that you can then add members to. As an example, if you ant to add an LLM Reviewer to each Submission Group 1:
The new group ID would be: MyConference/2025/Conference/Submission1/Reviewer_LLM
The full post_group_edit
call will look like this:
client.post_group_edit(
invitation='<venue_id>/-/Edit',
signatures=['<venue_id>'],
group=openreview.api.Group(
id = '<venue_id>/Submission<number>/Reviewer_New_Group',
readers = ['<venue_id>'],
signatures = ['<venue_id>'],
writers = ['<venue_id>'],
signatories = ['<venue_id>'],
)
)
Adding Members
To add members to a group, you use the function add_members_to_group
, where group
is the group id to add to, and members
is group or list of profile ids to add.
client.add_members_to_group(group='<venue_id>/Submission<number>/Reviewers',
members='<venue_id>/Submission<number>/Reviewer_New_Group')
An alternative approach uses the more general post_group_edit
function to modify groups which gives more flexibility how to modify groups. To use this function to add mamebers:
group = client_v2.get_group('<GROUP_ID>')
members = []
self.post_group_edit(invitation = f'{group.domain}/-/Edit',
signatures = group.signatures,
group = Group(
id = group.id,
members = {
'add': list(set(members)) #the keyword 'add' is used to add the members here
}
),
readers=group.signatures,
writers=group.signatures
)
Removing Members
The function post_group_edit
can also be used to remove members from a group by using the keyword remove
:
group = client_v2.get_group('<GROUP_ID>')
members = []
self.post_group_edit(invitation = f'{group.domain}/-/Edit',
signatures = group.signatures,
group = Group(
id = group.id,
members = {
'remove': list(set(members)) #the keyword 'remove' is used to remove the members here
}
),
readers=group.signatures,
writers=group.signatures
)
Replacing Members
Finally, post_group_edit
can also be used to replace the members of a group with new members with the keyword replace
.
members = []
self.post_group_edit(invitation = f'{group.domain}/-/Edit',
signatures = group.signatures,
group = Group(
id = group.id,
members = {
'replace': { 'index': 2, 'value': '~OpenReview_Profile1' }
}
),
readers=group.signatures,
writers=group.signatures
)
Last updated
Was this helpful?