
# Yapılandırma revizyonunu geri yükle

`POST /v1/config-revisions/{revision_id}:restore` · izinler `config:write`, `config:read` ve revizyonun türlerinin okuma izinleri

Revizyonu saklayan uygulamayı geri alan yeni bir [plan](../config-plans/create.md) oluşturur. Henüz hiçbir şey değişmez: planı inceleyin, sonra [`POST /v1/config-plans/{plan_id}:apply`](../config-plans/apply.md) ile uygulayın. Geri alma her değişiklik gibi plan → uygula yolundan geçer; bayatlık denetimi, silme onayı, sır ve izin kuralları aynıdır.

Planın hedefi revizyondur:

- Uygulamanın güncellediği ya da sildiği kaynaklar uygulamadan önceki spec'lerine döner. Silinen kaynaklar yeniden oluşturulur.
- Uygulamanın oluşturduğu kaynaklar silinir. Bu durumda plan `prune: true` taşır ve revizyonun türlerinin bugünkü bütün kaynaklarını kapsar; uygulamanın dokunmadığı kaynaklar `no_op` olarak planlanır, yani yalnız oluşturulanlar silinir. Uygulamak, silme içeren her plan gibi `confirm_deletions` ister.
- Revizyonun kapsamadığı türlere dokunulmaz.

Revizyonlar gizli değer içermez. Yeniden oluşturulan bir bağlantı plan uygulanırken istemci sırrını ister (`requires_secret`, `secret_required` uyarısı). Asıl uygulamanın değiştirdiği bir sır geri yüklenmez.

## İstek

| Parametre | Açıklama |
|---|---|
| `revision_id` | Revizyon kimliği, `cfgr_…`; [revizyon listesinden](list.md). |

İsteğin gövdesi yoktur. Boş gövde, `{}` ya da `null` kabul edilir; herhangi bir alan reddedilir. Yeniden denemeleri güvenli kılmak için `Idempotency-Key` başlığı gönderin.

## Yanıt

`201 Created`, `Location: /v1/config-plans/{plan_id}` ve `Cache-Control: no-store` ile. Gövde, [plan oluşturmanın yanıtıyla](../config-plans/create.md) aynı biçimde bir plandır. Plan 1 saat geçerlidir ve ortamın plan hız sınırına ve kotasına sayılır. Ortamın yönetim günlüğündeki `config_plan.created` kaydı planın bu revizyondan geldiğini yazar.

## Hatalar

| HTTP | code | Ne zaman |
|---|---|---|
| 400 | `malformed_request`, `unknown_field` | Gövde boş, `{}` ya da `null` değil. |
| 401 | `unauthenticated` | Kimlik bilgisi eksik, geçersiz ya da iptal edilmiş. |
| 403 | `insufficient_permissions` | Kimlik bilgisinde planın gerektirdiği bir izin yok; `required_permissions` hepsini listeler. |
| 404 | `not_found` | Revizyon yok, başka bir ortama ait ya da 90 günden eski. |
| 413 | `config_document_too_large` | Planın belgesi 5.000 kaynağı ya da 10 MiB'ı aşacak. |
| 422 | `validation_failed` | Revizyon artık geri yüklenemiyor; aşağıya bakın. `errors[].pointer` revizyonun içini gösterir (`/revision/<kind>/<key>/...`). |
| 429 | `rate_limited` | Plan hız sınırına ya da ortamın plan kotasına ulaşıldı; `Retry-After` süresinden sonra yeniden deneyin. |
| 503 | `service_unavailable` | Plan kapasitesi dolu ya da bir bağımlılık geçici olarak kullanılamıyor; `Retry-After` süresinden sonra yeniden deneyin. |

| `errors[].code` | Anlamı |
|---|---|
| `not_restorable` | `/revision_id`: revizyon artık var olmayan bir türü kapsıyor. |
| `invalid` | Saklanan bir spec güncel yapılandırma şemasına artık uymuyor. |
| `unresolved_reference` | Geri yüklenen bir kaynak, var olmayacak bir `key`'e başvuruyor. |
| `key_in_use` | `key` artık yapılandırmanın yönetmediği bir uygulamaya ya da API'ye ait. |
| `still_referenced` | `/revision/created`: uygulamanın oluşturduğu bir kaynağa kalan bir kaynak hâlâ başvuruyor. |

## Örnek

```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
```
