# Référence de l'API

> L'adresse, les formats et les conventions communes à toutes les routes de l'API v1, puis chaque route une par une.

**Adresse : `https://api.rustine.io/v1`**

- **Authentification** : `Authorization: Bearer rst_…` ([Authentification](https://docs.rustine.io/authentication.md)).
- **Format** : JSON en entrée et en sortie, champs en `snake_case`, dates en ISO 8601 (UTC), identifiants en UUID.
- **Listes** : `{ "object": "list", "data": [...], "has_more": false }`, avec `limit` et `starting_after` ([Pagination](https://docs.rustine.io/pagination.md)).
- **Erreurs** : `{ "error": { "type", "code", "message", "doc_url" } }` ([Erreurs](https://docs.rustine.io/api/errors.md)).
- **Écritures** : envoie une `Idempotency-Key` sur les `POST` ([Idempotence](https://docs.rustine.io/idempotency.md)).
- **Langue** : les messages d'erreur et les textes des problèmes arrivent dans la langue du propriétaire de la clé.

Chaque réponse porte `Request-Id` (à donner au support), `Rustine-Version` (la version du contrat qui a répondu, voir [Versions](https://docs.rustine.io/versioning.md)) et les en-têtes `X-RateLimit-*` ([Limites et quotas](https://docs.rustine.io/rate-limits.md)).

La spécification complète est servie telle quelle sur [`/openapi.json`](https://docs.rustine.io/openapi.json) (OpenAPI 3.1) : importe-la dans Postman, Insomnia ou un générateur de client.

## Les routes

- `GET /projects`: [Lister les projets](https://docs.rustine.io/api/projects/list.md)
- `POST /projects`: [Créer un projet](https://docs.rustine.io/api/projects/create.md)
- `GET /projects/{project_id}`: [Lire un projet](https://docs.rustine.io/api/projects/get.md)
- `POST /projects/{project_id}/targets`: [Ajouter un site](https://docs.rustine.io/api/projects/add-site.md)
- `POST /targets/{target_id}/scans`: [Lancer un scan](https://docs.rustine.io/api/scans/create.md)
- `GET /scans/{scan_id}`: [Suivre un scan](https://docs.rustine.io/api/scans/get.md)
- `GET /projects/{project_id}/scans`: [Historique des scans](https://docs.rustine.io/api/scans/list.md)
- `GET /projects/{project_id}/issues`: [Lister les problèmes](https://docs.rustine.io/api/issues/list.md)
- `GET /issues/{issue_id}`: [Lire un problème](https://docs.rustine.io/api/issues/get.md)
- `POST /issues/{issue_id}/fix`: [Débloquer le correctif](https://docs.rustine.io/api/issues/unlock-fix.md)
- `GET /issues/{issue_id}/fix`: [Relire le correctif](https://docs.rustine.io/api/issues/fix.md)
- `POST /issues/{issue_id}/recheck`: [Revérifier](https://docs.rustine.io/api/issues/recheck.md)
- `PATCH /issues/{issue_id}`: [Marquer un problème](https://docs.rustine.io/api/issues/update.md)
- `GET /account`: [Ton offre et tes quotas](https://docs.rustine.io/api/account.md)

## Exemples

### curl

```bash
curl -i https://api.rustine.io/v1/account \
  -H "Authorization: Bearer $RUSTINE_API_KEY"
```

### Réponse : 200 OK

```http
HTTP/1.1 200 OK
Content-Type: application/json
Request-Id: req_6f1c0d9a2b7e4c3d5a8b9e0f
Rustine-Version: 2026-10-13
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 119
X-RateLimit-Reset: 1792061520
```
