Lumos Access Reviews API

Create and manage access review campaigns — scheduled reviews of who has access to what across your connected apps. **Typical workflow for creating a review:** 1. `GET /apps` — find the domain app UUIDs you want to review. 2. `GET /access_reviews/scope_options?domain_app_id={id}` — discover available scope filters (employment status, team, last login, etc.). Each returned `items` entry is a ready-to-POST `scope_filters` payload; datetime and custom-attribute groups instead expose a `filter_input_template`. 3. `POST /access_reviews` with `apps` (optionally with `scope_filters` per app) — creates the campaign. 4. `GET /access_reviews/{id}` — poll until `status` transitions from `IN_PREPARATION` to `IN_PROGRESS`. **After creation:** - `POST /access_reviews/{id}/apps` — add more apps while `status != COMPLETED`. - `PATCH /access_reviews/{id}` — update name / deadline / owner, or per-ARDA `scope_filters` and removal action. - `DELETE /access_reviews/{id}` — soft-delete the whole campaign. - `DELETE /access_reviews/{id}/apps/{arda_id}` — soft-delete a single app from the campaign. All endpoints require an API token with the `access_reviews.create` or `access_reviews.view` permission (Access Review Administrator or App Admin role).

Operations 8

POST /access_reviews Create Access Review #
GET /access_reviews List Access Reviews #
POST /access_reviews/{access_review_id}/apps Add Apps To Access Review #
DELETE /access_reviews/{access_review_id} Delete Access Review #
GET /access_reviews/{access_review_id} Get Access Review #
PATCH /access_reviews/{access_review_id} Update Access Review #
DELETE /access_reviews/{access_review_id}/apps/{arda_id} Delete Access Review App #
GET /access_reviews/scope_options Get Scope Options Endpoint #

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/lumos-access-reviews-api"
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

lumos-access-reviews-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Lumos Access Reviews API
  description: 'The Lumos API gives you the building blocks to administer and extend Lumos programmatically.

    Our REST API provides a management interface for the AppStore and a read interface

    for the Lumos Core.

    Go to https://developers.lumos.com to see our complete documentation.'
  version: 0.1.0
servers:
- url: https://api.lumos.com
tags:
- name: Access Reviews
  description: 'Create and manage access review campaigns — scheduled reviews of who has access to what

    across your connected apps.'
paths:
  /access_reviews:
    post:
      tags:
      - Access Reviews
      summary: Create Access Review
      description: 'Create a new access review campaign.


        The review''s initial status depends on whether apps are provided:


        - **With apps**: the review starts in `IN_PREPARATION` while account and entitlement snapshots are taken. Status automatically transitions to `IN_PROGRESS` once snapshotting completes.

        - **Without apps**: the review is created directly in `IN_PROGRESS`.


        Poll `GET /access_reviews/{id}` to observe the status transition. To add apps after creation, use `POST /access_reviews/{id}/apps` (allowed on any status except `COMPLETED`).'
      operationId: createAccessReview
      security:
      - HTTPBearer: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateAccessReviewInput'
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateAccessReviewOutput'
        '400':
          description: Validation error — the request violated a business rule (e.g. duplicate review name, deadline in the past, review not in the required status for this operation).
        '403':
          description: Forbidden — the caller lacks permission to create or manage access reviews. Requires the Access Review Administrator or App Admin role on the domain.
        '404':
          description: Not found — the referenced review / app does not exist.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    get:
      tags:
      - Access Reviews
      summary: List Access Reviews
      description: List access reviews for your organization. Paginated via standard `page` + `size` query params — `size` is capped at 100; requests over the cap return 422.
      operationId: listAccessReviews
      security:
      - HTTPBearer: []
      parameters:
      - name: page
        in: query
        required: false
        schema:
          type: integer
          minimum: 1
          description: Page number
          default: 1
          title: Page
        description: Page number
      - name: size
        in: query
        required: false
        schema:
          type: integer
          maximum: 100
          minimum: 1
          description: Page size
          default: 50
          title: Size
        description: Page size
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Page_AccessReviewOutput_'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /access_reviews/{access_review_id}/apps:
    post:
      tags:
      - Access Reviews
      summary: Add Apps To Access Review
      description: Add apps to an existing access review. Allowed on any review that is not yet `COMPLETED`. Soft-errors on invalid or duplicate domain app UUIDs — per-app failures are returned in the `errors` array rather than raising.
      operationId: addAppsToAccessReview
      security:
      - HTTPBearer: []
      parameters:
      - name: access_review_id
        in: path
        required: true
        schema:
          type: string
          title: Access Review Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddAppsInput'
      responses:
        '201':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddAppsOutput'
        '400':
          description: Validation error — the request violated a business rule (e.g. duplicate review name, deadline in the past, review not in the required status for this operation).
        '403':
          description: Forbidden — the caller lacks permission to create or manage access reviews. Requires the Access Review Administrator or App Admin role on the domain.
        '404':
          description: Not found — the referenced review / app does not exist.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /access_reviews/{access_review_id}:
    delete:
      tags:
      - Access Reviews
      summary: Delete Access Review
      description: Soft-delete an access review campaign. Fails with 400 if a review duplication is currently in progress.
      operationId: deleteAccessReview
      security:
      - HTTPBearer: []
      parameters:
      - name: access_review_id
        in: path
        required: true
        schema:
          type: string
          title: Access Review Id
      responses:
        '204':
          description: Successful Response
        '400':
          description: Validation error — the request violated a business rule (e.g. duplicate review name, deadline in the past, review not in the required status for this operation).
        '403':
          description: Forbidden — the caller lacks permission to create or manage access reviews. Requires the Access Review Administrator or App Admin role on the domain.
        '404':
          description: Not found — the referenced review / app does not exist.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    get:
      tags:
      - Access Reviews
      summary: Get Access Review
      description: Get an access review by ID.
      operationId: getAccessReview
      security:
      - HTTPBearer: []
      parameters:
      - name: access_review_id
        in: path
        required: true
        schema:
          type: string
          title: Access Review Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccessReviewOutput'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    patch:
      tags:
      - Access Reviews
      summary: Update Access Review
      description: Update an existing access review campaign. Top-level fields are editable on any review that is not yet `COMPLETED`. Per-app (`apps[].scope_filters`) edits are only accepted while the ARDA is still in `IN_PREPARATION` or `ASSIGNING_REVIEWERS` status.
      operationId: updateAccessReview
      security:
      - HTTPBearer: []
      parameters:
      - name: access_review_id
        in: path
        required: true
        schema:
          type: string
          title: Access Review Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateAccessReviewInput'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccessReviewOutput'
        '400':
          description: Validation error — the request violated a business rule (e.g. duplicate review name, deadline in the past, review not in the required status for this operation).
        '403':
          description: Forbidden — the caller lacks permission to create or manage access reviews. Requires the Access Review Administrator or App Admin role on the domain.
        '404':
          description: Not found — the referenced review / app does not exist.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /access_reviews/{access_review_id}/apps/{arda_id}:
    delete:
      tags:
      - Access Reviews
      summary: Delete Access Review App
      description: Soft-delete an app from an access review campaign. Fails with 400 if the review is already `COMPLETED`.
      operationId: deleteAccessReviewApp
      security:
      - HTTPBearer: []
      parameters:
      - name: access_review_id
        in: path
        required: true
        schema:
          type: string
          title: Access Review Id
      - name: arda_id
        in: path
        required: true
        schema:
          type: string
          title: Arda Id
      responses:
        '204':
          description: Successful Response
        '400':
          description: Validation error — the request violated a business rule (e.g. duplicate review name, deadline in the past, review not in the required status for this operation).
        '403':
          description: Forbidden — the caller lacks permission to create or manage access reviews. Requires the Access Review Administrator or App Admin role on the domain.
        '404':
          description: Not found — the referenced review / app does not exist.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /access_reviews/scope_options:
    get:
      tags:
      - Access Reviews
      summary: Get Scope Options Endpoint
      description: 'Get available scope filter options for a domain app or ARDA.


        To use these in `scope_filters` on a create/edit request, copy an item''s `value` (and `name`) verbatim — `value` is the machine-matchable identifier, while `label` is display-only. Posting a `label` as a `value` (or any value not present here) is rejected.


        ACCOUNT_ENTITLEMENT groups are split per `entitlement_type_label` (e.g. ''Roles'', ''Groups''), with each group''s `items` capped at 1000 entitlement labels. Groups whose underlying bucket exceeds the cap set `truncated: true` so callers know some valid labels are not present in the response.'
      operationId: getScopeOptions
      security:
      - HTTPBearer: []
      parameters:
      - name: domain_app_id
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Domain App Id
      - name: arda_id
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Arda Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScopeOptionsResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
components:
  schemas:
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
            - type: string
            - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
      - loc
      - msg
      - type
      title: ValidationError
    CustomAttributeScopeFilterInput:
      properties:
        group:
          type: string
          enum:
          - CUSTOM_ATTRIBUTE
          const: CUSTOM_ATTRIBUTE
          title: Group
          description: Always CUSTOM_ATTRIBUTE.
        name:
          type: string
          maxLength: 255
          title: Name
          description: Custom attribute label (e.g. 'Department'). Matches the label from scope_options.
        label:
          type: string
          maxLength: 255
          title: Label
          description: Human-readable display label.
        value:
          anyOf:
          - type: string
            maxLength: 255
          - type: 'null'
          title: Value
          description: Value to filter by for this custom attribute.
        type:
          anyOf:
          - type: string
            maxLength: 255
          - type: 'null'
          title: Type
          description: Attribute type (STRING, INTEGER, DATETIME, USER, GROUP, SINGLESELECT, MULTISELECT).
      additionalProperties: false
      type: object
      required:
      - group
      - name
      - label
      title: CustomAttributeScopeFilterInput
      description: 'Scope filter for ``CUSTOM_ATTRIBUTE`` groups.


        Custom attributes are keyed by ``name`` (the attribute label, e.g.

        "Department"). ``type`` declares the attribute''s type (STRING, INTEGER,

        DATETIME, USER, GROUP, SINGLESELECT, MULTISELECT).'
    ScopeFilterGroupOutput:
      properties:
        name:
          type: string
          title: Name
          description: Display name of this filter group.
        group:
          $ref: '#/components/schemas/ScopablePropertyGroup'
          description: ScopablePropertyGroup enum value.
        type:
          type: string
          enum:
          - STRING
          - INTEGER
          - DATETIME
          - SINGLESELECT
          - MULTISELECT
          - USER
          - GROUP
          title: Type
          description: Attribute type for values in this group.
        items:
          items:
            oneOf:
            - $ref: '#/components/schemas/ScalarScopeFilterInput'
            - $ref: '#/components/schemas/CustomAttributeScopeFilterInput'
            - $ref: '#/components/schemas/DatetimeScopeFilterInput'
            discriminator:
              propertyName: group
              mapping:
                ACCESS_APPROVED_AT: '#/components/schemas/ScalarScopeFilterInput'
                ACCESS_GRANTED_AT: '#/components/schemas/ScalarScopeFilterInput'
                ACCESS_LENGTH: '#/components/schemas/ScalarScopeFilterInput'
                ACCESS_PROVISIONED_AT: '#/components/schemas/ScalarScopeFilterInput'
                ACCESS_REQUESTED_AT: '#/components/schemas/ScalarScopeFilterInput'
                ACCOUNT_DELTA: '#/components/schemas/ScalarScopeFilterInput'
                ACCOUNT_ENTITLEMENT: '#/components/schemas/ScalarScopeFilterInput'
                ACCOUNT_SOURCE: '#/components/schemas/ScalarScopeFilterInput'
                ACCOUNT_STATUS: '#/components/schemas/ScalarScopeFilterInput'
                CATEGORIES: '#/components/schemas/ScalarScopeFilterInput'
                CUSTOM_ATTRIBUTE: '#/components/schemas/CustomAttributeScopeFilterInput'
                EMAIL_DOMAIN: '#/components/schemas/ScalarScopeFilterInput'
                EMPLOYMENT_STATUS: '#/components/schemas/ScalarScopeFilterInput'
                ENTITLEMENT_TAG: '#/components/schemas/ScalarScopeFilterInput'
                LAST_ACTIVITY: '#/components/schemas/DatetimeScopeFilterInput'
                LAST_LOGIN: '#/components/schemas/DatetimeScopeFilterInput'
                SOD_POLICY: '#/components/schemas/ScalarScopeFilterInput'
                TEAM: '#/components/schemas/ScalarScopeFilterInput'
                UNMATCHED_ACCOUNTS: '#/components/schemas/ScalarScopeFilterInput'
                USER_OR_GROUP: '#/components/schemas/ScalarScopeFilterInput'
          type: array
          title: Items
          description: Available items for this group, each already shaped as a valid scope filter input. Callers can POST an item directly in `scope_filters`.
        filter_input_template:
          anyOf:
          - type: object
          - type: 'null'
          title: Filter Input Template
          description: Template shape for filter input on this group. Present for datetime groups and CUSTOM_ATTRIBUTE — where values vary per request so no pre-computed items list exists.
        default_label:
          anyOf:
          - type: string
          - type: 'null'
          title: Default Label
          description: Default display label (e.g. 'No' for delta filter).
        truncated:
          type: boolean
          title: Truncated
          description: True when `items` was capped below the underlying source's actual cardinality. Today this only applies to ACCOUNT_ENTITLEMENT groups, which are capped at 1000 entitlement labels per type bucket. When set, callers should expect that some valid entitlement labels for this bucket are not present in `items`.
          default: false
      type: object
      required:
      - name
      - group
      - type
      title: ScopeFilterGroupOutput
      description: 'Self-describing discovery group.


        Each entry in ``items`` is a valid :type:`ScopeFilterInput` payload — the

        caller can POST it back unmodified in a create/edit request. For groups

        whose values vary per-user (CUSTOM_ATTRIBUTE) or are datetime ranges

        (LAST_LOGIN, LAST_ACTIVITY), ``items`` is empty and

        ``filter_input_template`` shows the expected shape instead.'
    AddAppsInput:
      properties:
        apps:
          items:
            $ref: '#/components/schemas/AccessReviewDomainAppInput'
          type: array
          maxItems: 200
          title: Apps
          description: List of domain apps to add to the access review. Capped at 200 entries per the Access Review scale limits (technically-supported tier).
      additionalProperties: false
      type: object
      required:
      - apps
      title: AddAppsInput
      examples:
      - apps:
        - id: 00000000-0000-0000-0000-000000000002
          review_type: ENTITLEMENTS
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ScalarScopeFilterInput:
      properties:
        group:
          type: string
          enum:
          - ACCOUNT_ENTITLEMENT
          - TEAM
          - EMPLOYMENT_STATUS
          - EMAIL_DOMAIN
          - CATEGORIES
          - ACCOUNT_DELTA
          - ACCOUNT_STATUS
          - ACCOUNT_SOURCE
          - SOD_POLICY
          - ACCESS_GRANTED_AT
          - ACCESS_REQUESTED_AT
          - ACCESS_APPROVED_AT
          - ACCESS_PROVISIONED_AT
          - ACCESS_LENGTH
          - USER_OR_GROUP
          - UNMATCHED_ACCOUNTS
          - ENTITLEMENT_TAG
          title: Group
          description: Scope filter group. Use DatetimeScopeFilterInput for LAST_LOGIN / LAST_ACTIVITY and CustomAttributeScopeFilterInput for CUSTOM_ATTRIBUTE.
        name:
          type: string
          maxLength: 255
          title: Name
          description: Internal identifier for this filter item. For ACCOUNT_ENTITLEMENT this is the entitlement **type label** (e.g. 'Team', 'Role', 'Repo Access') — copy it from the matching item's `name` in GET /access_reviews/scope_options.
        label:
          type: string
          maxLength: 255
          title: Label
          description: Human-readable display label.
        value:
          anyOf:
          - type: string
            maxLength: 255
          - type: 'null'
          title: Value
          description: The value to filter by. This must be the exact `value` of an item returned by GET /access_reviews/scope_options for this app — the machine-matchable identifier, **not** the human-readable `label`. For ACCOUNT_ENTITLEMENT the value is the entitlement's integration_specific_entitlement_id, which may be an opaque id (e.g. a numeric team id) rather than its display name. Posting a `label`, or any value not present in scope_options, is rejected.
        type:
          anyOf:
          - type: string
            maxLength: 255
          - type: 'null'
          title: Type
          description: Attribute type. Required for USER_OR_GROUP (must be 'USER' or 'GROUP'). Ignored for all other groups.
      additionalProperties: false
      type: object
      required:
      - group
      - name
      - label
      title: ScalarScopeFilterInput
      description: 'Scope filter for groups whose value is a simple string/UUID/enum.


        Datetime-valued groups (``LAST_LOGIN``, ``LAST_ACTIVITY``) use

        :class:`DatetimeScopeFilterInput`; ``CUSTOM_ATTRIBUTE`` uses

        :class:`CustomAttributeScopeFilterInput`.'
    AccessReviewDomainAppOutput:
      properties:
        id:
          type: string
          title: Id
          description: UUID of this access review domain app record.
        domain_app_id:
          type: string
          title: Domain App Id
          description: UUID of the domain app being reviewed.
        domain_app_name:
          type: string
          title: Domain App Name
          description: Display name of the domain app.
        domain_app_sources:
          items:
            type: string
          type: array
          title: Domain App Sources
          description: List of sources for the domain app.
        status:
          type: string
          enum:
          - IN_PREPARATION
          - ASSIGNING_REVIEWERS
          - IN_PROGRESS
          - COMPLETED
          - WAITING_FOR_MANUAL_ACTION
          - DELETED
          title: Status
          description: Status of this app within the review.
        review_type:
          anyOf:
          - $ref: '#/components/schemas/ReviewType'
          - type: 'null'
          description: 'What is being reviewed: ENTITLEMENTS or ACCOUNTS.'
        app_last_synced_at:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: App Last Synced At
          description: When the app data was last synced.
        last_synced_at:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Last Synced At
          description: When this review's data was last synced.
        account_count:
          anyOf:
          - type: integer
          - type: 'null'
          title: Account Count
          description: Number of accounts in scope for this app.
        launched_at:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Launched At
          description: When this app's review was launched.
        completed_at:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Completed At
          description: When this app's review was completed.
        scope_filters:
          anyOf:
          - items:
              type: object
            type: array
          - type: 'null'
          title: Scope Filters
          description: Scope filters applied to this app's review.
      type: object
      required:
      - id
      - domain_app_id
      - domain_app_name
      - domain_app_sources
      - status
      title: AccessReviewDomainAppOutput
    AccessReviewDomainAppErrorOutput:
      properties:
        app_id:
          type: string
          title: App Id
          description: UUID of the domain app that could not be added.
        error:
          type: string
          title: Error
          description: Description of why the app could not be added.
      type: object
      required:
      - app_id
      - error
      title: AccessReviewDomainAppErrorOutput
    ScopablePropertyGroup:
      type: string
      enum:
      - ACCOUNT_ENTITLEMENT
      - TEAM
      - EMPLOYMENT_STATUS
      - EMAIL_DOMAIN
      - CATEGORIES
      - ACCOUNT_DELTA
      - ACCOUNT_STATUS
      - ACCOUNT_SOURCE
      - LAST_LOGIN
      - LAST_ACTIVITY
      - CUSTOM_ATTRIBUTE
      - SOD_POLICY
      - ACCESS_GRANTED_AT
      - ACCESS_REQUESTED_AT
      - ACCESS_APPROVED_AT
      - ACCESS_PROVISIONED_AT
      - ACCESS_LENGTH
      - USER_OR_GROUP
      - UNMATCHED_ACCOUNTS
      - ENTITLEMENT_TAG
      title: ScopablePropertyGroup
    Page_AccessReviewOutput_:
      properties:
        items:
          items:
            $ref: '#/components/schemas/AccessReviewOutput'
          type: array
          title: Items
        total:
          anyOf:
          - type: integer
            minimum: 0.0
          - type: 'null'
          title: Total
        page:
          anyOf:
          - type: integer
            minimum: 1.0
          - type: 'null'
          title: Page
        size:
          anyOf:
          - type: integer
            minimum: 1.0
          - type: 'null'
          title: Size
        pages:
          anyOf:
          - type: integer
            minimum: 0.0
          - type: 'null'
          title: Pages
      type: object
      required:
      - items
      - total
      - page
      - size
      title: Page[AccessReviewOutput]
    PositionalWeekday:
      properties:
        weekday:
          type: integer
          maximum: 6.0
          minimum: 0.0
          title: Weekday
          description: 0=Monday, 1=Tuesday, ..., 6=Sunday.
        n:
          anyOf:
          - type: integer
          - type: 'null'
          title: N
          description: Which occurrence of the weekday within the period (e.g. 1 = first, -1 = last). None means every matching weekday.
      type: object
      required:
      - weekday
      title: PositionalWeekday
      description: 'A positional weekday for monthly/yearly recurrences — e.g. "the first Monday of the

        month" is ``{"weekday": 0, "n": 1}``. Mirrors ``dateutil.rrule.weekday``.


        A plain integer weekday (0–6) covers the common case; this richer form is only needed

        when an Nth-occurrence qualifier is present, which a bare int cannot express.'
    AccessReviewDomainAppConfigurableEvidenceUpload:
      type: string
      enum:
      - ALWAYS
      - DEFAULT
      title: AccessReviewDomainAppConfigurableEvidenceUpload
      description: Every operation requires evidence upload for failures and manual actions.
    RecurrenceConfig:
      properties:
        freq:
          type: integer
          title: Freq
          description: 'Recurrence frequency. Use dateutil.rrule constants: YEARLY=0, MONTHLY=1, WEEKLY=2, DAILY=3, HOURLY=4, MINUTELY=5, SECONDLY=6.'
        interval:
          anyOf:
          - type: integer
          - type: 'null'
          title: Interval
          description: Interval between each recurrence. Defaults to 1 (every freq period).
        count:
          anyOf:
          - type: integer
          - type: 'null'
          title: Count
          description: Total number of occurrences. Mutually exclusive with until.
        until:
          anyOf:
          - type: string
          - type: 'null'
          title: Until
          description: End date/time for the recurrence. ISO 8601 datetime string. Mutually exclusive with count.
        byweekday:
          anyOf:
          - items:
              anyOf:
              - type: integer
              - $ref: '#/components/schemas/PositionalWeekday'
            type: array
          - type: 'null'
          title: Byweekday
          description: 'Days of the week to recur on. 0=Monday, 1=Tuesday, ..., 6=Sunday. For positional weekdays (e.g. the first Monday of the month) use the {"weekday": N, "n": K} form, e.g. {"weekday": 0, "n": 1}.'
        bymonth:
          anyOf:
          - items:
              type: integer
            type: array
          - type: 'null'
          title: Bymonth
          description: Months to recur on (1–12).
        bymonthday:
          anyOf:
          - items:
              type: integer
            type: array
          - type: 'null'
          title: Bymonthday
          description: Days of the month to recur on (1–31, negative values count from end).
        byyearday:
          anyOf:
          - items:
              type: integer
            type: array
          - type: 'null'
          title: Byyearday
          description: Days of the year to recur on.
        byweekno:
          anyOf:
          - items:
              type: integer
            type: array
          - type: 'null'
          title: Byweekno
          description: Week numbers of the year to recur on.
        bysetpos:
          anyOf:
          - items:
              type: integer
            type: array
          - type: 'null'
          title: Bysetpos
          description: Positions within the recurrence set to include (e.g. -1 for last occurrence, 1 for first).
        byhour:
          anyOf:
          - items:
              type: integer
            type: array
          - type: 'null'
          title: Byhour
          description: Hours of the day to recur on (0–23).
        byminute:
          anyOf:
          - items:
              type: integer
            type: array
          - type: 'null'
          title: Byminute
          description: Minutes of the hour to recur on (0–59).
        bysecond:
          anyOf:
          - items:
              type: integer
            type: array
          - type: 'null'
          title: Bysecond
          description: Seconds of the minute to recur on (0–59).
        wkst:
          anyOf:
          - type: integer
          - type: 'null'
          title: Wkst
          description: Week start day. 0=Monday, 6=Sunday. Defaults to Monday.
      type: object
      required:
      - freq
      title: RecurrenceConfig
      description: 'Shape of a recurrence configuration. Fields map directly to dateutil.rrule kwargs.

        See https://dateutil.readthedocs.io/en/stable/rrule.html for full documentation.

        The minimum required field is freq.'
    ScopeOptionsResponse:
      properties:
        scope_options:
          items:
            $ref: '#/components/schemas/ScopeFilterGroupOutput'
          type: array
          title: Scope Options
          description: Available scope filter groups.
      type: object
      required:
      - scope_options
      title: ScopeOptionsResponse
    UpdateAccessReviewInput:
      properties:
        name:
          anyOf:
          - type: string
          - type: 'null'
          title: Name
          description: Name of the access review campaign.
        deadline_at:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Deadline At
          description: Deadline by which reviewers must complete their reviews. ISO 8601 datetime (e.g. '2026-05-01T00:00:00Z').
        owner_id:
          anyOf:
          - type: string
          - type: 'null'
          title: Owner Id
          description: UUID of the user to set as the review owner.
        target_launch_date:
          anyOf:
          - type: string
            format: date-time
          - type: 'null'
          title: Target Launch Date
          description: Scheduled launch date override. ISO 8601 datetime.
        recurrence_config:
          anyOf:
          - $ref: '#/components/schemas/RecurrenceConfigInput'
          - type: 'null'
          description: Recurrence configuration. Mutually exclusive with recurrence_days_frequency.
        recurrence_days_frequency:
          anyOf:
          - type: integer
          - type: 'null'
          title: Recurrence Days Frequency
          description: Recurrence frequency in days. Mutually exclusive with recurrence_config.
        apps:
          items:
            $ref: '#/components/schemas/UpdateAccessReviewArdaInput'
          type: array
          title: Apps
          description: Per-app (ARDA) fields to update.
      additionalProperties: false
      type: object
      title: UpdateAccessReviewInput
      examples:
      - deadline_at: '2026-07-15T23:59:59Z'
        name: Q2 2026 Quarterly Access Review — extended
      - apps:
       

# --- truncated at 32 KB (49 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/lumos/refs/heads/main/openapi/lumos-access-reviews-api-openapi.yml