---
title: "Candidate Hygiene Tick"
method: POST
path: "/api/internal/cron/candidate-hygiene"
tags: ["Internal Cron"]
---

# Candidate Hygiene Tick

`POST /api/internal/cron/candidate-hygiene`

## Request

- Base URL: `https://api.ruzora.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.ruzora.com/api/internal/cron/candidate-hygiene`
- Auth: none declared

Candidate hygiene sweep (Wave 2 Epic 2.5).

Rule 1: 90-day idle Applied/Screening/Bench → Inactive. Rule 2: Applied
whose latest evaluation expired ≥30 days ago with nothing active and no
re-application → Inactive. Each transition records a
`{type: 'auto_inactive', reason}` note; re-application (forms.py) and
candidate_hygiene_service.reactivate() reverse it.

Called by .github/workflows/bench-freshness-cron.yml (daily 09:00 UTC,
after bench-staleness and in-pool-ping); idempotent and advisory-locked,
so a manual re-run is always safe.

## Headers

- `x-cron-token` string, nullable

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/ruzora/apis/ruzora-candidate-crm-api.md) · [All operations](https://skmtc.dev/ruzora/apis/ruzora-candidate-crm-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ruzora/apis/ruzora-candidate-crm-api/revisions/f9b8223f3ac4?raw)
