---
title: "Cron Signal Outcome Scoring"
method: POST
path: "/cron/signal-outcome-scoring"
tags: ["cron"]
---

# Cron Signal Outcome Scoring

`POST /cron/signal-outcome-scoring`

## Request

- Base URL: `https://api.equity-rank.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.equity-rank.com/cron/signal-outcome-scoring`
- Auth: none declared

Closed-loop scoring: score every matured signal_predictions row against the
realized forward price and write the outcome to signal_outcomes.

Idempotent — relies on the partial unique index uq_signal_outcomes_pred_horizon
(prediction_id, horizon_days) to skip rows already scored. Re-running is safe.

Query params:
  horizons: optional comma-separated list, e.g. "30,60,90,180". Defaults to
            30/60/90/180 (the 180d run keeps the legacy actual_return_6m column
            populated for back-compat with improvement_service).

Auth: X-Cron-Secret. Schedule: daily 04:00 UTC (after the 03:00 calibration
check so today's scored outcomes flow into tomorrow's hit-rate snapshot).

Uses DB-only price lookups (score_history); does NOT hit AlphaVantage or
trigger the screener batch.

## Query parameters

- `horizons` string, nullable

## Headers

- `x-cron-secret` string, nullable

## Response `202`

Successful Response

- object

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/equity-rank/apis/equity-rank-api.md) · [All operations](https://skmtc.dev/equity-rank/apis/equity-rank-api/llms.txt) · [OpenAPI document](https://skmtc.dev/equity-rank/apis/equity-rank-api/revisions/c2f2463fee33?raw)
