Los programas se autentican con claves de API. Una clave actúa como el miembro que la creó, limitada a los permisos que le asignes a la clave. No hay intercambio de tokens: la clave en sí es la credencial, enviada en cada llamada.
Las claves de API son gestionadas por los administradores en API Keys (en la parte Developer del menú). Crear claves requiere un plan con claves de API.
Crear una clave
- Abre API Keys y selecciona New API Key.
- Introduce un Name (hasta 100 caracteres) y, opcionalmente, una Description (hasta 500).
- En Module permissions, elige lo que la clave puede hacer, un módulo a la vez. Cada módulo ofrece un ajuste predefinido Read only; también puedes marcar permisos individuales. Usa Search modules or permissions… para encontrar uno. El selector solo muestra los permisos que tienes tú: «The key can do at most what you can do. If your own rights shrink later, the key loses them too.»
- Define Expires on. El valor por defecto es 90 días desde hoy, como máximo un año («90 days by default, at most a year.»).
- Opcionalmente, rellena IP allowlist: una subred por línea, por ejemplo
10.0.0.0/8o203.0.113.7/32. Vacío significa cualquier dirección que tu organización permita. - Deja Integration scopes (advanced) vacío, a menos que la documentación de una integración lo pida (por ejemplo, el aprovisionamiento SCIM).
- Selecciona Create Key y copia la clave ahora.
Aviso
«This key will only be shown once. Store it somewhere safe.» Hermetry almacena solo un hash. Si pierdes la clave, crea una nueva.
Si tienes autenticación de dos factores o una passkey, Hermetry te pide que la confirmes antes de crear la clave. No se puede crear una clave mientras suplantas a un miembro.
Formato de la clave
sk_live_<first 8 characters of the organisation id>_<48 random hexadecimal characters>
Las claves live pertenecen al servicio de producción, las test a instalaciones de prueba, de modo que no se puedan confundir entre sí.
Usar una clave
Envía la clave en la cabecera Authorization en cada llamada:
curl "https://<your host>/tenant/<tenantId>/api/iot/devices" \
-H "Authorization: Bearer sk_live_…"
- Una petición con clave de API se evalúa solo como esa clave. Una cookie del navegador en la misma petición se ignora.
- Las claves solo funcionan en las rutas de tu organización (
/tenant/<tenantId>/api/...). La organización de la clave debe coincidir con eltenantIdde la ruta. - Una clave nunca funciona en rutas de plataforma, de cuenta o de inicio de sesión.
Qué puede hacer una clave
En cada llamada, deben cumplirse todas estas condiciones:
- La clave tiene el permiso que requiere la ruta.
- El módulo del permiso está activado para tu organización.
- El miembro que creó la clave tiene el permiso ahora: cuentan su rol, sus grupos y las políticas de acceso de tu organización.
- El miembro sigue siendo un miembro activo y la organización está activa.
Una clave actúa con como máximo el rol Admin, incluso si la creó un Owner. Así, una clave nunca puede tener permisos exclusivos de Owner (por ejemplo, comandos directos a dispositivos, claves de firma de firmware, ajustes peligrosos de dispositivos, rotar el secreto de un webhook) ni permisos de los módulos de identidad y acceso (inicio de sesión, cuentas, claves de API, miembros, sesiones). Por tanto, una clave no puede crear ni rotar claves.
Claves de servicio
Una clave normalmente deja de funcionar cuando su creador abandona la organización. Un Owner puede abrir la clave y seleccionar Mark as service key: entonces seguirá funcionando después de que su creador se vaya («Yes: survives its creator») y actuará como el Owner que la marcó.
Redes permitidas
La lista de IP permitidas de una clave admite hasta 100 subredes en formato CIDR; una dirección única es /32. Las llamadas desde cualquier otro lugar se rechazan con 403 «This API key may not be used from the current IP address.» Una clave sin lista propia usa la lista por defecto de la organización (ver Settings más abajo). Las listas de IP permitidas y denegadas de tu organización para el inicio de sesión también se aplican a las claves.
Caducidad
Todas las claves caducan. El valor por defecto es 90 días; la fecha máxima es 365 días a partir de hoy, o menos si tu organización define un máximo inferior. Las claves caducadas dejan de funcionar por sí solas. Un administrador también puede revisar las claves caducadas (POST /api/api-keys/sweep-expired) para marcarlas como inactivas y enviar un evento de webhook api_key.expired por clave.
Rotar, desactivar y revocar
Abre una clave para ver su Identity, Usage (último uso, última IP de uso, total de verificaciones), Module permissions e Rotation history.
- Rotate key crea una clave sucesora con los mismos permisos, ámbitos, lista de redes y entorno. Define el Grace window (days): la clave antigua seguirá funcionando hasta que termine. «0 revokes the old key immediately.» Copia el nuevo secreto de inmediato.
- Deactivate detiene una clave hasta que la vuelvas a Activate. Una clave rotada no se puede reactivar: «A rotated key cannot be reactivated; use its successor.»
- Revoke elimina la clave: «Any integrations using this key will immediately stop working. This action cannot be undone.»
- Edit cambia los permisos de módulo de la clave. Puedes quitar cualquier permiso y añadir solo permisos que tengas tú. Los ámbitos de integración solo se pueden reducir.
En un incidente, un administrador puede revocar en un solo paso todas las claves activas de la organización.
POST/tenant/{tenantId}/api/api-keys/{apiKeyId}/rotate
Crea una clave sucesora. La clave antigua seguirá funcionando durante graceSeconds (de 0 a 2592000, es decir, 30 días; por defecto 86400, un día). 0 detiene la clave antigua de inmediato. El nuevo secreto rawKey aparece solo en esta respuesta. Solo se puede rotar una clave activa, no caducada y que no haya sido rotada antes (409 en otro caso).
Cuerpo de la petición application/json
{
"graceSeconds": 86400
}
Ejemplo curl
curl -X POST 'https://<your-host>/tenant/{tenantId}/api/api-keys/{apiKeyId}/rotate' \
-H 'Content-Type: application/json' \
-d '{"graceSeconds":86400}'
Respuestas
201Created
{
"key": {
"name": "Plant ERP",
"…": "…"
},
"rawKey": "sk_live_…"
}
409Conflict
{
"message": "Only an active, unexpired key that has not been rotated yet can be rotated.",
"code": "CONFLICT"
}
Gestionar claves por HTTP
Las claves las gestiona un administrador con sesión iniciada. Una clave de API no puede crear, cambiar ni rotar claves.
| Método | Ruta | Función |
|---|---|---|
| GET | /api/api-keys | Lista las claves (page desde 1, pageSize hasta 100, sort, filtros isActive, environment, scopeReview). |
| GET | /api/api-keys/permission-catalog | Los permisos que puedes asignar a una clave, por módulo. |
| POST | /api/api-keys | Crea una clave. El secreto rawKey aparece solo en esta respuesta. |
| PUT | /api/api-keys/{apiKeyId} | Cambia el nombre, la descripción, el estado activo, la lista de IP, los permisos y los ámbitos. |
| DELETE | /api/api-keys/{apiKeyId} | Revoca (elimina) una clave. |
| POST | /api/api-keys/{apiKeyId}/rotate | Rota una clave. |
| POST | /api/api-keys/revoke-all | Desactiva todas las claves activas. |
POST/tenant/{tenantId}/api/api-keys
Crea una clave. Campos: name (obligatorio), description, permissions (ids de permisos de módulo, por ejemplo iot_device.devices.read), scopes, environment (live o test), ipAllowlist, expiresAt (ISO 8601). Indica al menos un permiso o ámbito. Sin expiresAt, la clave caduca a los 90 días.
Cuerpo de la petición application/json
{
"name": "Plant ERP",
"permissions": [
"iot_device.devices.read",
"telemetry.read"
],
"ipAllowlist": [
"203.0.113.0/24"
]
}
Ejemplo curl
curl -X POST 'https://<your-host>/tenant/{tenantId}/api/api-keys' \
-H 'Content-Type: application/json' \
-d '{"name":"Plant ERP","permissions":["iot_device.devices.read","telemetry.read"],"ipAllowlist":["203.0.113.0/24"]}'
Respuestas
201Created
{
"key": {
"name": "Plant ERP",
"…": "…"
},
"rawKey": "sk_live_…"
}
400Bad Request
{
"message": "Select at least one module permission or integration scope."
}
403Forbidden
{
"message": "An API key can only receive permissions you hold yourself."
}
422Unprocessable Entity
{
"message": "The expiry date must be in the future."
}
Verificar una clave
POST/tenant/{tenantId}/api/api-keys/verify
Compruebe una clave enviada en la cabecera x-api-key. No se necesita sesión. Puede enviar un scope en el cuerpo para comprobarlo. Todo rechazo de la clave (desconocida, inactiva, caducada, de otra organización, ámbito que falta, dirección no permitida) devuelve el mismo 401, así que no indica qué comprobación ha fallado. Si todo es correcto, la respuesta incluye "valid": true y los campos públicos de la clave.
Cuerpo de la solicitud application/json
{
"scope": "read"
}
Ejemplo curl
curl -X POST 'https://<your-host>/tenant/{tenantId}/api/api-keys/verify' \
-H 'Content-Type: application/json' \
-d '{"scope":"read"}'
Respuestas
200OK
{
"valid": true,
"key": {
"name": "Plant ERP",
"…": "…"
}
}
400Bad Request
{
"valid": false,
"message": "scope must be a string"
}
401Unauthorized
{
"valid": false,
"message": "Invalid or expired API key."
}
429Too Many Requests
{
"valid": false,
"message": "Too many requests."
}
Ajustes
Los administradores establecen la política de claves de la organización en API Keys > ajustes (el botón del engranaje):
| Ajuste | Predeterminado | Significado |
|---|---|---|
| Max Active Keys | 0 (sin límite) | Cuántas claves activas puede tener la organización a la vez. |
| Maximum Key Lifetime (days) | 0 (365 días) | Un límite inferior sobre cuánto tiempo por adelantado puede caducar una clave. |
| Require Expiry on Every Key | Desactivado | Una clave creada a través de la API debe indicar su expiresAt. |
| Tenant Subnet Allowlist | Vacía (cualquiera) | Subredes predeterminadas para las claves que no tienen lista propia. |
| Per-Key Rate Limit (requests/minute) | 0 | Llamadas por clave y por minuto. 0 usa el valor predeterminado de la plataforma, 1.000 por minuto. |
Los demás límites que se aplican a las claves están en Errors and rate limits.
Supervisión de claves
- Cada clave registra cuándo y desde qué dirección se usó por última vez.
- Una clave sin uso durante 14 días y que después se usa desde una dirección nueva genera un evento de auditoría («A dormant API key was used from a new address»), como máximo una vez por clave y dirección por hora.
- Cada llamada rechazada con una clave se registra en el registro de auditoría.
- Los webhooks pueden informarle sobre las claves:
api_key.created,api_key.updated,api_key.rotated,api_key.deleted,api_key.expired.
Consulte API key hardening para ver una lista de comprobación.

