---
title: "Submit drafted roster rows for revalidation"
method: POST
path: "/roster-records/{rosterId}/revalidate"
tags: ["RosterRecord"]
---

# Submit drafted roster rows for revalidation

`POST /roster-records/{rosterId}/revalidate`

Moves the roster into revalidation and re-runs validation over its rows in the background.

**When to use:** call this after saving draft corrections with `PATCH /roster-records/{rosterId}/draft`, once the edits are ready to be checked again.

**Preconditions:** supply the `tenant-id` header and the `rosterId` of an existing roster job. The roster must not already be undergoing processing - a roster in `REVALIDATE`, `VALIDATION_IN_PROGRESS`, `IN_PROGRESS`, or `PRE_PROCESSING` state is rejected with 409, and the response names the state that blocked the request. Wait for that work to finish, then retry.

**What you get back:** 202 as soon as the request is accepted, with the roster's new status set to `REVALIDATE`. The counts in the body are placeholders at this point: validation runs asynchronously, so poll the roster or its rows to observe progress and final results rather than reading totals from this response.

**Side effects:** the roster status is updated and a validation run is queued. Revalidation can be turned off for the platform, in which case this endpoint returns 503 until it is re-enabled.

## Path parameters

- `rosterId` string, required

## Headers

- `tenant-id` string, required

## Response `202`

The revalidation request was accepted and the roster moved to `REVALIDATE`. Validation runs in the background; the numeric counts are placeholders until it completes.

- RosterRowsRevalidateResponse — Summary after confirm revalidation of VALIDATION_FAILED rows
  - `processed` integer — Total VALIDATION_FAILED rows examined
  - `validated` integer — Rows that passed validation
  - `validationFailed` integer — Rows that failed validation
  - `status` string — Roster revalidation status (e.g. REVALIDATE when async dispatch accepted)

## Other responses

- `400` — Returned when the request is malformed - for example a missing `tenant-id` header or a blank `rosterId`.
- `401` — Returned when the request carries no valid authentication.
- `403` — Returned when the caller lacks the UPDATE_ROSTER permission for this tenant.
- `404` — Returned when no roster job with the supplied `rosterId` exists for the tenant.
- `409` — Returned when the roster is already being processed. Wait for the reported state to clear, then retry.
- `503` — Returned when revalidation is currently turned off for the platform. This is a temporary operational state - contact support if it persists.

---

[API](https://skmtc.net/certifyos/apis/certify-api-layer.md) · [All operations](https://skmtc.net/certifyos/apis/certify-api-layer/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/certifyos/certify-api-layer/revisions/563848e0ecc0/schema)
