# Ton offre et tes quotas

Ton offre, l'accès à l'API, et ce qu'il te reste sur la période en scans rapides, audits et correctifs. Appelle-la avant une boucle de scans pour ne pas buter sur un `402`.

```
GET https://api.rustine.io/v1/account
```

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

## Réponse (200 OK)

- `object` (string, obligatoire) Le type d'objet, toujours le même pour une route donnée.
- `workspace` (object, obligatoire) Ton espace.
  - `id` (string, obligatoire) L'identifiant de l'espace.
  - `name` (string, obligatoire) Le nom de l'espace.
- `plan` (string, obligatoire) L'offre en cours : `free`, `solo` ou `pro`. (`free`, `solo`, `pro`)
- `api_access` (object, obligatoire) L'accès à l'API et au serveur MCP.
  - `allowed` (boolean, obligatoire) Vrai si l'API et le serveur MCP répondent en ce moment.
  - `trial_ends_at` (string | null, obligatoire) Solo seulement : la fin de l'essai de 14 jours une fois commencé ; `null` sur Pro, ou avant le premier appel.
- `period` (object, obligatoire) La période de quotas en cours (30 jours).
  - `start` (string, obligatoire) Le début de la période en cours.
  - `end` (string, obligatoire) Quand les compteurs repartent à zéro.
- `quotas` (object, obligatoire) Ce que la période te donne, et ce que tu en as utilisé.
  - `quick_scans` (object, obligatoire) Les scans rapides.
    - `limit` (integer, obligatoire) Inclus sur la période (tous les projets payés par l'espace).
    - `used` (integer, obligatoire) Déjà utilisés sur la période.
    - `remaining` (integer, obligatoire) Restants sur la période, avant les crédits de packs.
  - `audits` (object, obligatoire) Les audits complets.
    - `limit` (integer, obligatoire) Inclus sur la période (tous les projets payés par l'espace).
    - `used` (integer, obligatoire) Déjà utilisés sur la période.
    - `remaining` (integer, obligatoire) Restants sur la période, avant les crédits de packs.
  - `fixes` (object, obligatoire) Les correctifs.
    - `limit` (integer, obligatoire) Inclus sur la période (tous les projets payés par l'espace).
    - `used` (integer, obligatoire) Déjà utilisés sur la période.
    - `remaining` (integer, obligatoire) Restants sur la période, avant les crédits de packs.
- `free_fixes_left` (integer, obligatoire) Les correctifs offerts une fois à un espace Gratuit, pas encore utilisés.
- `pack_credits` (object, obligatoire) Les crédits de packs, utilisés une fois le quota de la période épuisé.
  - `scans` (integer, obligatoire) Crédits de scans.
  - `fixes` (integer, obligatoire) Crédits de correctifs.
- `projects` (object, obligatoire) Tes projets.
  - `limit` (integer, obligatoire) Les projets ouverts que permet l'offre (compris et en plus).
  - `used` (integer, obligatoire) Les projets de l'espace, en pause compris.
  - `paused` (integer, obligatoire) Les projets en pause, parce que l'offre en couvre moins.
- `addresses_per_project` (integer, obligatoire) Les adresses qu'un projet peut suivre avec cette offre.
- `features` (object, obligatoire) Ce que l'offre ouvre.
  - `full_audit` (boolean, obligatoire) Les audits complets (Solo, Pro).
  - `repositories` (boolean, obligatoire) L'analyse des dépôts GitHub (Solo, Pro).
  - `ai_fix` (boolean, obligatoire) AI Fix, Rustine écrit le correctif (Solo, Pro).
  - `alerts` (boolean, obligatoire) Les alertes de baisse de score et de nouvelle faille connue (Pro).

## Exemples

### curl

```bash
# La clé reste dans une variable, jamais dans l'adresse
curl https://api.rustine.io/v1/account \
  -H "Authorization: Bearer $RUSTINE_API_KEY"
```

### Node

```js
const res = await fetch(
  "https://api.rustine.io/v1/account",
  {
    headers: {
      Authorization: `Bearer ${process.env.RUSTINE_API_KEY}`,
    },
  },
)
const account = await res.json()
```

### Python

```python
import os

import requests

account = requests.get(
    "https://api.rustine.io/v1/account",
    headers={
        "Authorization": f"Bearer {os.environ['RUSTINE_API_KEY']}",
    },
).json()
```

### Réponse : 200 OK

```json
{
  "object": "account",
  "workspace": {
    "id": "0b6f4a52-3c1e-4d7a-9f2e-5a8c1d3e7b90",
    "name": "example.com"
  },
  "plan": "pro",
  "api_access": {
    "allowed": true,
    "trial_ends_at": null
  },
  "period": {
    "start": "2026-10-01T00:00:00.000Z",
    "end": "2026-10-31T00:00:00.000Z"
  },
  "quotas": {
    "quick_scans": {
      "limit": 300,
      "used": 12,
      "remaining": 288
    },
    "audits": {
      "limit": 180,
      "used": 4,
      "remaining": 176
    },
    "fixes": {
      "limit": 90,
      "used": 7,
      "remaining": 83
    }
  },
  "free_fixes_left": 0,
  "pack_credits": {
    "scans": 0,
    "fixes": 10
  },
  "projects": {
    "limit": 3,
    "used": 2,
    "paused": 0
  },
  "addresses_per_project": 20,
  "features": {
    "full_audit": true,
    "repositories": true,
    "ai_fix": true,
    "alerts": true
  }
}
```

## Erreurs

| Code | error.code | Ce qui se passe |
| --- | --- | --- |
| 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. |
| 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. |
| 429 | `rate_limited` | Trop de requêtes pour cette clé (120 par minute). Attends `Retry-After` secondes. |
| 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. |
| 503 | `service_unavailable` | Rustine est indisponible un instant. Réessaie avec la même `Idempotency-Key`. |

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