UW Groups Web Service (GWS)

The University of Washington Group Service API — UW-IT's institution-operated group registry and membership service. UW publishes the OpenAPI itself, with an explicit termsOfService (washington.edu/online/terms), an Apache-2.0 license declaration and a help@uw.edu contact, and its servers[] name the production, evaluation and development hosts as well as a deprecated UWCA-certificate host. eduPersonPrincipalName is modelled directly in the contract.

Operations 18

GET /group/{groupid} #
PUT /group/{groupid} #
DELETE /group/{groupid} #
PUT /groupMove/{groupid}
GET /group/{groupid}/member #
PUT /group/{groupid}/member #
GET /group/{groupid}/member?view=count #
GET /group/{groupid}/member/{memberid} #
PUT /group/{groupid}/member/{memberid} #
DELETE /group/{groupid}/member/{memberid} #
GET /group/{groupid}/effective_member #
GET /group/{groupid}/effective_member?view=count #
GET /group/{groupid}/effective_member/{memberid} #
GET /group/{groupid}/affiliate/{affiliate} #
PUT /group/{groupid}/affiliate/{affiliate} #
DELETE /group/{groupid}/affiliate/{affiliate} #
GET /group/{groupid}/history #
GET /search

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/groups-web-service"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

university-of-washington-groups-web-service-openapi.yml Raw ↑
openapi: 3.0.0
info:
  version: 2.3.x
  title: University of Washington Group Service API
  termsOfService: http://www.washington.edu/online/terms/
  contact:
    name: University of Washington
    email: help@uw.edu
  license:
    name: License
    url: http://www.apache.org/licenses/LICENSE-2.0.html
  description: "\n* This describes the Group Service /v3/ representations (GWS 2.3.x).\n* For /v2/ (xml) representations see the [v2 documentation](https://wiki.cac.washington.edu/x/ESBy).\n* See the wiki article [Group Service API](https://wiki.cac.washington.edu/x/hIIqBQ) for instructions and help with the Group Service.\n  The page includes access and authentication instructions.\n\n* The [yaml source](https://iam-tools.u.washington.edu/apis/gws/api.yaml) of this document.\n* Document modified: 2020-06-15\n"
servers:
- url: https://groups.uw.edu/group_sws/v3
  description: Production server - InCommon certificate
- url: https://eval.groups.uw.edu/group_sws/v3
  description: Evaluation server - InCommon certificate
- url: https://dev.groups.uw.edu/group_sws/v3
  description: Development server - InCommon certificate
- url: https://iam-ws.u.washington.edu/group_sws/v3
  description: Production server - UWCA certificate (deprecated)
externalDocs:
  description: UW-IT Groups Web Service (GWS) API documentation
  url: https://iam-tools.u.washington.edu/apis/gws/
tags:
- name: Groups
  description: Group information--except membership
- name: Membership
  description: Group membership information
- name: Searches
  description: Group and member searches
x-operator: institution
x-provenance:
  method: searched
  source: https://iam-tools.u.washington.edu/apis/gws/api.yaml
  generated: '2026-08-30'
  note: Fetched verbatim from the UW-IT IAM tools API documentation host on 2026-08-30 (HTTP 200). servers[] resolve to University of Washington registrable domains (uw.edu / washington.edu), so the operator is the institution, not a vendor. Only externalDocs, x-operator and x-provenance were added; info and paths are as published.
  pristine_copy: openapi/_original/university-of-washington-groups-web-service-v3.yaml
paths:
  /group/{groupid}:
    get:
      tags:
      - Groups
      description: Get the group referenced by the groupid.
      operationId: getGroup
      parameters:
      - name: groupid
        in: path
        description: group id or regid
        required: true
        schema:
          type: string
      - name: If-None-Match
        in: header
        description: Match nonce from GET ETag header
        schema:
          type: string
      - name: Accept
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      responses:
        '200':
          description: The requested Group
          headers:
            ETag:
              schema:
                type: integer
              description: Represents the current 'state' of the resource.  For If-Match, If-None-Match
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GroupResponse'
        '304':
          description: Group matches If-None-Match
        '404':
          $ref: '#/components/responses/404Error'
        '406':
          $ref: '#/components/responses/406Error'
    put:
      tags:
      - Groups
      description: Create or update a group.   The PUT and POST methods are identical.
      operationId: putGroup
      parameters:
      - name: groupid
        in: path
        description: group id regid
        required: true
        schema:
          type: string
      - name: synchronized
        in: query
        required: false
        description: Do not complete request until ldaps updated (default does not wait).
        schema:
          type: string
      - name: If-Match
        in: header
        description: Match nonce from GET ETag header. Use '*' to match any resource.  Required to update existing groups.
        schema:
          type: string
      - name: Accept
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      - name: Content-type
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      responses:
        '200':
          description: The updated group
          headers:
            ETag:
              schema:
                type: integer
              description: Represents the current 'state' of the resource.  For If-Match, If-None-Match
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GroupResponse'
        '201':
          description: 'The created group.

            * Content same as response 200.

            '
        '400':
          $ref: '#/components/responses/400Error'
        '401':
          $ref: '#/components/responses/401Error'
        '404':
          $ref: '#/components/responses/404Error'
        '406':
          $ref: '#/components/responses/406Error'
        '412':
          $ref: '#/components/responses/412Error'
        5xx:
          $ref: '#/components/responses/5xxError'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PutGroup'
        description: representation of the group
        required: true
    delete:
      tags:
      - Groups
      description: Delete a group
      operationId: deleteGroup
      parameters:
      - name: groupid
        in: path
        description: group id or regid
        required: true
        schema:
          type: string
      - name: If-Match
        in: header
        description: Match nonce from GET ETag header. Use '*' to match any resource.
        required: false
        schema:
          type: string
      responses:
        '200':
          description: Group deleted
          content:
            application/json:
              schema:
                type: object
                required:
                - schemas
                properties:
                  schemas:
                    $ref: '#/components/schemas/GroupSchema'
                  meta:
                    $ref: '#/components/schemas/ErrorMeta'
                  errors:
                    type: array
                    items:
                      type: object
                      properties:
                        status:
                          type: integer
                          enum:
                          - 200
                        notFound:
                          type: array
                          items:
                            id: null
                            type: string
        '401':
          $ref: '#/components/responses/401Error'
        '406':
          $ref: '#/components/responses/406Error'
  /groupMove/{groupid}:
    put:
      tags:
      - Groups
      description: "Renames a group or moves a group to a new stem.  \n* Idempotent if the group id is specified with a regid.\n* One of **newext** or **newstem** is required."
      parameters:
      - name: groupid
        in: path
        description: A group name or regid
        required: true
        schema:
          type: string
      - name: newext
        in: query
        description: The new 'leaf' name for the group
        schema:
          type: string
      - name: newstem
        in: query
        description: The new 'stem' part of the group
        schema:
          type: string
      responses:
        '200':
          description: The name was updated
        '400':
          $ref: '#/components/responses/400Error'
        '401':
          $ref: '#/components/responses/401Error'
        '406':
          $ref: '#/components/responses/406Error'
  /group/{groupid}/member:
    get:
      tags:
      - Membership
      description: Gets all direct members of the group
      operationId: getMembership
      parameters:
      - name: groupid
        in: path
        description: group id or regid
        required: true
        schema:
          type: string
          example: u_joeuser
      - name: source=registry
        in: query
        required: false
        description: 'handle request via the registry (default is a fast response cache)


          *This is a diagnostic tool.  Representations and availability may differ from those described here.*'
        schema:
          type: string
      - name: Accept
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      responses:
        '200':
          description: An array of members of the group
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Membership'
        '401':
          $ref: '#/components/responses/401Error'
        '403':
          $ref: '#/components/responses/403Error'
        '404':
          $ref: '#/components/responses/404Error'
        '406':
          $ref: '#/components/responses/406Error'
    put:
      tags:
      - Membership
      description: Put entire membership of the group.  The PUT and POST methods are identical.
      operationId: putMembership
      parameters:
      - name: groupid
        in: path
        description: group name or regid
        required: true
        schema:
          type: string
      - name: synchronized
        in: query
        required: false
        description: do not complete request until ldaps updated (default does not wait)
        schema:
          type: string
      - name: Accept
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      - name: Content-type
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      responses:
        '200':
          $ref: '#/components/responses/200ErrorM'
        '401':
          $ref: '#/components/responses/401Error'
        '404':
          $ref: '#/components/responses/404Error'
        '406':
          $ref: '#/components/responses/406Error'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PutMembership'
        description: representation of the membership
  /group/{groupid}/member?view=count:
    get:
      tags:
      - Membership
      description: Gets direct membership count
      operationId: getMembershipCount
      parameters:
      - name: groupid
        in: path
        description: group id or regid
        required: true
        schema:
          type: string
          example: u_joeuser
      - name: view=count
        in: query
        required: true
        description: Request only the direct membership count
      - name: source=registry
        in: query
        required: false
        description: 'handle request via the registry (default is a fast response cache)


          *This is a diagnostic tool.  Representations and availability may differ from those described here.*'
        schema:
          type: string
      - name: Accept
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      responses:
        '200':
          description: A count of members of the group
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MembershipCount'
        '401':
          $ref: '#/components/responses/401Error'
        '403':
          $ref: '#/components/responses/403Error'
        '404':
          $ref: '#/components/responses/404Error'
        '406':
          $ref: '#/components/responses/406Error'
  /group/{groupid}/member/{memberid}:
    get:
      tags:
      - Membership
      description: Gets one member of the group
      operationId: getMember
      parameters:
      - name: groupid
        in: path
        description: group id or regid
        required: true
        schema:
          type: string
      - name: memberid
        required: true
        in: path
        schema:
          type: string
      - name: source=registry
        in: query
        required: false
        description: 'handle request via the registry (default is a fast response cache)


          *This is a diagnostic tool.  Representations and availability may differ from those described here.*'
        schema:
          type: string
      - name: Accept
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      responses:
        '200':
          description: An array with the requested member of the group
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Membership'
        '401':
          $ref: '#/components/responses/401Error'
        '404':
          $ref: '#/components/responses/404Error'
        '406':
          $ref: '#/components/responses/406Error'
    put:
      tags:
      - Membership
      description: Put a member(s) into the group. Specified ids are added.  No members are removed.
      operationId: putMember
      parameters:
      - name: groupid
        in: path
        description: group id or regid
        required: true
        schema:
          type: string
      - name: memberid
        required: true
        in: path
        style: simple
        description: one or more member ids (comma separated, no spaces)
        schema:
          type: array
          items:
            type: string
      - name: synchronized
        in: query
        required: false
        description: do not complete request until ldaps updated (default does not wait)
        schema:
          type: string
      - name: Accept
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      - name: Content-type
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      responses:
        '200':
          $ref: '#/components/responses/200ErrorM'
        '401':
          $ref: '#/components/responses/401Error'
        '404':
          $ref: '#/components/responses/404Error'
        '406':
          $ref: '#/components/responses/406Error'
    delete:
      tags:
      - Membership
      description: Delete a member(s) from the group.  Specified ids are removed.
      operationId: deleteMember
      parameters:
      - name: groupid
        in: path
        description: group id or regid
        required: true
        schema:
          type: string
      - name: memberid
        required: true
        in: path
        style: simple
        description: one or more member ids (comma separated, no spaces)
        schema:
          type: array
          items:
            type: string
      - name: synchronized
        in: query
        required: false
        description: do not complete request until ldaps updated (default does not wait)
        schema:
          type: string
      responses:
        '200':
          description: Delete successful
        '401':
          $ref: '#/components/responses/401Error'
        '404':
          $ref: '#/components/responses/404Error'
        '406':
          $ref: '#/components/responses/406Error'
  /group/{groupid}/effective_member:
    get:
      tags:
      - Membership
      description: Gets all effective members of the group. All direct members of the group plus all effective members of member groups.
      operationId: getEffectiveMembership
      parameters:
      - name: groupid
        in: path
        description: group id or regid
        required: true
        schema:
          type: string
      - name: Accept
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      responses:
        '200':
          description: An array of members of the group
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EffMembership'
        '401':
          $ref: '#/components/responses/401Error'
        '404':
          $ref: '#/components/responses/404Error'
        '406':
          $ref: '#/components/responses/406Error'
  /group/{groupid}/effective_member?view=count:
    get:
      tags:
      - Membership
      description: Gets effective membership count
      operationId: getEffectiveMembershipCount
      parameters:
      - name: groupid
        in: path
        description: group id or regid
        required: true
        schema:
          type: string
          example: u_joeuser
      - name: view=count
        in: query
        required: true
        description: Request only the membership count
      - name: source=registry
        in: query
        required: false
        description: 'handle request via the registry (default is a fast response cache)


          *This is a diagnostic tool.  Representations and availability may differ from those described here.*'
        schema:
          type: string
      - name: Accept
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      responses:
        '200':
          description: A count of effective members of the group
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MembershipCount'
        '401':
          $ref: '#/components/responses/401Error'
        '403':
          $ref: '#/components/responses/403Error'
        '404':
          $ref: '#/components/responses/404Error'
        '406':
          $ref: '#/components/responses/406Error'
  /group/{groupid}/effective_member/{memberid}:
    get:
      tags:
      - Membership
      description: Gets one effective member of the group
      operationId: getMember
      parameters:
      - name: groupid
        in: path
        description: group id or regid
        required: true
        schema:
          type: string
      - name: memberid
        required: true
        in: path
        schema:
          type: string
      - name: source=registry
        in: query
        required: false
        description: 'handle request via the registry (default is a fast response cache)


          *This is a diagnostic tool.  Representations and availability may differ from those described here.*'
        schema:
          type: string
      - name: Accept
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      responses:
        '200':
          description: An array with the requested member of the group
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Membership'
        '401':
          $ref: '#/components/responses/401Error'
        '404':
          $ref: '#/components/responses/404Error'
        '406':
          $ref: '#/components/responses/406Error'
  /group/{groupid}/affiliate/{affiliate}:
    get:
      tags:
      - Groups
      description: Get the specified affiliate of the group.
      operationId: getAffiliate
      parameters:
      - name: groupid
        in: path
        description: A group name or regid
        required: true
        schema:
          type: string
      - name: affiliate
        in: path
        description: An affiliate name
        required: true
        schema:
          type: string
          enum:
          - netid
          - google
          - email
          - radius
      - name: Accept
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      responses:
        '200':
          description: The requested affiliateion
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AffiliateResponse'
        '404':
          description: Affiliate does not exist
        '406':
          $ref: '#/components/responses/406Error'
    put:
      tags:
      - Groups
      description: Put the affiliate of the group
      operationId: putAffiliate
      parameters:
      - name: groupid
        in: path
        description: A group name or regid
        required: true
        schema:
          type: string
      - name: affiliate
        in: path
        description: An affiliate name
        required: true
        schema:
          type: string
          enum:
          - netid
          - google
          - email
          - radius
      - name: status
        in: query
        description: status
        required: true
        schema:
          type: string
          enum:
          - active
          - inactive
      - name: sender
        in: query
        description: 'Authorized senders to the group

          * if email affiliation: comma separated list of sender ids

          * if google affiliation: one of ''none'', ''all'', ''member'', ''uw''

          '
        required: false
        type: string
        example: joeuser,u_joeuser
      - name: synchronized
        in: query
        required: false
        description: do not complete request until ldaps updated (default does not wait)
        schema:
          type: string
      - name: Accept
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      - name: Content-type
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      responses:
        '200':
          description: The updated affiliate
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Affiliate'
        '201':
          description: The newly created affiliate
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Affiliate'
        '400':
          description: Invalid affiliate representation
        '401':
          description: No permission
        '406':
          $ref: '#/components/responses/406Error'
    delete:
      tags:
      - Groups
      description: Delete an affiliate
      operationId: deleteAffiliate
      parameters:
      - name: groupid
        in: path
        description: A group name or regid
        required: true
        schema:
          type: string
      - name: affiliate
        in: path
        description: An affiliate name
        required: true
        schema:
          type: string
          enum:
          - netid
          - google
          - email
          - radius
      responses:
        '200':
          description: Affiliate deleted
        '401':
          description: No premission
        '406':
          $ref: '#/components/responses/406Error'
  /group/{groupid}/history:
    get:
      tags:
      - Groups
      - Membership
      description: Gets history of the group
      operationId: getHistory
      parameters:
      - name: groupid
        in: path
        description: group name or regid
        required: true
        schema:
          type: string
      - name: start
        in: query
        description: start time (milliseconds since epoch)
        required: false
        schema:
          type: integer
      - name: size
        in: query
        description: maximim number of events
        required: false
        schema:
          type: integer
      - name: order
        in: query
        description: sort order
        required: false
        schema:
          type: string
          enum:
          - a
          - d
      - name: activity
        in: query
        description: actity selector
        required: false
        schema:
          type: string
          enum:
          - acl
          - membership
      - name: id
        in: query
        description: memberid selector
        required: false
        schema:
          type: string
      - name: Accept
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      responses:
        '200':
          description: An array of history for the group
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/History'
        '401':
          description: No permission
        '404':
          description: Group not found
        '406':
          $ref: '#/components/responses/406Error'
  /search:
    get:
      tags:
      - Searches
      description: 'Finds groups.  Parameters specify matching conditions, which are ANDed to generate the search result.

        * Note. The affiliate search ignores any other search parameters.

        '
      parameters:
      - name: name
        in: query
        description: some part of the group name, "*" is a wildcard character
        required: false
        schema:
          type: string
      - name: stem
        in: query
        description: stem part of the name
        required: false
        schema:
          type: string
      - name: scope
        in: query
        description: stem search scope (depth)
        required: false
        schema:
          type: string
          enum:
          - one
          - all
      - name: member
        in: query
        description: member of the group
        required: false
        schema:
          type: string
      - name: type
        in: query
        description: member search type
        required: false
        schema:
          type: string
          enum:
          - direct
          - effective
      - name: owner
        in: query
        description: identifier of an administrator (admin,creator,updater,membermanager)
        required: false
        schema:
          type: string
      - name: affiliate
        in: query
        description: name of an affiliate
        required: false
        schema:
          type: string
          enum:
          - uwnetid
          - email
          - google
          - radius
      - name: instructor
        in: query
        description: uwnetid or eppn of a course instructor (course groups only)
        required: false
        schema:
          type: string
      - name: source=registry
        in: query
        required: false
        description: 'handle request via the registry (default is a fast response cache)


          *This is a diagnostic tool.  Representations and availability may differ from those described here.*'
        schema:
          type: string
      - name: Accept
        in: header
        description: If specified, must be "application/json"
        schema:
          type: string
      responses:
        '200':
          description: An array of groups identifiers matching the search
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SearchResponse'
        '401':
          description: No permission
        '404':
          description: Group not found
        '406':
          $ref: '#/components/responses/406Error'
components:
  schemas:
    uwnetid:
      type: string
      description: A University of Washington UWNetID
      example: joeuser
    eppn:
      type: string
      description: An eduPersonPrincipalName or an email address
      example: joeuser@washington.edu
    dns:
      type: string
      description: A Domain Name System (DNS) address
      example: urizen.s.uw.edu
    uwwi:
      type: string
      description: A Microsoft Infrastructure (MI) machine name (with a $ appended)
      example: lib-dibiasepc$
    affiliate:
      type: string
      description: An affiliate type
      enum:
      - email
      - google
      - uwnetid
      - radius
    emailSenders:
      type: string
      description: Exchange Email senders - a comma separated list of ids
      example: joeuser,u_joeuser_friends
    googleSenders:
      type: string
      description: Google Groups senders - choice keyword
      enum:
      - none
      - all
      - members
      - uw
      example: members
    Group:
      type: object
      properties:
        regid:
          description: Unique, opaque idenfier for the group
          type: string
          example: a1681c3fcba3f54f759e6c9432004381
        name:
          description: id of the group - includes path
          type: string
          example: u_fox_browser6
        displayName:
          description: Descriptive name of the group
          type: string
          example: Fox's test group
        description:
          description: Group's description
          type: string
          example: This is a general purpose group for testing various Group Service functionality.
        created:
          description: Create timestamp (milli-seconds from epoch)
          type: long
          example: 1214343146000
        lastModified:
          description: modify timestamp (milli-seconds from epoch)
          type: long
          example: 1277499258870
        lastMemberModified:
          description: lastMember timestamp (milli-seconds from epoch)
          type: long
          example: 1455304388228
        contact:
          description: Contact person (uwnetid) for the group
          type: string
          example: fox
        authnfactor:
          description: Multi-factor authn required
          type: integer
          enum:
          - 0
          - 1
          - 2
        classification:
          description: Classification of membership. u=unclassified, r=restricted, c=confidential, missing=no classification
          type: string
          enum:
          - u
          - r
          - c
        dependsOn:
          description: Membership dependency group
          type: string
          example: uw_employee
        gid:
          description: unique int
          type: integer
          example: 12001
        affiliates:
          description: affiliations for the group
          type: array
          items:
            $ref: '#/components/schemas/Affiliate'
        course:
          description: course info, if group represents a course
          type: object
          properties:
            quarter:
              type: string
              enum:
              - win
              - spr
              - sum
              - aut
            year:
              type: integer
              example: 2017
            curriculum:
              type: string
              example: phys
            number:
              type: integer
              example: 121
            section:
              type: string
              example: a
            sln:
              type: integer
              example: 19029
            instructors:
              type: array
              items:
                $ref: '#/components/schemas/Instructor'
        admins:
          description: Entities with full group access
          type: array
          items:
            $ref: '#/components/schemas/Entity'
          example:
          - type: group
            name: Admins of the zyzz school
            id: x_zyzz_admins
        updaters:
          description: Entities who can edit membership
          type: array
          items:
            $ref: '#/components/schemas/Entity'
          example:
          - type: eppn
            name: Ray G. Biv
            id: raybiv@somestate.edu
        creators:
          description: Entities who can create sub-groups
          type: array
          items:
            $ref: '#/components/schemas/Entity'
          example:
          - type: uwnetid
            name: Roy G. Biv
            id: rgbiv99
          - type: uwnetid
            name: J. Average
            id: joeuser
        readers:
          description: Entities who can read group membership
          type: array
          items:
            $ref: '#/components/schemas/Entity'
        optins:
          description: Entities who can opt in to membership
          type: array
          items:
            $ref: '#/components/schemas/Entity'
        optouts:
          description: Entities who can opt out of membership
          type: array
          items:
            $ref: '#/components/schemas/Entity'
      required:
      - regid
      - name
      - displayName
      - description
      - created
      - authnfactor
      - classification
      - gid
      - admins
    GroupResponse:
      type: object
      properties:
        schemas:
          type: array
          items:
            type: string
            enum:
            - urn:ma

# --- truncated at 32 KB (55 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/university-of-washington/refs/heads/main/openapi/university-of-washington-groups-web-service-openapi.yml