---
title: "Merge backstop sweep (GET)"
method: GET
path: "/cron/merge-backstop"
tags: ["Cron"]
---

# Merge backstop sweep (GET)

`GET /cron/merge-backstop`

## Request

- Base URL: `https://api.apphandoff.com/api`
- URL: `https://api.apphandoff.com/api/cron/merge-backstop`
- Auth: none required

Restored by HO-8020. Runs the merged-role repair, `sweepUnmergedTickets` (open
un-merged tickets re-classified against recent push events, keyset-paged on
`updated_at`) and `sweepRecentGithubPrs` (recently merged PRs that reference an
HO ticket without a closing keyword). Query params: `dry_run=1` classifies without
writing, `catch_up=1` widens the pass for a backlog drain, `before=<ISO>` is the
paging cursor echoed back as `nextCursor`, `pages=<1..2>` follows that cursor
in-process for up to that many ticket-sweep pages under one sweep deadline
(HO-18165). Protected by CRON_SECRET via the
x-cron-secret header only (no token query parameter).

## Query parameters

- `dry_run` '1'
- `catch_up` '1'
- `before` string, date-time
- `pages` integer

## Response `200`

Backstop run result

- CronMergeBackstopResult
  - `ok` boolean, required
  - `dryRun` boolean, required
  - `catchUp` boolean, required
  - `pages` integer: Ticket-sweep pages this request ran (HO-18165); at most the `pages` asked for.
  - `truncated` boolean, required: True when the LAST ticket-sweep page stopped before every candidate was seen (full page or deadline).
  - `nextCursor` string, nullable, required: The last page's cursor; pass back as `before` to continue paging; null when nothing remains.
  - `earlierSweeps` object[]: The sweepUnmergedTickets counters of every page BEFORE the last, in order (the last page is `sweep`); empty for a one-page request; a null entry is a page that threw.
  - `repair` object: repairMergedRolesWhereMergedAtSet counters.
  - `sweep` object, nullable: The last page's sweepUnmergedTickets counters; null when that page threw.
  - `prSweep` object, nullable: sweepRecentGithubPrs counters; null when that sweep threw.

## Other responses

- `400`: Malformed `before` cursor (INVALID_CURSOR) or `pages` outside 1..2 (INVALID_PAGES)
- `401`: Missing or invalid CRON_SECRET

---

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