---
title: "Record bulk review decisions"
method: POST
path: "/access-certification/review-items/bulk-decisions"
tags: ["Access Certification"]
---

# Record bulk review decisions

`POST /access-certification/review-items/bulk-decisions`

## Request

- Base URL: `https://console.jumpcloud.com/api/v2`
- URL: `https://console.jumpcloud.com/api/v2/access-certification/review-items/bulk-decisions`
- Auth: API key in header `x-api-key`
- TypeScript: <https://skmtc.dev/jumpcloud/apis/jumpcloud-api-2/docs/access-certification/review-items/bulk-decisions/post.ts> (a function with typed inputs; its response is checked against the schema)

Applies a single Keep, Revoke, or Override decision to multiple review items in one request.
Useful for certifying or revoking access for a group of users at once.

All review items must belong to the same active campaign run. Items from a different run
or items you are not assigned to return per-item errors in the response (HTTP 200 with
individual `status: error` entries).

Maximum **100** review items per request.

**Required permission:** `accesscertification` (Full Access)

## Request body

- JumpcloudHttpAccesscertificationBulkDecisionsRequest: Apply one decision (and optional justification) to many review items
  - `reviewItemIds` string[], required: Review item ids to update with the shared decision
  - `decision` 'keep' | 'revoke' | 'override', required: Decision action submitted by reviewer or admin
  - `justification` string: Shared justification applied to every item in reviewItemIds

## Response `200`

Bulk decisions processed (per-item success/error)

- JumpcloudHttpAccesscertificationBulkDecisionsResponse
  - `results` object[], required
    - `reviewItemId` string, required
    - `status` 'success' | 'error', required
    - `response` JumpcloudHttpAccesscertificationRecordDecisionResponse
      - `reviewItemId` string, required
      - `finalDecision` 'pending' | 'keep' | 'revoke', required: Recorded outcome for an identity or stage
      - `remediationAction` 'no_action' | 'pending' | 'scheduled' | 'completed' | 'failed' | 'canceled', required: Remediation status for one identity after a Revoke decision
      - `remediationEnqueued` boolean: True when a RemediationWorkflow was enqueued (Revoke + immediate timeline)
    - `error` JumpcloudHttpAccesscertificationError
      - `message` string, required: Human-readable error message
      - `code` string: Machine-readable error code (e.g. stage_not_open, not_assigned).
      - `details` JumpcloudHttpAccesscertificationErrorDetail[]: Optional structured error details
        - `field` string: JSON pointer or field name
        - `message` string: Field-level validation message

## Other responses

- `400`: Validation error with field-level details
- `401`: Missing or invalid credentials
- `403`: Forbidden — principal not assigned or lacks required role
- `default`: Unexpected error

---

[API](https://skmtc.dev/jumpcloud/apis/jumpcloud-api-2.md) - [All operations](https://skmtc.dev/jumpcloud/apis/jumpcloud-api-2/llms.txt) - [OpenAPI document](https://skmtc.dev/jumpcloud/apis/jumpcloud-api-2/revisions/3f09fe63caaa?raw)
