
# Suspender una aplicación

`POST /v1/applications/{application_id}:suspend` · permiso `applications:write`

Establece el `status` de la aplicación en `suspended`. A partir de ese momento, la aplicación no puede obtener nuevos tokens: la autorización, PAR, la autorización de dispositivo, el endpoint de tokens (incluidos el refresh y `client_credentials`), la introspección y la revocación la rechazan como cliente. La suspensión también pone fin a lo que la aplicación ya posee: KeenAuth revoca sus familias de refresh tokens activas abiertas antes de la suspensión (motivo `client_revoked`) y marca su `client_id`, de modo que la introspección y userinfo rechazan los access tokens emitidos a la aplicación antes de ese punto. Un resource server que solo verifica la firma del JWT sigue aceptando ese access token hasta que expira. Las credenciales de cliente de la aplicación se conservan, así que reanudarla no requiere un secreto nuevo. La solicitud no tiene cuerpo (vacío o `{}`). Suspender una aplicación que ya está suspendida no cambia nada y devuelve la aplicación actual con la misma versión. El cambio se escribe en el registro de auditoría de gestión como `application.updated` y se publica como los eventos `application_changed` y `application_status_changed`.

## Solicitud

**Cabeceras**: `If-Match: "<version>"` (opcional). Con `If-Match`, el cambio solo se aplica a esa versión (`412` en caso contrario); sin ella, se usa la última versión y la solicitud se reintenta si otro escritor modifica la aplicación al mismo tiempo. Envía una cabecera `Idempotency-Key` para que los reintentos sean seguros.

| Parámetro | En | Obligatorio | Descripción |
|---|---|---|---|
| `application_id` | path | sí | Identificador de la aplicación, con prefijo `app_`. |

## Respuesta

`200 OK` con la aplicación (`"status": "suspended"`) y su `ETag`.

## Errores

Todo error es un cuerpo `application/problem+json` con un `code` estable.

| HTTP | `code` | Cuándo |
|---|---|---|
| 400 | `malformed_request`, `unknown_field` | Se envió un cuerpo que no es JSON válido o tiene un campo. |
| 401 | `unauthenticated` | La clave de API falta, no es válida o ha sido revocada. |
| 403 | `insufficient_permissions` | La clave no tiene el permiso `applications:write`. |
| 404 | `not_found` | La aplicación no existe en este entorno (o el identificador está mal formado). |
| 412 | `precondition_failed` | La versión en `If-Match` está desactualizada. |
| 429 | `rate_limited` | Se superó el límite de frecuencia; respeta `Retry-After`. |
| 503 | `service_unavailable` | Una dependencia no está disponible temporalmente; reintenta más tarde. |

## Ejemplo

```bash
curl -X POST https://api.eu.keenauth.com/v1/applications/app_6f8d0cjgbmf0gtn2rg6pscp3cg:suspend \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
```

CLI: `keenauth applications suspend app_6f8d0cjgbmf0gtn2rg6pscp3cg --yes`
