# Authentification

> Une clé rst_ dans l'en-tête Authorization pour tes scripts, OAuth pour les agents. Jamais de clé dans une adresse.

## Les clés d'API

Une clé se crée dans [Réglages › Clés d'API](https://app.rustine.io/fr/settings?section=apiKeys). Elle commence par `rst_`, vaut pour tout ton espace et ne s'affiche qu'une fois : Rustine n'en garde qu'une empreinte.

Elle se passe **uniquement** dans l'en-tête :

```http
Authorization: Bearer rst_...
```

Jamais dans l'adresse (`?key=…`) : une URL finit dans les journaux des serveurs, l'historique du navigateur et les captures d'écran.

- Une clé par usage (« CI », « n8n », « script de déploiement ») : tu sais laquelle révoquer.
- Une clé a toutes les permissions de ton espace : lire, scanner, débloquer un correctif, marquer un problème.
- Les messages d'erreur et les textes des problèmes arrivent dans la langue du propriétaire de la clé.
- Si une clé fuit, clique sur **Révoquer** : elle cesse de marcher aussitôt. Crée-en une autre.

## OAuth, pour les agents

Claude, ChatGPT, Claude Code, Cursor et VS Code se branchent sur le [serveur MCP](https://docs.rustine.io/mcp/connect.md) avec OAuth : pas de clé à copier, tu cliques sur **Autoriser** et l'agent renouvelle son accès seul. Tu vois chaque agent branché dans **Réglages › Agents connectés**, et tu le déconnectes d'un clic.

Le jeton d'accès OAuth (`rat_…`) marche aussi sur l'API, dans le même en-tête. Il n'a que les permissions accordées à l'agent : chaque page de la référence dit laquelle la route demande (`scans:read`, `scans:run`, `fixes:unlock` ou `issues:write`). Sans elle, la réponse est `403 scope_missing`.

## Les conditions

- Une offre qui ouvre l'API et le MCP : Pro, ou l'essai de l'offre Solo ([Accès](https://docs.rustine.io/access.md)).
- La double authentification activée sur ton compte Rustine, pour créer une clé ou autoriser un agent.

## Les refus

| Statut | `error.code` | Ce qui se passe |
| --- | --- | --- |
| 401 | [`authentication_required`](https://docs.rustine.io/api/errors#authentication_required) | Aucune clé dans la requête. |
| 401 | [`invalid_api_key`](https://docs.rustine.io/api/errors#invalid_api_key) | Clé fausse, révoquée ou expirée. |
| 403 | [`scope_missing`](https://docs.rustine.io/api/errors#scope_missing) | Le jeton OAuth n'a pas la permission. |
| 402 | [`api_plan_required`](https://docs.rustine.io/api/errors#api_plan_required) | L'offre n'ouvre pas l'API. |

## Exemples

### curl

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

### Réponse : 401 Unauthorized

```json
{
  "error": {
    "type": "authentication",
    "code": "invalid_api_key",
    "message": "Cette clé d'API ou ce jeton est invalide, révoqué ou expiré.",
    "doc_url": "https://docs.rustine.io/api/errors#invalid_api_key"
  }
}
```
