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 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. |
Idempotency-Key |
encabezado | no | Clave opcional que hace segura la reintentación de una solicitud (de 16 a 64 caracteres). |
Respuesta
200 OK:
{
"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
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)"
keenauth connections revisions publish conn_01j9xp6q0r1s5t7v9w1x3y5z7b connrev_01j9xr8c2d4e6f8g0h2j4k6m8n --yes