Actualizar una API
PATCH /v1/apis/{api_id} · permiso apis:write
Actualiza una API con un parche de fusión JSON (RFC 7396, application/merge-patch+json): los campos que envías cambian, los campos que omites se quedan. If-Match es requerido. key e identifier no pueden cambiar después de la creación, y la API del sistema no puede ser modificada. Un parche que no cambia nada no escribe nada y mantiene la versión.
Solicitud
| Parámetro | En | Descripción |
|---|---|---|
api_id |
path | El id de la API. |
If-Match |
header | El ETag de la última lectura (requerido). |
Cuerpo: cualquiera de los campos escribibles abajo (todos opcionales). Un campo no puede ser removido con null.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
key |
string | no | Clave de configuración estable, ^[a-z0-9_-]{1,64}$. Inmutable. |
identifier |
string | no | Audiencia de token: una URL https (sin consulta ni fragmento) o urn:<nid>:<nss>; almacenada en forma canónica. Inmutable. El espacio de nombres urn:idp: está reservado. |
name |
string | no | 1-128 caracteres. |
access_token_lifetime_s |
integer | no | 60-86400. Por defecto 3600 (600 con mcp_profile). |
token_format |
string | no | jwt (por defecto) u opaque. |
rbac_mode |
string | no | Cómo llegan los roles y permisos al token: claims (por defecto) añade permissions y org_permissions; off no añade ninguno (org_roles se sigue añadiendo); enforce los añade y además limita los scopes concedidos a los permisos efectivos del usuario. |
allow_offline_access |
boolean | no | Por defecto true. |
require_resource_indicator |
boolean | no | Por defecto false (true con mcp_profile). |
dpop_required |
boolean | no | Por defecto false. |
mcp_profile |
boolean | no | Requiere un identifier https y require_resource_indicator: true. |
first_party_access |
string | no | all (por defecto) u granted_only. |
introspection_applications |
array | no | Aplicaciones (app_…) que pueden introspeccionar los tokens de esta API, máximo 50, sin duplicados. Solo aplicaciones web y m2m del mismo entorno. La lista se reemplaza en su totalidad; [] la vacía, null se rechaza. |
Aplicaciones de introspeción
El punto de conexión de introspeción (POST <issuer>/oauth2/introspect, RFC 7662) responde con active: true para un token de acceso solo a dos llamadores: la aplicación a la que se emitió el token, o una aplicación en la lista introspection_applications de la API nombrada en el aud del token. Todos los demás llamadores reciben active: false, por lo que las API no pueden leer los tokens entre sí. Solo las aplicaciones confidenciales (web, m2m) del mismo entorno pueden listarse; la lista se almacena como un conjunto y se devuelve en orden de ID. Una aplicación suspendida permanece en la lista pero no puede introspeccionar. La lista de la API del sistema no se puede escribir.
Respuesta
200 OK con el nuevo ETag:
{
"id": "api_01h455vb4pex5vsknk084sn02q",
"key": "orders",
"identifier": "https://api.example.com/orders",
"name": "Orders API",
"is_system": false,
"access_token_lifetime_s": 3600,
"token_format": "jwt",
"rbac_mode": "off",
"allow_offline_access": true,
"require_resource_indicator": false,
"dpop_required": false,
"mcp_profile": false,
"first_party_access": "all",
"introspection_applications": ["app_01h455vb4pex5vsknk084sn02r"],
"created_at": "2026-10-05T12:00:00Z",
"updated_at": "2026-10-05T12:00:00Z"
}
Errores
| HTTP | código | Cuándo |
|---|---|---|
| 400 | unknown_field |
El parche contiene un campo de solo lectura o desconocido. |
| 404 | not_found |
No existe tal API en este entorno. |
| 409 | conflict |
La API es la API del sistema. |
| 412 | precondition_failed |
If-Match no coincide con la versión actual. |
| 415 | unsupported_media_type |
El tipo de contenido no es application/merge-patch+json. |
| 422 | validation_failed |
Un valor es inválido, un campo fue configurado a null, o key / identifier fue cambiado. |
| 422 | validation_failed |
Un elemento introspection_applications no existe en este entorno (unknown_application), no es confidencial (not_confidential), es un duplicado (duplicate) o no es un ID app_… (invalid_value); el puntero nombra el índice en la solicitud. |
| 428 | precondition_required |
If-Match está faltando. |
Ejemplo
curl -X PATCH https://api.eu.keenauth.com/v1/apis/api_01h455vb4pex5vsknk084sn02q \
-H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
-H "Content-Type: application/merge-patch+json" \
-H 'If-Match: "1"' \
-d '{"access_token_lifetime_s":900}'