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étodoEndpointDescripción
GET/policies/{policyId}/settingsLas 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}/revisionsLas 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}/changesProponer cambios de configuración a una directiva existente. Devuelve 201 con la propuesta.
POST/policiesProponer 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}/rollbacksProponer restaurar la directiva a una revisión anterior. Devuelve 201 con la propuesta.
POST/policy-proposals/{proposalId}/applyAplicar una propuesta pendiente. Devuelve 200 con la propuesta y su resultado: policyId, displayName, version y un enlace al portal.

Cuerpos de solicitud

Cambiar configuraciones

CampoObligatorioDescripción
changesSí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

CampoObligatorioDescripción
fromPolicyIdSíLa directiva que se copiará, por su ID de directiva (pathName). La copia toma sus aplicaciones, configuraciones y restricciones.
displayNameSíNombre de la nueva directiva tal como se muestra en el portal, como máximo 50 caracteres.
changesNoCambios 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

CampoObligatorioDescripción
revisionSí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

CampoObligatorioDescripción
confirmationPara impacto ALTORequerido 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:

CampoDescripción
proposalIdEl ID para leer o aplicar la propuesta.
statusPENDING 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.
impactNORMAL o HIGH. Consulte Impacto y confirmación.
requiresConfirmationTrue para una propuesta de impacto HIGH: apply necesita el campo confirmation.
fieldsLa lista de cambios. Cada entrada tiene label (el nombre del ajuste), value (el nuevo valor) y previousValue (el valor actual).
summaryUna frase que describe el cambio, incluida la cantidad de dispositivos que usan la directiva.
targetLa directiva que modifica la propuesta: kind, id y name.
expiresAtCuándo caduca la propuesta. Después de eso, ya no se puede aplicar.
resultSolo 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ónEtiquetaGrupoValores permitidosAlto 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.

HerramientaPermisoDescripción
get_policy_settingsPOLICIES_READLee las configuraciones editables de una política con sus valores actuales y permitidos.
list_policy_revisionsPOLICIES_READEnumera las revisiones guardadas de una política, las más recientes primero.
get_policy_proposalPOLICIES_READLee una propuesta realizada por la misma clave o conexión, con su estado.
update_policy_settingsPOLICIES_WRITE + POLICIES_READPropone cambios de configuración a una política existente.
create_policyPOLICIES_WRITE + POLICIES_READPropone una nueva política como copia de una existente, con cambios de configuración opcionales.
rollback_policyPOLICIES_WRITE + POLICIES_READPropone restaurar una política a una revisión anterior.
apply_policy_proposalPOLICIES_WRITE + POLICIES_READAplica 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.

EstadoCódigoSignificado
400invalid_argumentsEl 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.
403forbiddenLa clave carece de POLICIES_WRITE o POLICIES_READ, o la configuración de la empresa Policy changes está desactivada.
404not_foundNo existe tal política o revisión visible para esta clave, o no hay ninguna propuesta con este ID realizada por esta clave.
409unsupportedLa política no se puede cambiar de esta manera: no es una política de Android o está administrada por Nomid.
409not_pendingLa 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.
409stale_proposalLa 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.
422refusedNo 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.
422confirmation_requiredLa 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.
429rate_limitedDemasiadas 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.
500internal_errorError 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.

Elija su horario

Cargando...
Abrir el calendario de reservas