# Recheck an issue

Runs the same check at the same place on your live site, right after your deploy. For a repository, Rustine starts a new analysis of the default branch (`pending`, with its `scan_id`).

```
POST https://api.rustine.io/v1/issues/{issue_id}/recheck
```

OAuth permission: `scans:run` · an API key has them all

> Free, up to 60 rechecks per project and per day. Deploy (or push) the fix first: Rustine looks at what is live.

## Path parameters

- `issue_id` (string, required) Issue id.

## Headers

- `Idempotency-Key` (string) A unique key (1 to 255 printable characters, a UUID is fine) to retry this request safely: the first response is replayed for 24 hours; the same key with another request answers 409 `idempotency_conflict`.

## Response (200 OK)

- `object` (string, required)
- `issue_id` (string, required) The issue.
- `status` (string, required) `fixed` (closed), `still_open`, or `pending` for a repository issue: a new analysis of the default branch was started (`scan_id`); poll it, then read the issue. (`fixed`, `still_open`, `pending`)
- `checked_at` (string, required) When the check ran.
- `evidence` (string, required) What the check saw this time.
- `scan_id` (string | null, required) Repository issue: the analysis that settles it.

## Examples

### curl

```bash
# The key stays in a variable, never in the address
curl https://api.rustine.io/v1/issues/2a4c6e8f-0b1d-4f3a-9c5e-7a9b1c3d5e7f/recheck \
  -X POST \
  -H "Authorization: Bearer $RUSTINE_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
```

### Node

```js
const res = await fetch(
  "https://api.rustine.io/v1/issues/2a4c6e8f-0b1d-4f3a-9c5e-7a9b1c3d5e7f/recheck",
  {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.RUSTINE_API_KEY}`,
      "Idempotency-Key": crypto.randomUUID(),
    },
  },
)
const recheck = await res.json()
```

### Python

```python
import os
import uuid

import requests

recheck = requests.post(
    "https://api.rustine.io/v1/issues/2a4c6e8f-0b1d-4f3a-9c5e-7a9b1c3d5e7f/recheck",
    headers={
        "Authorization": f"Bearer {os.environ['RUSTINE_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),
    },
).json()
```

### Response: 200 OK

```json
{
  "object": "recheck",
  "issue_id": "2a4c6e8f-0b1d-4f3a-9c5e-7a9b1c3d5e7f",
  "status": "fixed",
  "checked_at": "2026-10-13T09:15:40.000Z",
  "evidence": "GET /.env → 404",
  "scan_id": null
}
```

## Errors

| Status | error.code | What happens |
| --- | --- | --- |
| 400 | `idempotency_key_invalid` | The `Idempotency-Key` header must be 1 to 255 printable characters. |
| 401 | `authentication_required` | No key in the request. Pass it in the `Authorization: Bearer rst_…` header, never in the address. |
| 401 | `invalid_api_key` | The key or OAuth token is wrong, revoked or expired. Check it is copied in full, or create a new key. |
| 402 | `api_plan_required` | The workspace is on the Free plan. The API comes with Pro, or on a 14-day trial with Solo. |
| 402 | `api_trial_ended` | Solo's 14-day trial is over. Move to Pro: your keys work again at once. |
| 402 | `project_paused` | The project is paused: your plan covers fewer projects than your workspace has. Its issues stay readable, but nothing new runs. |
| 403 | `scope_missing` | The OAuth token lacks the permission this route needs (shown on its page). Reconnect the agent to grant it. An API key has every permission. |
| 404 | `resource_not_found` | Nothing with this id in the key's workspace. An object of another workspace answers the same: its existence is never revealed. |
| 409 | `proof_required` | The site must first be proved yours (full audit, fix, marking). Prove it in the app: DNS, file or meta tag. |
| 409 | `idempotency_conflict` | This `Idempotency-Key` was already used for another request (method, path or body). A new action takes a new key. |
| 409 | `idempotency_in_progress` | A request with this `Idempotency-Key` is still running. Retry in a moment. |
| 429 | `rate_limited` | Too many requests for this key (120 per minute). Wait `Retry-After` seconds. |
| 429 | `recheck_limit_reached` | Too many rechecks on this project today (60 per day). Try again tomorrow. |
| 429 | `repository_analyses_limit_reached` | The workspace started many repository analyses in the last 24 hours. Try again later. |
| 500 | `internal_error` | An error on our side, reported automatically. Retry later; give the `Request-Id` to support if it comes back. |
| 502 | `recheck_failed` | The recheck could not complete (site unreachable?). Check the site answers, then retry. |
| 503 | `service_unavailable` | Rustine is unavailable for a moment. Retry with the same `Idempotency-Key`. |

https://docs.rustine.io/en/api/errors
