
# Bağlantı revizyonunu yayımlama

`POST /v1/connections/{connection_id}/revisions/{revision_id}:publish` · izin `connections:write`

Taslak bir revizyonu kurumsal bağlantının canlı yapılandırması hâline getirir. Tek adımda revizyonun içeriği canlı olanın yerine geçer:

- SAML: kimlik sağlayıcının varlık kimliği, SSO ve SLO URL'leri ve revizyonun imza sertifikaları;
- OIDC: istemci alanları ve revizyon bir tane taşıyorsa yeni istemci sırrı;
- SP host taşıma: SP host'u ve SP URL'leri. Önceki host 30 gün daha yanıt vermeye devam eder, sonra `404` döndürür.

Revizyonun, son 24 saat içinde **başarıyla tamamlanmış bu revizyona ait bir test oturum açma işlemi** olmalıdır: [Bağlantıyı test etme](test.md) sayfasında `revision_id` ile bir test başlatın ve işlemi tarayıcıda tamamlayın. Canlı yapılandırmanın testi bunun yerine geçmez.

Zaten yayımlanmış bir revizyonu yayımlamak hiçbir şey yazmaz ve `already_published: true` ile `200` döndürür; eşzamanlı iki yayımlama isteğinden yalnızca biri yazar. Yayımlama `connection.revision_published` olarak denetim kaydına geçirilir.

İstek gövdesi yoktur (hiç göndermeyin veya `{}` gönderin) ve `If-Match` yoktur, çünkü revizyonun bir sürümü yoktur. Taslak oluşturulduktan sonra canlı yapılandırma değiştiyse yayımlama reddedilir ve yeni bir taslak oluşturmanız gerekir.

## İstek

| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
| `connection_id` | yol | evet | Kurumsal bağlantı kimliği (`conn_…`). |
| `revision_id` | yol | evet | [Revizyonları listeleme](revisions.md) sayfasındaki revizyon kimliği (`connrev_…`). |
| `Idempotency-Key` | üst bilgi | hayır | Yeniden denenen bir isteği güvenli hâle getiren isteğe bağlı anahtar (16-64 karakter). |

## Yanıt

`200 OK`:

```json
{
  "revision": {
    "id": "connrev_01j9xr8c2d4e6f8g0h2j4k6m8n",
    "connection_id": "conn_01j9xp6q0r1s5t7v9w1x3y5z7b",
    "protocol": "saml",
    "kind": "sp_host",
    "status": "published",
    "discard_reason": null,
    "created_at": "2026-10-28T10:00:00Z",
    "decided_at": "2026-10-28T11:00:00Z",
    "purge_after": "2027-01-26T11:00:00Z",
    "superseded_revision_id": null,
    "changes": {
      "sp_host": "login.example.com",
      "idp_entity_id": null,
      "idp_sso_url": null,
      "idp_slo_url": null,
      "certificate_fingerprints": [],
      "mfa_authn_context_values": null,
      "issuer": null,
      "client_id": null,
      "client_auth_method": null,
      "provider_profile": null,
      "client_secret_change": null
    },
    "latest_test": {
      "test_id": "conntest_01j9xr4a6b8c0d2e4f6g8h0j2k",
      "status": "passed",
      "failure_reason": null,
      "started_at": "2026-10-28T10:05:00Z",
      "completed_at": "2026-10-28T10:06:00Z"
    }
  },
  "already_published": false
}
```

## Hatalar

| HTTP | code | Ne zaman |
|---|---|---|
| 400 | `unknown_field` | Gövde boş değil ve `{}` değil. |
| 401 | `unauthenticated` | Kimlik bilgisi eksik, geçersiz veya iptal edilmiş. |
| 403 | `insufficient_permissions` | Kimlik bilgisinde `connections:write` izni yok. |
| 404 | `not_found` | Bağlantı veya revizyon bu ortamda yok ya da revizyon başka bir bağlantıya ait. |
| 409 | `conflict` | Bir ön koşul sağlanmıyor; `detail` hangisi olduğunu belirtir: revizyon iptal edilmiş; son 24 saat içinde başarıyla geçmiş bir testi yok; taslak oluşturulduktan sonra bağlantı değişti (yeni bir taslak oluşturun); önceki SP host taşımasının 30 günlük süresi hâlâ açık; yeni SP host artık bu ortamın bir host'u değil; bağlantı 3 aktif imza sertifikası sınırını aşardı. |
| 429 | `rate_limited` | Hız sınırı aşıldı; `Retry-After` süresinden sonra yeniden deneyin. |
| 503 | `service_unavailable` | Bir bağımlılık geçici olarak kullanılamıyor; `Retry-After` süresinden sonra yeniden deneyin. |

## Örnek

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

```bash
keenauth connections revisions publish conn_01j9xp6q0r1s5t7v9w1x3y5z7b connrev_01j9xr8c2d4e6f8g0h2j4k6m8n --yes
```
