
# Publicar una revisión de conexión

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

Convierte un borrador de revisión en la configuración activa de una conexión empresarial. En un solo paso, el contenido de la revisión reemplaza al activo:

- SAML: el ID de entidad del proveedor de identidad, las URL de SSO y SLO, y los certificados de firma de la revisión;
- OIDC: los campos del cliente y, si la revisión incluye uno, el nuevo secreto de cliente;
- migración de host de SP: el host de SP y las URL de SP. El host anterior seguirá respondiendo durante 30 días más y, después, devolverá `404`.

La revisión necesita una **prueba de inicio de sesión superada de esa misma revisión** realizada en las últimas 24 horas: inicie una con [Probar una conexión](test.md) y `revision_id`, y complétela en el navegador. Probar la configuración activa no cuenta.

Publicar una revisión que ya está publicada no escribe nada y devuelve `200` con `already_published: true`; de dos publicaciones concurrentes, solo una escribe. La publicación se audita como `connection.revision_published`.

No hay cuerpo de la solicitud (envíe ninguno o `{}`) y tampoco `If-Match`: una revisión no tiene versión. Si la configuración activa cambió después de crear el borrador, la publicación se rechaza y debe crear un nuevo borrador.

## Solicitud

| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
| `connection_id` | ruta | sí | ID de la conexión empresarial (`conn_…`). |
| `revision_id` | ruta | sí | ID de la revisión (`connrev_…`) de [Listar las revisiones](revisions.md). |
| `Idempotency-Key` | encabezado | no | Clave opcional que hace segura la reintentación de una solicitud (de 16 a 64 caracteres). |

## Respuesta

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

## Errores

| HTTP | código | Cuándo |
|---|---|---|
| 400 | `unknown_field` | El cuerpo no está vacío ni es `{}`. |
| 401 | `unauthenticated` | La credencial falta, no es válida o fue revocada. |
| 403 | `insufficient_permissions` | La credencial no tiene `connections:write`. |
| 404 | `not_found` | La conexión o la revisión no existen en este entorno, o la revisión pertenece a otra conexión. |
| 409 | `conflict` | No se cumple una condición previa; `detail` indica cuál: la revisión fue descartada; no tiene una prueba superada de las últimas 24 horas; la conexión cambió después de crear el borrador (cree un nuevo borrador); la ventana de 30 días de la migración de host de SP anterior sigue abierta; el nuevo host de SP ya no es un host de este entorno; la conexión superaría los 3 certificados de firma activos. |
| 429 | `rate_limited` | Se superó el límite de frecuencia; reintente después del periodo indicado en `Retry-After`. |
| 503 | `service_unavailable` | Una dependencia no está disponible temporalmente; reintente después del periodo indicado en `Retry-After`. |

## Ejemplo

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