
# Aggiornare un'applicazione

`PATCH /v1/applications/{application_id}` · permesso `applications:write`

Aggiorna un'applicazione con una Merge Patch JSON (`application/merge-patch+json`, RFC 7396): i campi che invii cambiano, `null` cancella un campo nullable, gli array vengono sostituiti completamente. `If-Match` è obbligatorio: senza di esso la richiesta fallisce con `428`, con una versione obsoleta con `412`. I campi immutabili `key`, `app_type`, `registration_source` e `owner_org_id` restituiscono `422` con codice `immutable` se invii un valore diverso. Una patch che non cambia nulla lascia l'applicazione e la sua versione inalterate.

## Richiesta

**Header**: `If-Match: "<version>"` (obbligatorio), `Content-Type: application/merge-patch+json`.

**Path**: `application_id` (`app_…`).

**Body**: uno qualsiasi dei campi scrivibili elencati nella pagina di creazione (`key`, `name`, `app_type`, … `connection_ids`). `null` cancella un campo che è nullable; gli array sostituiscono l'intero elenco; `jwks` è sostituito come oggetto. I campi di sola lettura (`id`, `client_id`, `version`, `created_at`, `updated_at`, `last_token_issued_at`, `last_token_asn`) vengono rifiutati.

## Risposta

`200 OK` con l'applicazione aggiornata e il nuovo `ETag`.

## Errori

| HTTP | `code` | Quando |
|---|---|---|
| 401 | `unauthenticated` | La chiave è mancante, non valida o revocata. |
| 403 | `insufficient_permissions` | La chiave non ha il permesso richiesto. |
| 404 | `not_found` | L'applicazione non esiste in questo ambiente. |
| 428 | `precondition_required` | L'header `If-Match` è mancante. |
| 412 | `precondition_failed` | La versione in `If-Match` è obsoleta. |
| 422 | `validation_failed` | Un campo non è valido o un campo immutabile è cambiato. |
| 422 | `policy_conflict` | `allowed_first_factors` non ha alcun metodo in comune con l'insieme dei fattori di primo livello dell'ambiente. |
| 400 | `unknown_field` | La patch ha un campo che non fa parte dello schema (inclusi i campi di sola lettura come `id`). |
| 415 | `unsupported_media_type` | `Content-Type` non è `application/merge-patch+json`. |

## Esempio

```bash
curl -X PATCH https://api.eu.keenauth.com/v1/applications/app_6f8d0cjgbmf0gtn2rg6pscp3cg \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/merge-patch+json" \
  -H 'If-Match: "1"' \
  -d '{"name":"Portal v2","login_host":null}'
```
