Cambios de directivas
Cambie la configuración de una directiva de Android, cree una directiva como copia de otra o revierta una directiva a una revisión anterior. Cada cambio se revisa antes de aplicarse.
Cómo funciona
Cada cambio requiere dos pasos. Primero lo propone: la API registra una propuesta y devuelve su lista de cambios, con el valor actual y nuevo de cada configuración, el impacto y cuándo expira la propuesta. Todavía no cambia nada en la directiva. Luego aplica la propuesta mediante su proposalId, después de que la persona responsable haya revisado la lista de cambios.
Solo la clave de API que realizó una propuesta puede leerla o aplicarla. Para una conexión OAuth, solo pueden la misma conexión y usuario. Una propuesta expira 10 minutos después de realizarse; el campo expiresAt indica la hora exacta.
Solo las directivas de Android se pueden cambiar de esta manera. Las directivas administradas por Nomid no pueden. La creación de una directiva también requiere que la empresa esté conectada a Android Enterprise.
Requisitos
- Una clave de API con el permiso POLICIES_WRITE (Cambios de directiva), combinado con POLICIES_READ. Solo un usuario del portal con permiso para editar directivas puede crear una clave con POLICIES_WRITE. Requerido por los cuatro endpoints POST y las herramientas de cambio de directiva de MCP.
- La configuración de la empresa Cambios de directiva, bajo Acceso de agentes de IA en el portal, debe estar activada. Está desactivada de forma predeterminada. Mientras esté desactivada, cada llamada de propuesta y aplicación devuelve 403. La lectura de configuraciones, revisiones y propuestas solo requiere POLICIES_READ.
- Los clientes MCP que se conectan con Iniciar sesión con Nomid en lugar de una clave de API necesitan el alcance mcp:policies:write.
Endpoints
Todas las rutas son relativas a la URL base de la API y necesitan el encabezado X-API-Key. Los cuerpos de las solicitudes son JSON.
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /policies/{policyId}/settings | Las configuraciones editables de la directiva, cada una con su valor actual, valores permitidos, grupo y si su modificación es de alto impacto. También devuelve la versión de la directiva, deviceCount y si la directiva es editable. |
| GET | /policies/{policyId}/revisions | Las revisiones guardadas de la directiva, de la más reciente a la más antigua, con cuándo y por quién se guardó cada una. limit es opcional, de 1 a 100, por defecto 20. |
| GET | /policy-proposals/{proposalId} | Una propuesta realizada por esta clave, con su lista de cambios y estado: PENDING, EXECUTING, SUCCEEDED, FAILED, UNCONFIRMED o EXPIRED. |
| POST | /policies/{policyId}/changes | Proponer cambios de configuración a una directiva existente. Devuelve 201 con la propuesta. |
| POST | /policies | Proponer una nueva directiva como copia de una existente, con cambios de configuración opcionales. Sin cambios, duplica la directiva. Devuelve 201 con la propuesta. |
| POST | /policies/{policyId}/rollbacks | Proponer restaurar la directiva a una revisión anterior. Devuelve 201 con la propuesta. |
| POST | /policy-proposals/{proposalId}/apply | Aplicar una propuesta pendiente. Devuelve 200 con la propuesta y su resultado: policyId, displayName, version y un enlace al portal. |
Cuerpos de solicitud
Cambiar configuraciones
| Campo | Obligatorio | Descripción |
|---|---|---|
| changes | Sí | Matriz de objetos con setting (un ID de configuración) y value (uno de sus valores permitidos). Cada configuración como máximo una vez. Los valores no distinguen entre mayúsculas y minúsculas. |
Crear una directiva
| Campo | Obligatorio | Descripción |
|---|---|---|
| fromPolicyId | Sí | La directiva que se copiará, por su ID de directiva (pathName). La copia toma sus aplicaciones, configuraciones y restricciones. |
| displayName | Sí | Nombre de la nueva directiva tal como se muestra en el portal, como máximo 50 caracteres. |
| changes | No | Cambios de configuración para aplicar a la copia, en el mismo formato que arriba. Omítalo para duplicar la directiva. Ningún dispositivo utiliza la nueva directiva hasta que mueva dispositivos a ella. |
Revertir una directiva
| Campo | Obligatorio | Descripción |
|---|---|---|
| revision | Sí | El número de revisión a restaurar, desde el endpoint de revisiones. La descripción, las etiquetas y el grupo de la directiva permanecen como están. Su nombre vuelve al nombre de la revisión cuando difieren, y la lista de cambios lo muestra. |
Aplicar una propuesta
| Campo | Obligatorio | Descripción |
|---|---|---|
| confirmation | Para impacto ALTO | Requerido cuando la propuesta tiene requiresConfirmation establecido en true: el nombre de la directiva, escrito por la persona que aprueba el cambio. La coincidencia ignora mayúsculas y minúsculas y espacios circundantes. |
La propuesta
Cada endpoint de propuesta y los endpoints get y apply devuelven la propuesta. Los campos más útiles:
| Campo | Descripción |
|---|---|
| proposalId | El ID para leer o aplicar la propuesta. |
| status | PENDING hasta que se aplique, y EXECUTING mientras se esté ejecutando una aplicación: ninguno es definitivo. Luego SUCCEEDED o FAILED, UNCONFIRMED cuando un error inesperado dejó el resultado como desconocido, o EXPIRED una vez que expiresAt haya pasado. |
| impact | NORMAL o HIGH. Consulte Impacto y confirmación. |
| requiresConfirmation | True para una propuesta de impacto HIGH: apply necesita el campo confirmation. |
| fields | La lista de cambios. Cada entrada tiene label (el nombre del ajuste), value (el nuevo valor) y previousValue (el valor actual). |
| summary | Una frase que describe el cambio, incluida la cantidad de dispositivos que usan la directiva. |
| target | La directiva que modifica la propuesta: kind, id y name. |
| expiresAt | Cuándo caduca la propuesta. Después de eso, ya no se puede aplicar. |
| result | Solo respuestas de aplicación: la directiva tal como está ahora, con policyId, displayName, version, un mensaje y portalUrl. |
Impacto y confirmación
Una propuesta es de impacto HIGH cuando la directiva tiene al menos un dispositivo y se cumple cualquiera de las siguientes condiciones:
- Es una reversión.
- Modifica un ajuste de alto impacto: aplicaciones de orígenes desconocidos, Google Play Protect, restablecimiento de fábrica, opciones de desarrollador, transferencia de datos por USB o cifrado del almacenamiento.
- La directiva tiene 50 o más dispositivos, sin importar el cambio.
Todo lo demás es NORMAL, incluida cada directiva nueva, ya que ningún dispositivo la usa todavía.
Las propuestas están vinculadas a una versión de la directiva
Una propuesta registra la versión de la directiva sobre la que se creó su lista de cambios. Si la directiva se vuelve a guardar antes de aplicar la propuesta, por cualquier persona y desde cualquier lugar, apply falla con 409 y el código stale_proposal, y nada cambia. Lea la directiva de nuevo, proponga de nuevo y revise la nueva lista de cambios.
Ejemplo: proponer y aplicar
Lea primero los ajustes actuales de la directiva para obtener los ID de los ajustes y los valores permitidos:
curl "https://api.nomid.tech/emm/api/v1/policies/p7k2m9qa4xz/settings" \
-H "X-API-Key: $NOMID_API_KEY" {
"policyId": "p7k2m9qa4xz",
"displayName": "Warehouse scanners",
"version": 12,
"deviceCount": 18,
"editable": true,
"settings": [
{
"id": "CAMERA",
"label": "Camera",
"group": "RESTRICTIONS",
"value": "ALLOW",
"allowedValues": ["ALLOW", "BLOCK"],
"highImpact": false
}
]
} Proponer bloquear la cámara y la transferencia de datos por USB:
curl -X POST "https://api.nomid.tech/emm/api/v1/policies/p7k2m9qa4xz/changes" \
-H "X-API-Key: $NOMID_API_KEY" \
-H "Content-Type: application/json" \
-d '{"changes": [{"setting": "CAMERA", "value": "BLOCK"}, {"setting": "USB_DATA_ACCESS", "value": "BLOCK"}]}' HTTP/1.1 201 Created
{
"capability": "update_policy_settings",
"status": "PENDING",
"title": "Edit policy settings",
"summary": "Change 2 settings of policy \"Warehouse scanners\". 18 devices apply it on their next sync. High impact: type the policy's name to confirm.",
"target": { "kind": "policy", "id": "p7k2m9qa4xz", "name": "Warehouse scanners" },
"fields": [
{ "label": "Camera", "value": "BLOCK", "previousValue": "ALLOW" },
{ "label": "USB data transfer", "value": "BLOCK", "previousValue": "ALLOW" }
],
"expiresAt": "2026-10-09T14:40:00Z",
"impact": "HIGH",
"proposalId": "prp_7GQv2LkR9sTn4WxY8bZcA1dE",
"requiresConfirmation": true
} Respuesta resumida. La transferencia de datos por USB es un ajuste de alto impacto y la directiva tiene dispositivos, por lo que la propuesta es de impacto HIGH y requiere confirmación. Muestre la lista de cambios a la persona responsable antes de aplicarla.
Una vez que aprueben y escriban el nombre de la directiva, aplique la propuesta con lo que hayan escrito:
curl -X POST "https://api.nomid.tech/emm/api/v1/policy-proposals/prp_7GQv2LkR9sTn4WxY8bZcA1dE/apply" \
-H "X-API-Key: $NOMID_API_KEY" \
-H "Content-Type: application/json" \
-d '{"confirmation": "Warehouse scanners"}' HTTP/1.1 200 OK
{
"capability": "update_policy_settings",
"status": "SUCCEEDED",
"impact": "HIGH",
"proposalId": "prp_7GQv2LkR9sTn4WxY8bZcA1dE",
"requiresConfirmation": true,
"result": {
"policyId": "p7k2m9qa4xz",
"displayName": "Warehouse scanners",
"version": 13,
"message": "Policy settings changed. Devices on the policy apply them on their next sync."
}
} Respuesta resumida. Los dispositivos de la directiva aplican los nuevos ajustes en su próxima sincronización.
Cuando la directiva cambió mientras tanto
HTTP/1.1 409 Conflict
Content-Type: application/problem+json
{
"type": "about:blank",
"title": "Conflict",
"status": 409,
"detail": "Policy \"Warehouse scanners\" was changed after this proposal was made. Nothing was applied: read it again and propose again.",
"instance": "/emm/api/v1/policy-proposals/prp_7GQv2LkR9sTn4WxY8bZcA1dE/apply",
"code": "stale_proposal",
"retryable": false
} Ajustes editables
Estos son los ID de configuración aceptados en los cambios, con sus valores permitidos. La etiqueta es el nombre que devuelve la API en la lista de cambios.
Al leer las configuraciones, un valor también puede ser NOT_SET (dejado al dispositivo o al valor predeterminado de Google) o CUSTOM (un valor establecido en el portal que estos valores no pueden expresar). Ninguno de los dos se puede enviar, pero ambos se pueden reemplazar por un valor permitido.
| Configuración | Etiqueta | Grupo | Valores permitidos | Alto impacto |
|---|---|---|---|---|
| PLAY_STORE_MODE | Play Store mode | APPS | BLACKLIST, WHITELIST | No |
| DEFAULT_PERMISSION_POLICY | Default runtime permission policy | APPS | DENY, PROMPT | No |
| APP_AUTO_UPDATE_POLICY | App auto-update policy | APPS | ALWAYS, CHOICE_TO_THE_USER, NEVER, WIFI | No |
| UNTRUSTED_APPS_POLICY | Apps from unknown sources | SECURITY | ALLOW_INSTALL_IN_PERSONAL_PROFILE_ONLY, DISALLOW_INSTALL | Sí |
| PLAY_PROTECT | Google Play Protect app verification | SECURITY | ENABLED, USER_CHOICE | Sí |
| SCREEN_CAPTURE | Screen capture | RESTRICTIONS | ALLOW, BLOCK | No |
| CAMERA | Camera | RESTRICTIONS | ALLOW, BLOCK | No |
| FACTORY_RESET | Factory reset from Settings | RESTRICTIONS | ALLOW, BLOCK | Sí |
| UNINSTALL_APPS | Uninstalling apps | RESTRICTIONS | ALLOW, BLOCK | No |
| ACCOUNT_MODIFICATION | Adding or removing accounts | RESTRICTIONS | ALLOW, BLOCK | No |
| ADD_USER | Adding users | RESTRICTIONS | ALLOW, BLOCK | No |
| REMOVE_USER | Removing users | RESTRICTIONS | ALLOW, BLOCK | No |
| DEVELOPER_SETTINGS | Developer options and USB debugging | SECURITY | ALLOW, BLOCK | Sí |
| USB_DATA_ACCESS | USB data transfer | CONNECTIVITY | ALLOW, BLOCK | Sí |
| LOCATION_MODE | Location | LOCATION | DISABLED, ENFORCED, USER_CHOICE | No |
| LOCATION_SHARING | Sharing location | LOCATION | ALLOW, BLOCK | No |
| OUTGOING_CALLS | Outgoing calls | RESTRICTIONS | ALLOW, BLOCK | No |
| SMS | SMS | RESTRICTIONS | ALLOW, BLOCK | No |
| BLUETOOTH | Bluetooth | CONNECTIVITY | ALLOW, BLOCK | No |
| DATA_ROAMING | Data roaming | CONNECTIVITY | ALLOW, BLOCK | No |
| NETWORK_RESET | Network settings reset | CONNECTIVITY | ALLOW, BLOCK | No |
| VPN_CONFIGURATION | Configuring VPNs | CONNECTIVITY | ALLOW, BLOCK | No |
| CONFIGURE_WIFI | Configuring Wi-Fi networks | CONNECTIVITY | ALLOW, BLOCK | No |
| WIFI_DIRECT | Wi-Fi Direct | CONNECTIVITY | ALLOW, BLOCK | No |
| TETHERING | Tethering and hotspot | CONNECTIVITY | ALLOW, BLOCK | No |
| WIFI_STATE | Wi-Fi on or off | CONNECTIVITY | DISABLED, ENABLED, USER_CHOICE | No |
| AIRPLANE_MODE | Airplane mode | CONNECTIVITY | DISABLED, USER_CHOICE | No |
| MINIMUM_WIFI_SECURITY | Minimum Wi-Fi security | CONNECTIVITY | OPEN_NETWORK, PERSONAL_NETWORK | No |
| AUTO_DATE_TIME | Automatic date, time and time zone | RESTRICTIONS | ENFORCED, USER_CHOICE | No |
| ENCRYPTION_POLICY | Storage encryption | SECURITY | ENABLED_WITHOUT_PASSWORD, ENABLED_WITH_PASSWORD, UNSPECIFIED | Sí |
| APPLICATION_REPORT_LEVEL | Installed apps reporting | REPORTING | DISABLED, INSTALLED_AND_REMOVED_APPS, INSTALLED_APPS | No |
| REPORT_DEVICE_SETTINGS | Device settings reporting | REPORTING | DISABLED, ENABLED | No |
| REPORT_DISPLAY_INFO | Display information reporting | REPORTING | DISABLED, ENABLED | No |
| REPORT_HARDWARE_STATUS | Hardware status reporting | REPORTING | DISABLED, ENABLED | No |
| REPORT_MEMORY_INFO | Memory information reporting | REPORTING | DISABLED, ENABLED | No |
| REPORT_NETWORK_INFO | Network information reporting | REPORTING | DISABLED, ENABLED | No |
| REPORT_POWER_EVENTS | Power events reporting | REPORTING | DISABLED, ENABLED | No |
| REPORT_SOFTWARE_INFO | Software information reporting | REPORTING | DISABLED, ENABLED | No |
| REPORT_SYSTEM_PROPERTIES | System properties reporting | REPORTING | DISABLED, ENABLED | No |
Herramientas MCP
El servidor MCP expone las mismas operaciones como herramientas. Aceptan los mismos argumentos que los endpoints REST, con policyId y proposalId como argumentos en lugar de segmentos de ruta.
| Herramienta | Permiso | Descripción |
|---|---|---|
| get_policy_settings | POLICIES_READ | Lee las configuraciones editables de una política con sus valores actuales y permitidos. |
| list_policy_revisions | POLICIES_READ | Enumera las revisiones guardadas de una política, las más recientes primero. |
| get_policy_proposal | POLICIES_READ | Lee una propuesta realizada por la misma clave o conexión, con su estado. |
| update_policy_settings | POLICIES_WRITE + POLICIES_READ | Propone cambios de configuración a una política existente. |
| create_policy | POLICIES_WRITE + POLICIES_READ | Propone una nueva política como copia de una existente, con cambios de configuración opcionales. |
| rollback_policy | POLICIES_WRITE + POLICIES_READ | Propone restaurar una política a una revisión anterior. |
| apply_policy_proposal | POLICIES_WRITE + POLICIES_READ | Aplica una propuesta pendiente mediante su proposalId, con confirmación cuando sea de impacto HIGH. |
Un asistente debe mostrar al usuario la lista de cambios y obtener su aprobación explícita en la conversación antes de llamar a apply_policy_proposal. Para una propuesta de impacto HIGH, debe pedirle al usuario que escriba el nombre de la política y pasar exactamente lo que escribió.
Errores
Una vez autenticada la clave de API, los errores utilizan application/problem+json con dos campos adicionales: code, un identificador estable para ramificar, y retryable, que indica si la misma solicitud se puede enviar de nuevo. Una clave faltante o no válida recibe la respuesta 401 compartida, un objeto JSON pequeño con error, message y status. Las herramientas MCP devuelven el mismo code y message como un error de herramienta.
| Estado | Código | Significado |
|---|---|---|
| 400 | invalid_arguments | El cuerpo no es válido: una configuración desconocida, un valor no permitido, una configuración indicada dos veces o un campo faltante. El detalle indica cuál. |
| 403 | forbidden | La clave carece de POLICIES_WRITE o POLICIES_READ, o la configuración de la empresa Policy changes está desactivada. |
| 404 | not_found | No existe tal política o revisión visible para esta clave, o no hay ninguna propuesta con este ID realizada por esta clave. |
| 409 | unsupported | La política no se puede cambiar de esta manera: no es una política de Android o está administrada por Nomid. |
| 409 | not_pending | La propuesta ya no está PENDING. Léala para ver su estado: si es SUCCEEDED, el cambio se ha realizado. Si es EXECUTING, léala de nuevo hasta que finalice. Si es UNCONFIRMED, lea la configuración de la política antes de volver a proponer. Si es FAILED o EXPIRED, vuelva a proponer. |
| 409 | stale_proposal | La política se guardó después de que se hiciera la propuesta. No se aplicó nada. Lea la política de nuevo y vuelva a proponer. |
| 422 | refused | No se puede llevar a cabo la solicitud: no cambiaría nada, la empresa no está conectada a Android Enterprise o no se puede utilizar el nuevo nombre de la política. |
| 422 | confirmation_required | La propuesta es de impacto HIGH y falta la confirmación o no coincide con el nombre de la política. No se aplicó nada y la propuesta permanece pendiente hasta que expire. |
| 429 | rate_limited | Demasiadas solicitudes de escritura para esta clave de API o conexión. El encabezado Retry-After y el detalle indican los segundos a esperar. retryable es true. |
| 500 | internal_error | Error inesperado. Lea la propuesta antes de reintentar: si su estado es FAILED, vuelva a proponer. Si es UNCONFIRMED, lea la configuración de la política para ver si se realizó el cambio antes de volver a proponerlo. |
Límites de frecuencia
Cada llamada a propose y apply cuenta para el límite de escritura de 10 solicitudes por minuto para cada clave de API o conexión de Sign in with Nomid, compartido con los endpoints de comandos del dispositivo, los códigos QR de aprovisionamiento y las herramientas de escritura de MCP. Las llamadas de lectura no cuentan para este límite.
Revisiones y reversión
Cada cambio aplicado guarda una nueva revisión de la política. Consulte la lista de revisiones para ver quién modificó la política y cuándo, y proponga una reversión para deshacer un cambio.