---
title: "Shortlist Refresh Tick"
method: POST
path: "/api/internal/cron/shortlist-refresh-tick"
tags: ["Internal Cron"]
---

# Shortlist Refresh Tick

`POST /api/internal/cron/shortlist-refresh-tick`

## 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/shortlist-refresh-tick`
- Auth: none declared

Rebuild shortlists that got thumbed down, and say so (Epic 5.4).

For each lead whose card feedback is newer than their last refresh:
drop the rejected cards, keep the liked ones, pull replacements
through ``list_matching_bench`` with whatever seniority shift the
reason chips authorise, and email "we reworked your shortlist".

**The email only goes out when cards actually changed.** A refresh
that swaps nothing sends nothing — "we refreshed your shortlist" over
an identical slate is the fabricated-progress cousin of a countdown
timer, and this wave bans those.

Idempotent: ``leads.shortlist_refreshed_at`` is the watermark and is
stamped on every path that examined the feedback, including the
no-ops, so a re-run finds nothing to redo and never re-emails.

External GitHub Actions cron (shortlist-lifecycle-cron.yml), NOT
in-process APScheduler — interval jobs starve on ephemeral Railway
replicas (enrollment incident 2026-08-18).

## 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)
