
# Restaurar una revisión de configuración

`POST /v1/config-revisions/{revision_id}:restore` · permisos `config:write`, `config:read` y los permisos de lectura de los tipos de la revisión

Crea un nuevo [plan](../config-plans/create.md) que deshace la aplicación que guardó la revisión. Todavía no cambia nada: revisa el plan y luego aplícalo con [`POST /v1/config-plans/{plan_id}:apply`](../config-plans/apply.md). La restauración sigue el mismo camino plan → aplicación que cualquier otro cambio, así que se aplican las mismas reglas de comprobación de obsolescencia, confirmación de eliminaciones, secretos y permisos.

El destino del plan es la revisión:

- Los recursos que la aplicación actualizó o eliminó recuperan la especificación que tenían antes de la aplicación. Los recursos eliminados se vuelven a crear.
- Los recursos que la aplicación creó se eliminan. En ese caso el plan tiene `prune: true` y cubre cada recurso actual de los tipos de la revisión; los recursos que la aplicación no tocó se planifican como `no_op`, de modo que solo se eliminan los creados. Aplicarlo necesita `confirm_deletions`, como cualquier plan con eliminaciones.
- Los tipos que la revisión no cubre no se modifican.

Las revisiones no contienen valores secretos. Una conexión que se vuelve a crear necesita su secreto de cliente al aplicar el plan (`requires_secret`, una advertencia `secret_required`). Un secreto cambiado por la aplicación original no se restaura.

## Solicitud

| Parámetro | Descripción |
|---|---|
| `revision_id` | El id de la revisión, `cfgr_…`, de [la lista de revisiones](list.md). |

La solicitud no tiene cuerpo. Se acepta un cuerpo vacío, `{}` o `null`; cualquier campo se rechaza. Envía una cabecera `Idempotency-Key` para que los reintentos sean seguros.

## Respuesta

`201 Created` con `Location: /v1/config-plans/{plan_id}` y `Cache-Control: no-store`. El cuerpo es un plan, con la misma forma que [la respuesta de creación de plan](../config-plans/create.md). El plan es válido durante 1 hora y cuenta para el límite de frecuencia y la cuota de planes del entorno. La entrada `config_plan.created` del registro de gestión del entorno indica que el plan proviene de esta revisión.

## Errores

| HTTP | code | Cuándo |
|---|---|---|
| 400 | `malformed_request`, `unknown_field` | El cuerpo no está vacío, no es `{}` ni `null`. |
| 401 | `unauthenticated` | La credencial falta, no es válida o está revocada. |
| 403 | `insufficient_permissions` | La credencial carece de un permiso que necesita el plan; `required_permissions` los lista todos. |
| 404 | `not_found` | La revisión no existe, pertenece a otro entorno o tiene más de 90 días. |
| 413 | `config_document_too_large` | El documento del plan superaría 5.000 recursos o 10 MiB. |
| 422 | `validation_failed` | La revisión ya no se puede restaurar; véase abajo. `errors[].pointer` apunta dentro de la revisión (`/revision/<kind>/<key>/...`). |
| 429 | `rate_limited` | Se alcanzó el límite de frecuencia de planes o la cuota de planes del entorno; reintenta después del periodo de `Retry-After`. |
| 503 | `service_unavailable` | La capacidad de planificación está llena o una dependencia no está disponible temporalmente; reintenta después del periodo de `Retry-After`. |

| `errors[].code` | Significado |
|---|---|
| `not_restorable` | `/revision_id`: la revisión cubre un tipo que ya no existe. |
| `invalid` | Una especificación guardada ya no coincide con el esquema de configuración actual. |
| `unresolved_reference` | Un recurso restaurado hace referencia a una `key` que no existirá. |
| `key_in_use` | La `key` ahora pertenece a una aplicación o API que la configuración no gestiona. |
| `still_referenced` | `/revision/created`: un recurso que creó la aplicación sigue referenciado por un recurso que permanece. |

## Ejemplo

```bash
curl -X POST "https://api.eu.keenauth.com/v1/config-revisions/cfgr_01m4qpqtywfs7930tb6kqn5rc5:restore" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

keenauth config revisions restore cfgr_01m4qpqtywfs7930tb6kqn5rc5
keenauth config apply cfgp_01m4qpqtywfs7930tb6kqn5rc5
```
