
# 接続のリビジョンを公開する

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

下書きのリビジョンを、エンタープライズ接続の有効な設定にします。1 回の操作で、リビジョンの内容が現在の有効な設定を置き換えます。

- SAML: ID プロバイダのエンティティ ID、SSO および SLO の URL、リビジョンの署名証明書
- OIDC: クライアントのフィールド、およびリビジョンに含まれている場合は新しいクライアントシークレット
- SP ホストの移行: SP ホストと SP の URL。移行前のホストは、さらに 30 日間応答し続けたあと、`404` を返します。

リビジョンには、過去 24 時間以内に**そのリビジョンでサインインテストに成功していること**が必要です。[接続をテストする](test.md) で `revision_id` を指定してテストを開始し、ブラウザでテストを完了してください。現在有効な設定をテストしても、この条件は満たされません。

すでに公開済みのリビジョンを公開しようとした場合は、何も書き込まれず、`already_published: true` を含む `200` が返されます。同時に 2 件の公開要求が行われた場合、書き込まれるのはそのうち 1 件だけです。この公開は `connection.revision_published` として監査されます。

リクエストボディは不要です (送らないか `{}` を送ります)。`If-Match` も不要です。リビジョンにはバージョンがないためです。下書きを作成したあとに有効な設定が変更されていた場合、公開は拒否されるので、新しい下書きを作成してください。

## リクエスト

| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| `connection_id` | path | はい | エンタープライズ接続の ID (`conn_…`)。 |
| `revision_id` | path | はい | [リビジョンを一覧表示する](revisions.md) で取得できるリビジョン ID (`connrev_…`)。 |
| `Idempotency-Key` | header | いいえ | リクエストを再送しても安全にするための任意のキー (16〜64 文字)。 |

## レスポンス

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

## エラー

| HTTP | code | 発生条件 |
|---|---|---|
| 400 | `unknown_field` | ボディが空でも `{}` でもない場合。 |
| 401 | `unauthenticated` | 認証情報が指定されていない、無効、または取り消されている場合。 |
| 403 | `insufficient_permissions` | 認証情報に `connections:write` がない場合。 |
| 404 | `not_found` | 接続またはリビジョンがこの環境に存在しない場合、またはリビジョンが別の接続に属している場合。 |
| 409 | `conflict` | 前提条件を満たしていません。`detail` に理由が示されます。リビジョンが破棄された場合、過去 24 時間以内に成功したテストがない場合、下書き作成後に接続が変更された場合 (新しい下書きを作成してください)、前回の SP ホスト移行の 30 日間の期間がまだ残っている場合、新しい SP ホストがこの環境のホストではなくなった場合、接続で有効な署名証明書が 3 件を超える場合。 |
| 429 | `rate_limited` | レート制限を超えた場合。`Retry-After` の期間が経過してから再試行してください。 |
| 503 | `service_unavailable` | 依存先が一時的に利用できない場合。`Retry-After` の期間が経過してから再試行してください。 |

## 例

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