Sesiones de usuarios de dispositivos
Indique a Nomid quién está utilizando qué dispositivo cuando su propia aplicación inicia la sesión de sus usuarios y consulte cada sesión de usuario de dispositivo.
Cómo funciona
Utilice estos endpoints cuando una aplicación suya autentique a sus propios usuarios en un dispositivo administrado. La aplicación identifica el dispositivo por su número de serie, por ejemplo, uno transmitido en su configuración administrada. Cuando un usuario inicia sesión, su backend reporta el inicio de sesión con ese número de serie y su propio id de usuario, y conserva el loginId devuelto. Cuando el usuario cierra sesión, su backend reporta el cierre de sesión.
El primer inicio de sesión de un externalUserId crea un Usuario de dispositivo con auth EXTERNAL. Los inicios de sesión posteriores del mismo externalUserId reutilizan ese usuario, y un userName que difiera de su nombre actual lo renombra. También puede reportar el inicio de sesión de un Usuario de dispositivo existente con cualquier auth mediante su deviceUserId.
GET /device-user-logins devuelve las sesiones de usuarios de dispositivos de la empresa, las más recientes primero: aquellas que reporta su sistema y los inicios de sesión mediante PIN y SSO que el agente de Nomid reporta desde el dispositivo. loginSource y logoutSource indican quién reportó cada mitad de una sesión.
Una sesión reportada a través de la API no caduca en Nomid: permanece abierta hasta que usted reporte su cierre de sesión. Cada llamada de inicio de sesión registra una nueva sesión, incluso si el mismo usuario ya ha iniciado sesión en ese dispositivo.
La API solo cierra las sesiones que se reportaron a través de la API. El dispositivo cierra los inicios de sesión por PIN o SSO en el agente de Nomid.
Requisitos
- GET /device-user-logins requiere DEVICES_READ, al igual que las demás lecturas de dispositivos.
- Reportar inicios y cierres de sesión de usuarios de dispositivos (POST /device-user-logins y POST /device-user-logins/logout) requiere DEVICES_COMMAND, el permiso que envía comandos a los dispositivos; una clave solo lo obtiene junto con DEVICES_READ. Las sesiones de usuarios de dispositivos no tienen un permiso propio.
- Para reportar un inicio de sesión, el activo debe tener un dispositivo administrado, es decir, un dispositivo inscrito en Nomid actualmente.
- La clave validada selecciona la empresa; las solicitudes no tienen ningún parámetro de tenant o empresa. Los endpoints de inicio y cierre de sesión pueden dirigirse a todos los activos de la empresa.
Endpoints
Las rutas son relativas a la URL base de la API y requieren el encabezado X-API-Key.
https://api.nomid.tech/emm/api/v1
| Método | Endpoint | Permiso | Descripción |
|---|---|---|---|
| GET | /device-user-logins | DEVICES_READ | Enumera las sesiones de usuarios de dispositivos, las más recientes primero, con filtros opcionales |
| POST | /device-user-logins | DEVICES_COMMAND | Reporta que un usuario autenticado por su sistema inició sesión en un dispositivo; devuelve 201 con la sesión |
| POST | /device-user-logins/logout | DEVICES_COMMAND | Reporta un cierre de sesión, por loginId o por dispositivo y usuario; devuelve las sesiones afectadas |
Listar sesiones
Todos los parámetros de consulta son opcionales. Sin filtros, el endpoint devuelve las últimas sesiones de la empresa.
| Parámetro | Descripción |
|---|---|
| assetId | Solo sesiones en este activo. No junto con serialNumber. |
| serialNumber | Solo sesiones en el activo con este número de serie. No junto con assetId. |
| deviceUserId | Solo sesiones del Device User con este id de Nomid, deviceUser.id en una sesión. |
| externalUserId | Solo sesiones del Device User EXTERNAL con este id de su sistema. |
| open | true devuelve solo las sesiones que siguen abiertas: sin cierre de sesión y no expiradas. El valor predeterminado es false, que devuelve sesiones abiertas y cerradas. |
| from | Solo sesiones que se hayan iniciado en este instante ISO-8601 o después, como 2026-10-01T00:00:00Z. |
| to | Solo sesiones que se hayan iniciado antes de este instante ISO-8601. from debe ser anterior a to, y ambos deben situarse entre 1970 y 9999. |
| limit | Número máximo de sesiones a devolver. El valor predeterminado es 50; un valor superior a 200 devuelve 200. |
Las sesiones de un activo incluyen las registradas en inscripciones anteriores del mismo hardware, con el mismo número de serie, por lo que un dispositivo reinscrito conserva su historial. Un activo desconocido devuelve un 404 con el código asset_not_found; un deviceUserId o externalUserId desconocido no coincide con ninguna sesión y devuelve una lista vacía.
Notificar un inicio de sesión
Envíe un campo de dispositivo y un campo de usuario. Enviar ambos o ninguno de un par devuelve 400.
| Campo | Longitud máxima | Descripción |
|---|---|---|
| serialNumber | 255 | El número de serie del dispositivo. Este o assetId. |
| assetId | 255 | El id del activo. Este o serialNumber. |
| externalUserId | 100 | Su propio id para el usuario. Su primer inicio de sesión crea un Device User con autenticación EXTERNAL; los inicios de sesión posteriores lo reutilizan. Se eliminan los espacios circundantes y se rechazan los caracteres de control. Este o deviceUserId. |
| deviceUserId | 36 | El id de un Device User de Nomid existente. Este o externalUserId. |
| userName | 50 | Nombre para mostrar opcional, utilizado solo con externalUserId. Un nuevo usuario EXTERNAL lo toma, o su externalUserId cortado a 50 caracteres cuando está ausente. Un inicio de sesión posterior con un userName diferente cambia el nombre del usuario. |
Conserve el loginId de la respuesta: es el comprobante que cierra exactamente esta sesión. Si se pierde una respuesta de inicio de sesión y vuelve a enviarlo, se registrará una segunda sesión; un cierre de sesión por dispositivo y usuario cerrará ambas.
Notificar un cierre de sesión
Envíe loginId, o un campo de dispositivo y un campo de usuario para cerrar todas las sesiones abiertas que la API haya abierto para ese usuario en ese dispositivo, incluidas las de inscripciones anteriores del mismo hardware.
| Campo | Longitud máxima | Descripción |
|---|---|---|
| loginId | 36 | El comprobante devuelto por el inicio de sesión. Cualquier campo de dispositivo o usuario enviado con él debe ser el de la propia sesión, o de lo contrario la solicitud devuelve 409. |
| serialNumber | 255 | El número de serie del dispositivo. No junto con assetId. |
| assetId | 255 | El id del activo. No junto con serialNumber. |
| externalUserId | 100 | Su propio id para el usuario. No junto con deviceUserId. |
| deviceUserId | 36 | El id de Nomid del Device User. No junto con externalUserId. |
La respuesta es 200 con la lista de sesiones afectadas. Cerrar una sesión que ya está cerrada no cambia nada y la devuelve tal como está, por lo que el cierre de sesión se puede reintentar de forma segura. Un cierre de sesión por dispositivo y usuario devuelve una lista vacía cuando el usuario no tiene ninguna sesión de API abierta allí.
Campos de sesión
Cada endpoint devuelve sesiones con estos campos. Si un campo no tiene valor, se omite; open siempre está presente. Las horas son instantes ISO-8601 en UTC.
| Campo | Descripción |
|---|---|
| loginId | El id de la sesión, el comprobante que la cierra. |
| deviceUser | Quién inició sesión: id (el id de Nomid), name, auth (PIN, SSO o EXTERNAL) y, para un usuario EXTERNAL, externalUserId. |
| asset | Dónde: assetId, serialNumber y name. Se omite únicamente cuando el dispositivo ya no pertenece a ningún activo. |
| loginAt | Cuándo inició sesión el usuario. Se omite únicamente en el caso de un cierre de sesión que el dispositivo notificó sin un inicio de sesión. |
| logoutAt | Cuándo finalizó la sesión. Se omite mientras esté abierta. |
| expiresAt | Cuándo expira la sesión por sí sola, si la política establece una caducidad. Las sesiones notificadas a través de la API no tienen ninguna. |
| open | true mientras nadie haya cerrado la sesión y esta no haya expirado. |
| loginSource | Quién notificó el inicio de sesión: DEVICE (el agente de Nomid en el dispositivo, un inicio de sesión mediante PIN o SSO) o API (su sistema, a través de esta API). |
| logoutSource | Quién notificó el cierre de sesión: DEVICE, API o EXPIRY cuando la sesión expiró. Se omite mientras la sesión esté abierta. |
Ejemplos
Notificar un inicio de sesión por número de serie para un usuario de su propio sistema.
curl -X POST "https://api.nomid.tech/emm/api/v1/device-user-logins" \
-H "X-API-Key: $NOMID_API_KEY" \
-H "Content-Type: application/json" \
-d '{"serialNumber": "R58N123ABCD", "externalUserId": "emp-1042", "userName": "Ana Souza"}' HTTP/1.1 201 Created
{
"loginId": "5f0c2a8e-3b1d-4e7a-9c64-2d8f1b7e0a93",
"deviceUser": {
"id": "b2e47c19-8a3f-4d65-a0e1-6c9d2f5b8e74",
"name": "Ana Souza",
"auth": "EXTERNAL",
"externalUserId": "emp-1042"
},
"asset": {
"assetId": "k3x9m2pa",
"serialNumber": "R58N123ABCD",
"name": "Warehouse scanner 12"
},
"loginAt": "2026-10-29T11:02:41.518204Z",
"open": true,
"loginSource": "API"
} Cerrar esa sesión con su loginId.
curl -X POST "https://api.nomid.tech/emm/api/v1/device-user-logins/logout" \
-H "X-API-Key: $NOMID_API_KEY" \
-H "Content-Type: application/json" \
-d '{"loginId": "5f0c2a8e-3b1d-4e7a-9c64-2d8f1b7e0a93"}' HTTP/1.1 200 OK
[
{
"loginId": "5f0c2a8e-3b1d-4e7a-9c64-2d8f1b7e0a93",
"deviceUser": {
"id": "b2e47c19-8a3f-4d65-a0e1-6c9d2f5b8e74",
"name": "Ana Souza",
"auth": "EXTERNAL",
"externalUserId": "emp-1042"
},
"asset": {
"assetId": "k3x9m2pa",
"serialNumber": "R58N123ABCD",
"name": "Warehouse scanner 12"
},
"loginAt": "2026-10-29T11:02:41.518204Z",
"logoutAt": "2026-10-29T19:30:05.204117Z",
"open": false,
"loginSource": "API",
"logoutSource": "API"
}
] O cerrar todas las sesiones de API abiertas del usuario en ese dispositivo.
curl -X POST "https://api.nomid.tech/emm/api/v1/device-user-logins/logout" \
-H "X-API-Key: $NOMID_API_KEY" \
-H "Content-Type: application/json" \
-d '{"serialNumber": "R58N123ABCD", "externalUserId": "emp-1042"}' Consultar las sesiones de un dispositivo desde el 1 de octubre. Esta es un inicio de sesión mediante PIN en el dispositivo que expiró.
curl "https://api.nomid.tech/emm/api/v1/device-user-logins?serialNumber=R58N123ABCD&from=2026-10-01T00:00:00Z&limit=20" \
-H "X-API-Key: $NOMID_API_KEY" HTTP/1.1 200 OK
[
{
"loginId": "e91d4b7a-0c2f-4a58-8b13-7f6e5d4c3b2a",
"deviceUser": {
"id": "4c8a1e2f-6b3d-4f70-9e15-0a2b3c4d5e6f",
"name": "Shift 2 operator",
"auth": "PIN"
},
"asset": {
"assetId": "k3x9m2pa",
"serialNumber": "R58N123ABCD",
"name": "Warehouse scanner 12"
},
"loginAt": "2026-10-28T14:00:09.731552Z",
"logoutAt": "2026-10-28T22:00:09.731552Z",
"expiresAt": "2026-10-28T22:00:09.731552Z",
"open": false,
"loginSource": "DEVICE",
"logoutSource": "EXPIRY"
}
] Error: una sesión notificada por el dispositivo
HTTP/1.1 409 Conflict
Content-Type: application/problem+json
{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"detail": "The login was reported by the device, not through the API",
"instance": "/emm/api/v1/device-user-logins/logout",
"code": "login_not_reported_by_api"
} Errores
Los endpoints de sesión de Device User responden 400, 404 y 409 con application/problem+json y un miembro code para bifurcar; no envían ningún miembro retryable. Dos excepciones no tienen code: 401 y 403, y un 400 por un parámetro de consulta no válido de GET /device-user-logins.
| Estado | Código | Significado |
|---|---|---|
| 400 | invalid_argument | Inicio o cierre de sesión: falta el cuerpo o no es un JSON válido con la estructura documentada, se enviaron ambos o ninguno de los pares de dispositivo o usuario, a un cierre de sesión sin loginId le falta el dispositivo o el usuario, o externalUserId (más de 100 caracteres) o userName (más de 50 caracteres) es demasiado largo o tiene caracteres de control. El detalle indica cuál. |
| 400 | - | Solo al listar: assetId y serialNumber juntos, from no es anterior a to, from o to no es un instante ISO-8601 o está fuera del rango de 1970 a 9999, un límite inferior a 1, u open no es true o false. |
| 401 | - | La clave de API falta, no es válida, ha caducado o se ha revocado. |
| 403 | - | La clave carece de DEVICES_READ (listar) o DEVICES_COMMAND (iniciar y cerrar sesión). |
| 404 | asset_not_found | No hay ningún activo con este assetId o serialNumber en la empresa de la clave. |
| 404 | device_user_not_found | No hay ningún Device User con este deviceUserId en la empresa de la clave o, al cerrar sesión, ninguno con este externalUserId porque nunca inició sesión a través de la API. |
| 404 | login_not_found | No hay ninguna sesión con este loginId en la empresa de la clave. |
| 409 | no_managed_device | El activo no tiene ningún dispositivo administrado, por lo que no se puede registrar ningún inicio de sesión en él. |
| 409 | device_user_disabled | El Device User está deshabilitado. |
| 409 | device_user_not_external | El Device User con este externalUserId ya no tiene autenticación EXTERNAL. |
| 409 | login_device_mismatch | La sesión con este loginId no se produjo en el dispositivo enviado con ella. |
| 409 | login_user_mismatch | La sesión con este loginId no pertenece al usuario enviado. |
| 409 | login_not_reported_by_api | La sesión fue notificada por el dispositivo, un inicio de sesión mediante PIN o SSO en el agente de Nomid. El dispositivo la cierra, no la API. |
Límites de frecuencia
Estos puntos de conexión no forman parte del límite de escritura de 10 solicitudes por minuto por clave que comparten los comandos de dispositivo, los cambios de política y los códigos QR de aprovisionamiento. De todos modos, diseñe su cliente para que aplique un tiempo de espera ante un 429.
Herramienta MCP
La herramienta MCP de solo lectura list_device_user_logins admite los mismos filtros como argumentos y necesita DEVICES_READ. Con Sign in with Nomid, un usuario que solo ve algunas políticas únicamente obtiene las sesiones en activos de esas políticas. La notificación de inicios y cierres de sesión solo se realiza mediante REST: ninguna herramienta MCP lo hace.
| list_device_user_logins | DEVICES_READ | Sesiones de Device User, las más recientes primero, con los filtros de GET /device-user-logins: quién inició sesión en qué activo, cuándo y quién notificó el inicio y el cierre de sesión. Sigue el alcance de la política del emisor. Error de herramienta si no se encuentra el activo. |
|---|