# Revérifier

Refait le même contrôle au même endroit, sur ton site en ligne, juste après ton déploiement. Pour un dépôt, Rustine relance une analyse de la branche par défaut (`pending`, avec son `scan_id`).

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

Permission OAuth : `scans:run` · une clé d'API les a toutes

> Gratuit, dans la limite de 60 revérifications par projet et par jour. Déploie (ou pousse) le correctif avant : Rustine regarde ce qui est en ligne.

## Paramètres de chemin

- `issue_id` (string, obligatoire) Le problème.

## En-têtes

- `Idempotency-Key` (string) Une clé unique (1 à 255 caractères imprimables, un UUID convient) pour rejouer la requête sans risque : la première réponse est renvoyée pendant 24 heures ; la même clé avec une autre requête répond `409 idempotency_conflict`.

## Réponse (200 OK)

- `object` (string, obligatoire) Le type d'objet, toujours le même pour une route donnée.
- `issue_id` (string, obligatoire) Le problème revérifié.
- `status` (string, obligatoire) `fixed` : le problème est fermé. `still_open` : toujours là, avec ce que Rustine a vu. `pending` : pour un dépôt, une nouvelle analyse est lancée (`scan_id`) ; suis-la, puis relis le problème. (`fixed`, `still_open`, `pending`)
- `checked_at` (string, obligatoire) Quand le contrôle a tourné.
- `evidence` (string, obligatoire) Ce que le contrôle a vu cette fois.
- `scan_id` (string | null, obligatoire) Problème de dépôt : l'analyse qui tranchera.

## Exemples

### curl

```bash
# La clé reste dans une variable, jamais dans l'adresse
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()
```

### Réponse : 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
}
```

## Erreurs

| Code | error.code | Ce qui se passe |
| --- | --- | --- |
| 400 | `idempotency_key_invalid` | L'en-tête `Idempotency-Key` doit faire de 1 à 255 caractères imprimables. |
| 401 | `authentication_required` | Aucune clé dans la requête. Passe-la dans l'en-tête `Authorization: Bearer rst_…`, jamais dans l'adresse. |
| 401 | `invalid_api_key` | La clé ou le jeton OAuth est faux, révoqué ou expiré. Vérifie qu'il est copié en entier, ou crée une nouvelle clé. |
| 402 | `api_plan_required` | L'espace est sur l'offre Gratuite. L'API vient avec Pro, ou à l'essai 14 jours sur Solo. |
| 402 | `api_trial_ended` | L'essai de 14 jours de Solo est terminé. Passe à Pro : tes clés remarchent aussitôt. |
| 402 | `project_paused` | Le projet est en pause : ton offre couvre moins de projets que ton espace n'en a. Ses problèmes restent lisibles, mais rien de nouveau ne tourne. |
| 403 | `scope_missing` | Le jeton OAuth n'a pas la permission que demande cette route (indiquée sur sa page). Reconnecte l'agent pour l'accorder. Une clé d'API a toutes les permissions. |
| 404 | `resource_not_found` | Rien avec cet identifiant dans l'espace de la clé. Un objet d'un autre espace répond pareil : son existence n'est jamais révélée. |
| 409 | `proof_required` | Le site doit d'abord être prouvé comme le tien (audit complet, correctif, marquage). Prouve-le dans l'app : DNS, fichier ou balise meta. |
| 409 | `idempotency_conflict` | Cette `Idempotency-Key` a déjà servi pour une autre requête (méthode, chemin ou corps). Une nouvelle action prend une nouvelle clé. |
| 409 | `idempotency_in_progress` | Une requête avec cette `Idempotency-Key` est encore en cours. Réessaie dans un instant. |
| 429 | `rate_limited` | Trop de requêtes pour cette clé (120 par minute). Attends `Retry-After` secondes. |
| 429 | `recheck_limit_reached` | Trop de revérifications sur ce projet aujourd'hui (60 par jour). Réessaie demain. |
| 429 | `repository_analyses_limit_reached` | L'espace a lancé beaucoup d'analyses de dépôt ces dernières 24 heures. Réessaie plus tard. |
| 500 | `internal_error` | Une erreur de notre côté, signalée automatiquement. Réessaie plus tard ; donne le `Request-Id` au support si elle revient. |
| 502 | `recheck_failed` | La revérification n'a pas pu aller au bout (site injoignable ?). Vérifie que le site répond, puis réessaie. |
| 503 | `service_unavailable` | Rustine est indisponible un instant. Réessaie avec la même `Idempotency-Key`. |

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