# Premier appel en 2 minutes

> Crée une clé, range-la dans une variable d'environnement et appelle l'API. Puis lance ton premier scan.

## 1. Crée une clé

Dans l'app, ouvre [Réglages › Clés d'API](https://app.rustine.io/fr/settings?section=apiKeys), donne un nom à la clé (« CI de monsaas ») et clique sur **Créer la clé**. Il te faut l'offre Pro, ou l'essai de l'offre Solo (voir [Accès](https://docs.rustine.io/access.md)), et la double authentification activée.

La clé commence par `rst_` et ne s'affiche qu'une fois. Copie-la tout de suite.

## 2. Range-la dans une variable

```bash
export RUSTINE_API_KEY="rst_..."
```

Dans ta CI, mets-la dans les secrets (GitHub Actions : **Settings › Secrets and variables › Actions**). Jamais dans un fichier versionné, jamais dans une adresse.

## 3. Appelle l'API

La commande à droite liste tes projets. Si tu vois ton projet et son score, tout marche. Une réponse `401` veut dire que la clé est absente ou mal copiée : voir [Erreurs](https://docs.rustine.io/api/errors#invalid_api_key).

## 4. Lance un scan

Prends l'`id` d'un site dans `targets` et lance un scan rapide :

```bash
curl https://api.rustine.io/v1/targets/8d2e4f6a-9b1c-4d3e-a5f7-0b2c4d6e8f1a/scans \
  -H "Authorization: Bearer $RUSTINE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"quick"}'
```

Le scan part en arrière-plan. Interroge [Suivre un scan](https://docs.rustine.io/api/scans/get.md) toutes les quelques secondes jusqu'à `done`, puis [liste les problèmes](https://docs.rustine.io/api/issues/list.md) du projet.

## Et ensuite

- Le correctif d'un problème : [Débloquer le correctif](https://docs.rustine.io/api/issues/unlock-fix.md). Colle-le dans ton agent, déploie, puis [revérifie](https://docs.rustine.io/api/issues/recheck.md).
- Ton agent peut faire tout ça seul : [Brancher ton agent](https://docs.rustine.io/mcp/connect.md).

## Exemples

### curl

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

### Node

```js
const res = await fetch("https://api.rustine.io/v1/projects", {
  headers: { Authorization: `Bearer ${process.env.RUSTINE_API_KEY}` },
})
const page = await res.json()
console.log(page.data.map((p) => `${p.name}: ${p.score}/100`))
```

### Python

```python
import os

import requests

page = requests.get(
    "https://api.rustine.io/v1/projects",
    headers={"Authorization": f"Bearer {os.environ['RUSTINE_API_KEY']}"},
).json()
print([f"{p['name']}: {p['score']}/100" for p in page["data"]])
```

### Réponse : 200 OK

```json
{
  "object": "list",
  "data": [
    {
      "id": "4f9c2a7e-1b3d-4e5f-8a6b-7c8d9e0f1a2b",
      "object": "project",
      "name": "Mon SaaS",
      "score": 62,
      "grade": "C",
      "open_issues": 3,
      "targets": [
        {
          "id": "8d2e4f6a-9b1c-4d3e-a5f7-0b2c4d6e8f1a",
          "kind": "domain",
          "address": "app.monsaas.fr",
          "verified": true
        }
      ]
    }
  ],
  "has_more": false
}
```
