
# Eine Verbindungsrevision veröffentlichen

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

Macht eine Entwurfsrevision zur aktiven Konfiguration einer Unternehmensverbindung. In einem Schritt ersetzt das Material der Revision die aktive Konfiguration:

- SAML: die Entity-ID des Identitätsanbieters, die SSO- und SLO-URLs sowie die Signaturzertifikate der Revision;
- OIDC: die Client-Felder und, falls die Revision eines enthält, das neue Client-Secret;
- Migration des SP-Hosts: der SP-Host und die SP-URLs. Der bisherige Host beantwortet weitere 30 Tage Anfragen und liefert danach `404`.

Die Revision benötigt eine **bestandene Test-Anmeldung dieser Revision** aus den letzten 24 Stunden: Starten Sie eine mit [Eine Verbindung testen](test.md) und `revision_id`, und schließen Sie sie im Browser ab. Der Test der aktiven Konfiguration zählt nicht.

Die Veröffentlichung einer bereits veröffentlichten Revision schreibt nichts und gibt `200` mit `already_published: true` zurück; bei zwei gleichzeitigen Veröffentlichungen schreibt nur eine. Die Veröffentlichung wird als `connection.revision_published` protokolliert.

Der Anfragetext ist leer (senden Sie keinen oder `{}`), ein `If-Match` gibt es nicht: Eine Revision hat keine Version. Wurde die aktive Konfiguration geändert, nachdem der Entwurf erstellt wurde, wird die Veröffentlichung abgelehnt und Sie erstellen einen neuen Entwurf.

## Anfrage

| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| `connection_id` | Pfad | ja | ID der Unternehmensverbindung (`conn_…`). |
| `revision_id` | Pfad | ja | Revisions-ID (`connrev_…`) aus [Die Revisionen auflisten](revisions.md). |
| `Idempotency-Key` | Header | nein | Optionaler Schlüssel, der eine wiederholte Anfrage sicher macht (16–64 Zeichen). |

## Antwort

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

## Fehler

| HTTP | Code | Wann |
|---|---|---|
| 400 | `unknown_field` | Der Anfragetext ist weder leer noch `{}`. |
| 401 | `unauthenticated` | Die Anmeldedaten fehlen, sind ungültig oder widerrufen. |
| 403 | `insufficient_permissions` | Die Anmeldedaten haben nicht `connections:write`. |
| 404 | `not_found` | Die Verbindung oder die Revision existiert in dieser Umgebung nicht, oder die Revision gehört zu einer anderen Verbindung. |
| 409 | `conflict` | Eine Voraussetzung ist nicht erfüllt; `detail` nennt welche: Die Revision wurde verworfen; sie hat keine bestandene Testanmeldung aus den letzten 24 Stunden; die Verbindung wurde geändert, nachdem der Entwurf erstellt wurde (erstellen Sie einen neuen Entwurf); das 30-Tage-Fenster der vorherigen SP-Host-Migration ist noch offen; der neue SP-Host ist kein Host dieser Umgebung mehr; die Verbindung würde mehr als 3 aktive Signaturzertifikate haben. |
| 429 | `rate_limited` | Das Ratenlimit wurde überschritten; wiederholen Sie die Anfrage nach der Zeit aus `Retry-After`. |
| 503 | `service_unavailable` | Eine Abhängigkeit ist vorübergehend nicht verfügbar; wiederholen Sie die Anfrage nach der Zeit aus `Retry-After`. |

## Beispiel

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