
# Exporter la configuration

`GET /v1/config-export` · autorisation `config:read` et autorisation de lecture de chaque type exporté

Renvoie la configuration de l'environnement sous la forme d'un document indépendant de l'environnement, afin que vous puissiez le relire, le conserver dans un système de gestion de versions ou l'appliquer ultérieurement à un autre environnement. Le document ne contient ni identifiants, ni versions, ni horodatages, ni secrets propres à l'environnement : les ressources se réfèrent les unes aux autres par `key`. Une même configuration produit toujours un document identique octet pour octet (types dans l'ordre ci-dessous, puis par `key` ; listes d'ensembles triées). La réponse est au format JSON, qui est aussi un YAML valide ; `keenauth config export` affiche le YAML par défaut.

## Requête

L'environnement provient de l'identifiant d'accès. Le seul paramètre de requête est facultatif.

| Paramètre | Description |
|---|---|
| `kinds` | Types à exporter séparés par des virgules, par exemple `kinds=connection,api`. Sans ce paramètre, tous les types sont exportés. |

| Type | `key` | Autorisations en plus de `config:read` |
|---|---|---|
| `environment_settings` | `default` | `environment-settings:read` |
| `identity_settings` | `default` | `identity-settings:read` |
| `attack_protection` | `default` | `attack-protection:read` |
| `branding` | `default` | `branding:read` |
| `connection` | connexion `key` | `connections:read` |
| `api` | API `key` | `apis:read`, `applications:read` |
| `role` | rôle `key` | `roles:read`, `apis:read` |
| `application` | application `key` | `applications:read`, `apis:read`, `connections:read` |
| `application_branding` | application `key` | `branding:read`, `applications:read` |

`api`, `role` et `application` nécessitent également les autorisations des types auxquels ils renvoient, car les références sont résolues vers leurs `key`. `config:read` seul n'accorde aucune lecture de ressource.

## Réponse

Réponse `200 OK` avec `Cache-Control: no-store`.

- Les références utilisent des `key` : `application.default_api`, `application.connections` (l'ordre des boutons est conservé), `application.api_grants[].api` et `api.introspection_applications`.
- Une connexion OIDC d'entreprise transporte son matériel de fédération sous la forme `oidc` (`issuer`, `client_id`, `client_auth_method`, `provider_profile`) ; l'URI de redirection, l'hôte SP et le secret lui-même sont propres à l'environnement et ne sont pas exportés, et `oidc` vaut `null` lorsque aucun matériel n'a encore été écrit. Dans un document que vous appliquez, `oidc: null` laisse le matériel inchangé. L'identifiant de locataire Entra n'est pas lisible ; une connexion avec le profil `entra` ne peut donc pas encore être gérée par le document.
- Les valeurs secrètes ne sont jamais exportées. Un secret que vous avez fourni à KeenAuth (le `client_secret` d'une connexion sociale ou OIDC d'entreprise) apparaît sous la forme d'un espace réservé, `{"secret_ref": {"source": "env", "name": "KEENAUTH_CONNECTION_<KEY>_CLIENT_SECRET"}}` ; la CLI lit la valeur à partir de cette variable d'environnement lorsque le document est appliqué. Les autres connexions ont `"client_secret": null`. Les secrets émis par KeenAuth (secrets client des applications, clés d'API, secrets de signature des webhooks) et les clés privées ne sont pas du tout exportés ; l'environnement cible émet les siens. `jwks` ne contient que des clés publiques.
- L'API système intégrée n'est pas exportée ; elle existe dans chaque environnement. Les applications détenues par l'organisation et les applications enregistrées par le client lui-même (Dynamic Client Registration, Client ID Metadata Document) ne sont pas non plus exportées ; chacune est listée dans `warnings` avec le code `resource_skipped`.
- Une référence qui ne peut pas être résolue (par exemple vers une application ignorée) est retirée du document et listée dans `warnings` avec le code `reference_dropped` et un `pointer` JSON.
- `attack_protection` correspond à l'objet que vous avez écrit avec [Remplacer la protection contre les attaques](../attack-protection/put.md), et non aux valeurs effectives. Chaque section et chaque champ sont écrits ; `null` signifie non défini, de sorte que l'environnement cible applique ses propres valeurs par défaut, ses seuils de sécurité minimaux et son offre. Une promotion ne fige donc jamais les valeurs par défaut de la source. Lorsque l'offre de l'environnement cible ne comprend pas un paramètre écrit (par exemple `risk_policy.mode: enforce`), l'application du plan échoue avec `403 plan_feature_unavailable` et rien n'est écrit.
- `role` est un rôle d'environnement : `name`, `description`, `is_privileged`, `assignable_in_self_service` et `permissions`, chaque autorisation étant écrite sous la forme `{"api": "<API key>", "value": "<permission value>"}` (les identifiants sont propres à l'environnement, ils n'apparaissent donc jamais). Les rôles intégrés `admin` et `member` sont en lecture seule : ils ne sont pas exportés et sont listés dans `warnings` avec le code `resource_skipped` et la raison `system_role` ; un document ne peut ni créer, ni modifier, ni supprimer ces rôles (`422`, `key_in_use`). Les rôles d'organisation sont des données et non de la configuration ; ils ne sont pas exportés. Un rôle peut faire référence aux autorisations de l'API système intégrée. La suppression d'un rôle encore attribué échoue ; retirez-le d'abord.
- `branding` correspond au thème en brouillon, au CSS personnalisé et au modèle de page de l'environnement ; `application_branding` est le thème en brouillon d'une application et n'apparaît que pour les applications qui en possèdent un. Les surcharges de textes et les thèmes d'organisation ne sont pas encore exportés.
- Si deux espaces réservés finissent par avoir le même nom de variable (clés ne différant que par `-` et `_`), les deux ressources sont listées dans `warnings` avec le code `secret_ref_name_shared` ; renommez l'une des variables dans votre fichier.
- Le schéma JSON du document est publié à `https://docs.keenauth.com/config/schema/v1.json` ; indiquez-le à votre éditeur pour la complétion et la validation.

```json
{
  "apiVersion": "config.keenauth.com/v1",
  "kinds": ["connection", "api", "application"],
  "resources": [
    {"kind": "connection", "key": "db", "spec": {"type": "database", "strategy": "password", "name": "db", "display_name": null, "status": "active", "settings": {}, "client_secret": null}},
    {"kind": "api", "key": "orders", "spec": {"identifier": "https://api.example.com/orders", "name": "Orders", "access_token_lifetime_s": 3600, "token_format": "jwt", "rbac_mode": "off", "allow_offline_access": false, "require_resource_indicator": false, "dpop_required": false, "mcp_profile": false, "first_party_access": "all", "introspection_applications": [], "permissions": [{"value": "orders:read", "display_name": null, "description": null, "consent_text_i18n": {}, "sensitivity": "normal"}]}},
    {"kind": "application", "key": "web", "spec": {"name": "Web", "app_type": "spa", "default_api": "orders", "connections": ["db"], "api_grants": [{"api": "orders", "scopes": ["orders:read"], "default_scopes": []}], "redirect_uris": ["https://app.example.com/callback"]}}
  ],
  "warnings": [
    {"code": "resource_skipped", "kind": "application", "key": "partner-bot", "reason": "organization_owned"}
  ]
}
```

La spécification `application` ci-dessus est abrégée ; la liste complète des champs figure dans la référence de l'API.

## Erreurs

| HTTP | code | Quand |
|---|---|---|
| 401 | `unauthenticated` | L'identifiant d'accès est absent, invalide ou révoqué. |
| 403 | `insufficient_permissions` | L'identifiant d'accès ne dispose pas d'une autorisation requise ; `required_permissions` les liste toutes. |
| 413 | `config_document_too_large` | Le document dépasserait 5 000 ressources ou 10 MiB ; exportez moins de types avec `kinds`. |
| 422 | `validation_failed` | `kinds` est répété, dépasse 256 caractères ou nomme un type inconnu. |
| 429 | `rate_limited` | La limite de débit a été dépassée ; réessayez après la période `Retry-After`. |
| 503 | `service_unavailable` | Une dépendance est temporairement indisponible ; réessayez après la période `Retry-After`. |

## Exemple

```bash
curl "https://api.eu.keenauth.com/v1/config-export?kinds=connection,api,application" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"

keenauth config export --kinds connection,api,application > keenauth.yaml
```
