Alterações de política
Altere as configurações de uma política Android, crie uma política como cópia de outra ou reverta uma política para uma revisão anterior. Cada alteração é revisada antes de ser aplicada.
Como funciona
Cada alteração requer duas etapas. Primeiro, você a propõe: a API registra uma proposta e retorna sua lista de alterações, com o valor atual e o novo de cada configuração, o impacto e quando a proposta expira. Nada muda na política ainda. Em seguida, você aplica a proposta por meio do proposalId dela, depois que a pessoa responsável tiver revisado a lista de alterações.
Apenas a chave de API que fez uma proposta pode lê-la ou aplicá-la. Para uma conexão OAuth, apenas a mesma conexão e usuário podem. Uma proposta expira 10 minutos após ser feita; o campo expiresAt informa o horário exato.
Apenas políticas Android podem ser alteradas dessa forma. Políticas gerenciadas pelo Nomid não podem. Criar uma política também exige que a empresa esteja conectada ao Android Enterprise.
Requisitos
- Uma chave de API com a permissão POLICIES_WRITE (Alterações de política), combinada com POLICIES_READ. Apenas um usuário do portal com permissão para editar políticas pode criar uma chave com POLICIES_WRITE. Obrigatório para os quatro endpoints POST e as ferramentas de alteração de política do MCP.
- A configuração da empresa Alterações de política, em Acesso de agente de IA no portal, precisa estar ativada. Ela vem desativada por padrão. Enquanto estiver desativada, toda chamada de proposta e aplicação retornará 403. A leitura de configurações, revisões e propostas requer apenas POLICIES_READ.
- Clientes MCP que se conectam com Sign in with Nomid em vez de uma chave de API precisam do escopo mcp:policies:write.
Endpoints
Todos os caminhos são relativos ao URL base da API e exigem o cabeçalho X-API-Key. Os corpos das requisições são em JSON.
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /policies/{policyId}/settings | As configurações editáveis da política, cada uma com seu valor atual, valores permitidos, grupo e se a alteração tem alto impacto. Também retorna a versão da política, deviceCount e se a política é editável. |
| GET | /policies/{policyId}/revisions | As revisões salvas da política, da mais recente para a mais antiga, com quando e por quem cada uma foi salva. limit é opcional, de 1 a 100, padrão 20. |
| GET | /policy-proposals/{proposalId} | Uma proposta feita por esta chave, com sua lista de alterações e status: PENDING, EXECUTING, SUCCEEDED, FAILED, UNCONFIRMED ou EXPIRED. |
| POST | /policies/{policyId}/changes | Propõe alterações de configurações em uma política existente. Retorna 201 com a proposta. |
| POST | /policies | Propõe uma nova política como cópia de uma existente, com alterações opcionais de configurações. Sem alterações, ela duplica a política. Retorna 201 com a proposta. |
| POST | /policies/{policyId}/rollbacks | Propõe restaurar a política para uma revisão anterior. Retorna 201 com a proposta. |
| POST | /policy-proposals/{proposalId}/apply | Aplica uma proposta pendente. Retorna 200 com a proposta e seu resultado: policyId, displayName, version e um link do portal. |
Corpos de requisição
Alterar configurações
| Campo | Obrigatório | Descrição |
|---|---|---|
| changes | Sim | Array de objetos com setting (um ID de configuração) e value (um dos seus valores permitidos). Cada configuração no máximo uma vez. Os valores não diferenciam maiúsculas de minúsculas. |
Criar uma política
| Campo | Obrigatório | Descrição |
|---|---|---|
| fromPolicyId | Sim | A política a ser copiada, pelo seu ID de política (pathName). A cópia herda seus aplicativos, configurações e restrições. |
| displayName | Sim | Nome da nova política conforme exibido no portal, no máximo 50 caracteres. |
| changes | Não | Alterações de configuração a serem aplicadas à cópia, no mesmo formato acima. Omita para duplicar a política. Nenhum dispositivo usa a nova política até que você mova dispositivos para ela. |
Reverter uma política
| Campo | Obrigatório | Descrição |
|---|---|---|
| revision | Sim | O número da revisão a ser restaurada, a partir do endpoint de revisões. A descrição, tags e grupo da política permanecem como estão. Seu nome volta ao nome da revisão quando forem diferentes, e a lista de alterações mostra isso. |
Aplicar uma proposta
| Campo | Obrigatório | Descrição |
|---|---|---|
| confirmation | Para ALTO impacto | Obrigatório quando a proposta tem requiresConfirmation definido como true: o nome da política, digitado pela pessoa que aprova a alteração. A correspondência ignora maiúsculas/minúsculas e espaços adjacentes. |
A proposta
Todos os endpoints propose e os endpoints get e apply retornam a proposta. Os campos mais úteis:
| Campo | Descrição |
|---|---|
| proposalId | O ID para ler ou aplicar a proposta. |
| status | PENDING até ser aplicada e EXECUTING enquanto uma aplicação estiver em andamento: nenhum dos dois é definitivo. Em seguida, SUCCEEDED ou FAILED, UNCONFIRMED quando um erro inesperado deixar o resultado desconhecido ou EXPIRED quando expiresAt tiver passado. |
| impact | NORMAL ou HIGH. Consulte Impacto e confirmação. |
| requiresConfirmation | True para uma proposta de impacto HIGH: a aplicação precisa do campo confirmation. |
| fields | A lista de alterações. Cada entrada possui label (o nome da configuração), value (o novo valor) e previousValue (o valor atual). |
| summary | Uma frase descrevendo a alteração, incluindo quantos dispositivos usam a política. |
| target | A política que a proposta altera: kind, id e name. |
| expiresAt | Quando a proposta expira. Depois disso, ela não poderá mais ser aplicada. |
| result | Apenas respostas de aplicação: a política como está agora, com policyId, displayName, version, uma message e portalUrl. |
Impacto e confirmação
Uma proposta é de impacto HIGH quando a política tem pelo menos um dispositivo e qualquer um destes for verdadeiro:
- É uma reversão.
- Altera uma configuração de alto impacto: aplicativos de fontes desconhecidas, Google Play Protect, restauração de fábrica, opções do desenvolvedor, transferência de dados USB ou criptografia de armazenamento.
- A política tem 50 ou mais dispositivos, independentemente da alteração.
Todo o resto é NORMAL, incluindo qualquer nova política, já que nenhum dispositivo a utiliza ainda.
As propostas são vinculadas a uma versão da política
Uma proposta registra a versão da política na qual sua lista de alterações foi baseada. Se a política for salva novamente antes de você aplicar a proposta, por qualquer pessoa e de qualquer lugar, a aplicação falha com 409 e o código stale_proposal, e nada é alterado. Leia a política novamente, proponha novamente e revise a nova lista de alterações.
Exemplo: propor e aplicar
Leia primeiro as configurações atuais da política para obter os IDs de configuração e os 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
}
]
} Proponha bloquear a câmera e a transferência de dados 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
} Resposta resumida. A transferência de dados USB é uma configuração de alto impacto e a política tem dispositivos, portanto a proposta é de impacto HIGH e requer confirmação. Mostre a lista de alterações à pessoa responsável antes de aplicá-la.
Depois que ela aprovar e digitar o nome da política, aplique a proposta com o que foi digitado:
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."
}
} Resposta resumida. Os dispositivos na política aplicam as novas configurações na próxima sincronização.
Quando a política foi alterada nesse ínterim
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
} Configurações editáveis
Estes são os IDs de configuração aceitos em alterações, com seus valores permitidos. O rótulo é o nome que a API retorna na lista de alterações.
Ao ler configurações, um valor também pode ser NOT_SET (deixado para o dispositivo ou padrão do Google) ou CUSTOM (um valor definido no portal que estes valores não podem expressar). Nenhum dos dois pode ser enviado, mas ambos podem ser substituídos por um valor permitido.
| Configuração | Rótulo | Grupo | Valores permitidos | Alto impacto |
|---|---|---|---|---|
| PLAY_STORE_MODE | Play Store mode | APPS | BLACKLIST, WHITELIST | Não |
| DEFAULT_PERMISSION_POLICY | Default runtime permission policy | APPS | DENY, PROMPT | Não |
| APP_AUTO_UPDATE_POLICY | App auto-update policy | APPS | ALWAYS, CHOICE_TO_THE_USER, NEVER, WIFI | Não |
| UNTRUSTED_APPS_POLICY | Apps from unknown sources | SECURITY | ALLOW_INSTALL_IN_PERSONAL_PROFILE_ONLY, DISALLOW_INSTALL | Sim |
| PLAY_PROTECT | Google Play Protect app verification | SECURITY | ENABLED, USER_CHOICE | Sim |
| SCREEN_CAPTURE | Screen capture | RESTRICTIONS | ALLOW, BLOCK | Não |
| CAMERA | Camera | RESTRICTIONS | ALLOW, BLOCK | Não |
| FACTORY_RESET | Factory reset from Settings | RESTRICTIONS | ALLOW, BLOCK | Sim |
| UNINSTALL_APPS | Uninstalling apps | RESTRICTIONS | ALLOW, BLOCK | Não |
| ACCOUNT_MODIFICATION | Adding or removing accounts | RESTRICTIONS | ALLOW, BLOCK | Não |
| ADD_USER | Adding users | RESTRICTIONS | ALLOW, BLOCK | Não |
| REMOVE_USER | Removing users | RESTRICTIONS | ALLOW, BLOCK | Não |
| DEVELOPER_SETTINGS | Developer options and USB debugging | SECURITY | ALLOW, BLOCK | Sim |
| USB_DATA_ACCESS | USB data transfer | CONNECTIVITY | ALLOW, BLOCK | Sim |
| LOCATION_MODE | Location | LOCATION | DISABLED, ENFORCED, USER_CHOICE | Não |
| LOCATION_SHARING | Sharing location | LOCATION | ALLOW, BLOCK | Não |
| OUTGOING_CALLS | Outgoing calls | RESTRICTIONS | ALLOW, BLOCK | Não |
| SMS | SMS | RESTRICTIONS | ALLOW, BLOCK | Não |
| BLUETOOTH | Bluetooth | CONNECTIVITY | ALLOW, BLOCK | Não |
| DATA_ROAMING | Data roaming | CONNECTIVITY | ALLOW, BLOCK | Não |
| NETWORK_RESET | Network settings reset | CONNECTIVITY | ALLOW, BLOCK | Não |
| VPN_CONFIGURATION | Configuring VPNs | CONNECTIVITY | ALLOW, BLOCK | Não |
| CONFIGURE_WIFI | Configuring Wi-Fi networks | CONNECTIVITY | ALLOW, BLOCK | Não |
| WIFI_DIRECT | Wi-Fi Direct | CONNECTIVITY | ALLOW, BLOCK | Não |
| TETHERING | Tethering and hotspot | CONNECTIVITY | ALLOW, BLOCK | Não |
| WIFI_STATE | Wi-Fi on or off | CONNECTIVITY | DISABLED, ENABLED, USER_CHOICE | Não |
| AIRPLANE_MODE | Airplane mode | CONNECTIVITY | DISABLED, USER_CHOICE | Não |
| MINIMUM_WIFI_SECURITY | Minimum Wi-Fi security | CONNECTIVITY | OPEN_NETWORK, PERSONAL_NETWORK | Não |
| AUTO_DATE_TIME | Automatic date, time and time zone | RESTRICTIONS | ENFORCED, USER_CHOICE | Não |
| ENCRYPTION_POLICY | Storage encryption | SECURITY | ENABLED_WITHOUT_PASSWORD, ENABLED_WITH_PASSWORD, UNSPECIFIED | Sim |
| APPLICATION_REPORT_LEVEL | Installed apps reporting | REPORTING | DISABLED, INSTALLED_AND_REMOVED_APPS, INSTALLED_APPS | Não |
| REPORT_DEVICE_SETTINGS | Device settings reporting | REPORTING | DISABLED, ENABLED | Não |
| REPORT_DISPLAY_INFO | Display information reporting | REPORTING | DISABLED, ENABLED | Não |
| REPORT_HARDWARE_STATUS | Hardware status reporting | REPORTING | DISABLED, ENABLED | Não |
| REPORT_MEMORY_INFO | Memory information reporting | REPORTING | DISABLED, ENABLED | Não |
| REPORT_NETWORK_INFO | Network information reporting | REPORTING | DISABLED, ENABLED | Não |
| REPORT_POWER_EVENTS | Power events reporting | REPORTING | DISABLED, ENABLED | Não |
| REPORT_SOFTWARE_INFO | Software information reporting | REPORTING | DISABLED, ENABLED | Não |
| REPORT_SYSTEM_PROPERTIES | System properties reporting | REPORTING | DISABLED, ENABLED | Não |
Ferramentas MCP
O servidor MCP expõe as mesmas operações como ferramentas. Elas recebem os mesmos argumentos que os endpoints REST, com policyId e proposalId como argumentos em vez de segmentos de caminho.
| Ferramenta | Permissão | Descrição |
|---|---|---|
| get_policy_settings | POLICIES_READ | Ler as configurações editáveis de uma política com seus valores atuais e permitidos. |
| list_policy_revisions | POLICIES_READ | Listar as revisões salvas de uma política, da mais recente para a mais antiga. |
| get_policy_proposal | POLICIES_READ | Ler uma proposta feita pela mesma chave ou conexão, com seu status. |
| update_policy_settings | POLICIES_WRITE + POLICIES_READ | Propor alterações de configuração para uma política existente. |
| create_policy | POLICIES_WRITE + POLICIES_READ | Propor uma nova política como uma cópia de uma existente, com alterações de configuração opcionais. |
| rollback_policy | POLICIES_WRITE + POLICIES_READ | Propor a restauração de uma política para uma revisão anterior. |
| apply_policy_proposal | POLICIES_WRITE + POLICIES_READ | Aplicar uma proposta pendente por seu proposalId, com confirmação quando for de ALTO impacto. |
Um assistente deve mostrar ao usuário a lista de alterações e obter sua aprovação explícita na conversa antes de chamar apply_policy_proposal. Para uma proposta de ALTO impacto, ele deve pedir que o usuário digite o nome da política e passar exatamente o que ele digitou.
Erros
Depois que a chave de API é autenticada, os erros usam application/problem+json com dois campos extras: code, um identificador estável para ramificação, e retryable, que indica se a mesma solicitação pode ser enviada novamente. Uma chave ausente ou inválida recebe a resposta 401 compartilhada, um pequeno objeto JSON com error, message e status. As ferramentas MCP retornam os mesmos code e message como um erro de ferramenta.
| Status | Código | Significado |
|---|---|---|
| 400 | invalid_arguments | O corpo é inválido: uma configuração desconhecida, um valor não permitido, uma configuração listada duas vezes ou um campo ausente. O detalhe informa qual. |
| 403 | forbidden | A chave não possui POLICIES_WRITE ou POLICIES_READ, ou a configuração da empresa Alterações de política está desativada. |
| 404 | not_found | Nenhuma política ou revisão visível para esta chave, ou nenhuma proposta com este ID feita por esta chave. |
| 409 | unsupported | A política não pode ser alterada desta forma: não é uma política do Android ou é gerenciada pelo Nomid. |
| 409 | not_pending | A proposta não está mais como PENDING. Leia-a para ver seu status: se for SUCCEEDED, a alteração foi feita. Se for EXECUTING, leia-a novamente até que termine. Se for UNCONFIRMED, leia as configurações da política antes de propor novamente. Se for FAILED ou EXPIRED, proponha novamente. |
| 409 | stale_proposal | A política foi salva depois que a proposta foi feita. Nada foi aplicado. Leia a política novamente e proponha novamente. |
| 422 | refused | A solicitação não pode ser realizada: nada mudaria, a empresa não está conectada ao Android Enterprise ou o novo nome da política não pode ser usado. |
| 422 | confirmation_required | A proposta é de impacto HIGH e a confirmação está ausente ou não coincide com o nome da política. Nada foi aplicado, e a proposta permanece pendente até expirar. |
| 429 | rate_limited | Muitas solicitações de gravação para esta chave de API ou conexão. O cabeçalho Retry-After e os detalhes informam os segundos de espera. retryable é true. |
| 500 | internal_error | Erro inesperado. Leia a proposta antes de tentar novamente: se seu status for FAILED, proponha novamente. Se for UNCONFIRMED, leia as configurações da política para verificar se a alteração foi feita antes de propô-la novamente. |
Limites de taxa
Cada chamada de propose e apply conta para o limite de gravação de 10 solicitações por minuto para cada chave de API ou conexão Sign in with Nomid, compartilhado com os endpoints de comando de dispositivo, códigos QR de provisionamento e as ferramentas de gravação do MCP. Chamadas de leitura não contam para o limite.
Revisões e rollback
Cada alteração aplicada salva uma nova revisão da política. Liste as revisões para ver quem alterou a política e quando, e proponha um rollback para desfazer uma alteração.