Modifications de stratégie
Modifiez les paramètres d'une stratégie Android, créez une stratégie par copie d'une autre, ou effectuez un rollback d'une stratégie vers une révision antérieure. Chaque modification est examinée avant d'être appliquée.
Comment ça fonctionne
Chaque modification se déroule en deux étapes. D'abord, vous la proposez : l'API enregistre une proposition et renvoie sa liste de modifications, avec la valeur actuelle et la nouvelle valeur de chaque paramètre, l'impact et la date d'expiration de la proposition. Rien ne change encore sur la stratégie. Ensuite, vous appliquez la proposition par son proposalId, après que la personne responsable a examiné la liste de modifications.
Seule la clé d'API ayant créé une proposition peut la lire ou l'appliquer. Pour une connexion OAuth, seuls la même connexion et le même utilisateur le peuvent. Une proposition expire 10 minutes après avoir été créée ; le champ expiresAt indique l'heure exacte.
Seules les stratégies Android peuvent être modifiées de cette manière. Les stratégies gérées par Nomid ne le peuvent pas. La création d'une stratégie nécessite également que l'entreprise soit connectée à Android Enterprise.
Prérequis
- Une clé d'API avec l'autorisation POLICIES_WRITE (Modifications de stratégie), combinée avec POLICIES_READ. Seul un utilisateur du portail autorisé à modifier des stratégies peut créer une clé avec POLICIES_WRITE. Requis par les quatre points de terminaison POST et les outils MCP de modification de stratégie.
- Le paramètre d'entreprise Modifications de stratégie, sous Accès des agents IA dans le portail, doit être activé. Il est désactivé par défaut. Tant qu'il est désactivé, chaque appel pour proposer ou appliquer renvoie 403. La lecture des paramètres, des révisions et des propositions nécessite uniquement POLICIES_READ.
- Les clients MCP qui se connectent avec « Se connecter avec Nomid » au lieu d'une clé d'API ont besoin de la portée mcp:policies:write.
Points de terminaison
Tous les chemins sont relatifs à l'URL de base de l'API et nécessitent l'en-tête X-API-Key. Les corps des requêtes sont en JSON.
| Méthode | Point d'accès | Description |
|---|---|---|
| GET | /policies/{policyId}/settings | Les paramètres modifiables de la stratégie, chacun avec sa valeur actuelle, ses valeurs autorisées, son groupe et l'indication si sa modification a un impact élevé. Renvoie également la version de la stratégie, deviceCount et l'indication si la stratégie est modifiable. |
| GET | /policies/{policyId}/revisions | Les révisions enregistrées de la stratégie, de la plus récente à la plus ancienne, avec la date et l'auteur de chaque enregistrement. limit est facultatif, de 1 à 100, valeur par défaut 20. |
| GET | /policy-proposals/{proposalId} | Une proposition effectuée par cette clé, avec sa liste de modifications et son statut : PENDING, EXECUTING, SUCCEEDED, FAILED, UNCONFIRMED ou EXPIRED. |
| POST | /policies/{policyId}/changes | Proposer des modifications de paramètres pour une stratégie existante. Renvoie 201 avec la proposition. |
| POST | /policies | Proposer une nouvelle stratégie sous forme de copie d'une stratégie existante, avec des modifications de paramètres facultatives. Sans modifications, cela duplique la stratégie. Renvoie 201 avec la proposition. |
| POST | /policies/{policyId}/rollbacks | Proposer de restaurer la stratégie à une révision antérieure. Renvoie 201 avec la proposition. |
| POST | /policy-proposals/{proposalId}/apply | Appliquer une proposition en attente. Renvoie 200 avec la proposition et son résultat : policyId, displayName, version et un lien vers le portail. |
Corps de requête
Modifier les paramètres
| Champ | Obligatoire | Description |
|---|---|---|
| changes | Oui | Tableau d'objets avec setting (un ID de paramètre) et value (une de ses valeurs autorisées). Chaque paramètre au maximum une fois. Les valeurs ne sont pas sensibles à la casse. |
Créer une stratégie
| Champ | Obligatoire | Description |
|---|---|---|
| fromPolicyId | Oui | La stratégie à copier, par son identifiant de stratégie (pathName). La copie reprend ses applications, ses paramètres et ses restrictions. |
| displayName | Oui | Nom de la nouvelle stratégie tel qu'affiché dans le portail, au maximum 50 caractères. |
| changes | Non | Modifications de paramètres à appliquer à la copie, sous le même format que ci-dessus. Omettez-le pour dupliquer la stratégie. Aucun appareil n'utilise la nouvelle stratégie tant que vous n'y déplacez pas d'appareils. |
Restaurer une stratégie
| Champ | Obligatoire | Description |
|---|---|---|
| revision | Oui | Le numéro de révision à restaurer, provenant du point de terminaison revisions. La description, les balises et le groupe de la stratégie restent inchangés. Son nom revient au nom de la révision s'ils diffèrent, et la liste des modifications l'indique. |
Appliquer une proposition
| Champ | Obligatoire | Description |
|---|---|---|
| confirmation | Pour un impact ÉLEVÉ | Obligatoire lorsque la proposition a requiresConfirmation défini sur true : le nom de la stratégie, saisi par la personne qui approuve la modification. La correspondance ignore la casse et les espaces autour. |
La proposition
Chaque point de terminaison de proposition ainsi que les points de terminaison get et apply renvoient la proposition. Les champs les plus utiles :
| Champ | Description |
|---|---|
| proposalId | L'identifiant permettant de lire ou d'appliquer la proposition. |
| status | PENDING jusqu'à l'application, et EXECUTING pendant qu'une application est en cours : aucun des deux n'est définitif. Ensuite SUCCEEDED ou FAILED, UNCONFIRMED lorsqu'une erreur inattendue a laissé le résultat inconnu, ou EXPIRED une fois que expiresAt est dépassé. |
| impact | NORMAL ou HIGH. Voir Impact et confirmation. |
| requiresConfirmation | Vrai pour une proposition à impact HIGH : l'application nécessite le champ confirmation. |
| fields | La liste des modifications. Chaque entrée comporte label (le nom du paramètre), value (la nouvelle valeur) et previousValue (la valeur actuelle). |
| summary | Une phrase décrivant la modification, indiquant notamment combien d'appareils utilisent la politique. |
| target | La politique que la proposition modifie : kind, id et name. |
| expiresAt | Date et heure d'expiration de la proposition. Après cela, elle ne peut plus être appliquée. |
| result | Réponses d'application uniquement : la politique telle qu'elle est actuellement, avec policyId, displayName, version, un message et portalUrl. |
Impact et confirmation
Une proposition a un impact HIGH lorsque la politique compte au moins un appareil et que l'une des conditions suivantes est remplie :
- Il s'agit d'un retour arrière (rollback).
- Elle modifie un paramètre à fort impact : applications de sources inconnues, Google Play Protect, réinitialisation aux paramètres d'usine, options pour les développeurs, transfert de données USB ou chiffrement du stockage.
- La politique compte 50 appareils ou plus, quelle que soit la modification.
Tout le reste est NORMAL, y compris toute nouvelle politique, car aucun appareil ne l'utilise encore.
Les propositions sont associées à une version de politique
Une proposition enregistre la version de la politique sur laquelle sa liste de modifications a été créée. Si la politique est enregistrée à nouveau avant que vous n'appliquiez la proposition, par n'importe qui et depuis n'importe où, l'application échoue avec une erreur 409 et le code stale_proposal, et rien ne change. Lisez à nouveau la politique, proposez à nouveau et examinez la nouvelle liste des modifications.
Exemple : proposer et appliquer
Lisez d'abord les paramètres actuels de la politique pour obtenir les identifiants de paramètres et les valeurs autorisées :
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
}
]
} Proposez de bloquer l'appareil photo et le transfert de données 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
} Réponse abrégée. Le transfert de données USB est un paramètre à fort impact et la politique comporte des appareils, la proposition a donc un impact HIGH et nécessite une confirmation. Présentez la liste des modifications à la personne responsable avant de l'appliquer.
Une fois qu'elle a approuvé et saisi le nom de la politique, appliquez la proposition avec ce qu'elle a saisi :
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."
}
} Réponse abrégée. Les appareils soumis à la politique appliquent les nouveaux paramètres lors de leur prochaine synchronisation.
Lorsque la politique a été modifiée entre-temps
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
} Paramètres modifiables
Voici les identifiants de paramètres acceptés dans les modifications, ainsi que leurs valeurs autorisées. Le libellé correspond au nom renvoyé par l'API dans la liste des modifications.
Lors de la lecture des paramètres, une valeur peut également être NOT_SET (laissée à la valeur par défaut de l'appareil ou de Google) ou CUSTOM (une valeur définie dans le portail que ces valeurs ne peuvent pas exprimer). Aucune des deux ne peut être envoyée, mais toutes deux peuvent être remplacées par une valeur autorisée.
| Paramètre | Libellé | Groupe | Valeurs autorisées | Impact élevé |
|---|---|---|---|---|
| PLAY_STORE_MODE | Play Store mode | APPS | BLACKLIST, WHITELIST | Non |
| DEFAULT_PERMISSION_POLICY | Default runtime permission policy | APPS | DENY, PROMPT | Non |
| APP_AUTO_UPDATE_POLICY | App auto-update policy | APPS | ALWAYS, CHOICE_TO_THE_USER, NEVER, WIFI | Non |
| UNTRUSTED_APPS_POLICY | Apps from unknown sources | SECURITY | ALLOW_INSTALL_IN_PERSONAL_PROFILE_ONLY, DISALLOW_INSTALL | Oui |
| PLAY_PROTECT | Google Play Protect app verification | SECURITY | ENABLED, USER_CHOICE | Oui |
| SCREEN_CAPTURE | Screen capture | RESTRICTIONS | ALLOW, BLOCK | Non |
| CAMERA | Camera | RESTRICTIONS | ALLOW, BLOCK | Non |
| FACTORY_RESET | Factory reset from Settings | RESTRICTIONS | ALLOW, BLOCK | Oui |
| UNINSTALL_APPS | Uninstalling apps | RESTRICTIONS | ALLOW, BLOCK | Non |
| ACCOUNT_MODIFICATION | Adding or removing accounts | RESTRICTIONS | ALLOW, BLOCK | Non |
| ADD_USER | Adding users | RESTRICTIONS | ALLOW, BLOCK | Non |
| REMOVE_USER | Removing users | RESTRICTIONS | ALLOW, BLOCK | Non |
| DEVELOPER_SETTINGS | Developer options and USB debugging | SECURITY | ALLOW, BLOCK | Oui |
| USB_DATA_ACCESS | USB data transfer | CONNECTIVITY | ALLOW, BLOCK | Oui |
| LOCATION_MODE | Location | LOCATION | DISABLED, ENFORCED, USER_CHOICE | Non |
| LOCATION_SHARING | Sharing location | LOCATION | ALLOW, BLOCK | Non |
| OUTGOING_CALLS | Outgoing calls | RESTRICTIONS | ALLOW, BLOCK | Non |
| SMS | SMS | RESTRICTIONS | ALLOW, BLOCK | Non |
| BLUETOOTH | Bluetooth | CONNECTIVITY | ALLOW, BLOCK | Non |
| DATA_ROAMING | Data roaming | CONNECTIVITY | ALLOW, BLOCK | Non |
| NETWORK_RESET | Network settings reset | CONNECTIVITY | ALLOW, BLOCK | Non |
| VPN_CONFIGURATION | Configuring VPNs | CONNECTIVITY | ALLOW, BLOCK | Non |
| CONFIGURE_WIFI | Configuring Wi-Fi networks | CONNECTIVITY | ALLOW, BLOCK | Non |
| WIFI_DIRECT | Wi-Fi Direct | CONNECTIVITY | ALLOW, BLOCK | Non |
| TETHERING | Tethering and hotspot | CONNECTIVITY | ALLOW, BLOCK | Non |
| WIFI_STATE | Wi-Fi on or off | CONNECTIVITY | DISABLED, ENABLED, USER_CHOICE | Non |
| AIRPLANE_MODE | Airplane mode | CONNECTIVITY | DISABLED, USER_CHOICE | Non |
| MINIMUM_WIFI_SECURITY | Minimum Wi-Fi security | CONNECTIVITY | OPEN_NETWORK, PERSONAL_NETWORK | Non |
| AUTO_DATE_TIME | Automatic date, time and time zone | RESTRICTIONS | ENFORCED, USER_CHOICE | Non |
| ENCRYPTION_POLICY | Storage encryption | SECURITY | ENABLED_WITHOUT_PASSWORD, ENABLED_WITH_PASSWORD, UNSPECIFIED | Oui |
| APPLICATION_REPORT_LEVEL | Installed apps reporting | REPORTING | DISABLED, INSTALLED_AND_REMOVED_APPS, INSTALLED_APPS | Non |
| REPORT_DEVICE_SETTINGS | Device settings reporting | REPORTING | DISABLED, ENABLED | Non |
| REPORT_DISPLAY_INFO | Display information reporting | REPORTING | DISABLED, ENABLED | Non |
| REPORT_HARDWARE_STATUS | Hardware status reporting | REPORTING | DISABLED, ENABLED | Non |
| REPORT_MEMORY_INFO | Memory information reporting | REPORTING | DISABLED, ENABLED | Non |
| REPORT_NETWORK_INFO | Network information reporting | REPORTING | DISABLED, ENABLED | Non |
| REPORT_POWER_EVENTS | Power events reporting | REPORTING | DISABLED, ENABLED | Non |
| REPORT_SOFTWARE_INFO | Software information reporting | REPORTING | DISABLED, ENABLED | Non |
| REPORT_SYSTEM_PROPERTIES | System properties reporting | REPORTING | DISABLED, ENABLED | Non |
Outils MCP
Le serveur MCP expose les mêmes opérations sous forme d'outils. Ils prennent les mêmes arguments que les points de terminaison REST, avec policyId et proposalId comme arguments au lieu de segments de chemin.
| Outil | Autorisation | Description |
|---|---|---|
| get_policy_settings | POLICIES_READ | Lire les paramètres modifiables d'une règle avec leurs valeurs actuelles et autorisées. |
| list_policy_revisions | POLICIES_READ | Lister les révisions enregistrées d'une règle, de la plus récente à la plus ancienne. |
| get_policy_proposal | POLICIES_READ | Lire une proposition effectuée par la même clé ou connexion, avec son statut. |
| update_policy_settings | POLICIES_WRITE + POLICIES_READ | Proposer des modifications de paramètres pour une règle existante. |
| create_policy | POLICIES_WRITE + POLICIES_READ | Proposer une nouvelle règle sous forme de copie d'une règle existante, avec des modifications de paramètres facultatives. |
| rollback_policy | POLICIES_WRITE + POLICIES_READ | Proposer la restauration d'une règle vers une révision antérieure. |
| apply_policy_proposal | POLICIES_WRITE + POLICIES_READ | Appliquer une proposition en attente à l'aide de son proposalId, avec confirmation lorsqu'elle est d'impact HIGH. |
Un assistant doit présenter la liste des modifications à l'utilisateur et obtenir son approbation explicite dans la conversation avant d'appeler apply_policy_proposal. Pour une proposition d'impact HIGH, il doit demander à l'utilisateur de saisir le nom de la règle et transmettre exactement ce qu'il a saisi.
Erreurs
Une fois la clé d'API authentifiée, les erreurs utilisent application/problem+json avec deux champs supplémentaires : code, un identifiant stable sur lequel baser les branchements, et retryable, qui indique si la même requête peut être renvoyée. Une clé manquante ou non valide reçoit la réponse 401 partagée, un petit objet JSON comportant error, message et status. Les outils MCP renvoient les mêmes code et message sous la forme d'une erreur d'outil.
| Statut | Code | Signification |
|---|---|---|
| 400 | invalid_arguments | Le corps n'est pas valide : un paramètre inconnu, une valeur non autorisée, un paramètre listé deux fois ou un champ manquant. Le détail indique duquel il s'agit. |
| 403 | forbidden | La clé ne dispose pas de POLICIES_WRITE ou de POLICIES_READ, ou le paramètre d'entreprise Modifications des règles est désactivé. |
| 404 | not_found | Aucune règle ou révision de ce type n'est visible pour cette clé, ou aucune proposition avec cet identifiant n'a été effectuée par cette clé. |
| 409 | unsupported | La règle ne peut pas être modifiée de cette manière : il ne s'agit pas d'une règle Android, ou elle est gérée par Nomid. |
| 409 | not_pending | La proposition n'est plus PENDING. Lisez-la pour voir son statut : si elle est SUCCEEDED, la modification est effectuée. Si elle est EXECUTING, lisez-la à nouveau jusqu'à ce qu'elle se termine. Si elle est UNCONFIRMED, lisez les paramètres de la politique avant de proposer à nouveau. Si elle est FAILED ou EXPIRED, proposez à nouveau. |
| 409 | stale_proposal | La politique a été enregistrée après que la proposition a été faite. Rien n'a été appliqué. Lisez à nouveau la politique et proposez à nouveau. |
| 422 | refused | La requête ne peut pas être traitée : rien ne changerait, l'entreprise n'est pas connectée à Android Enterprise, ou le nouveau nom de la politique ne peut pas être utilisé. |
| 422 | confirmation_required | La proposition a un impact HIGH et la confirmation est manquante ou ne correspond pas au nom de la politique. Rien n'a été appliqué, et la proposition reste en attente jusqu'à ce qu'elle expire. |
| 429 | rate_limited | Trop de requêtes d'écriture pour cette clé d'API ou cette connexion. L'en-tête Retry-After et le détail indiquent les secondes à attendre. retryable est true. |
| 500 | internal_error | Erreur inattendue. Lisez la proposition avant de réessayer : si son statut est FAILED, proposez à nouveau. Si elle est UNCONFIRMED, lisez les paramètres de la politique pour voir si la modification a été effectuée avant de la proposer à nouveau. |
Limites de débit
Chaque appel propose et apply est décompté de la limite d'écriture de 10 requêtes par minute pour chaque clé d'API ou connexion Sign in with Nomid, partagée avec les points de terminaison de commande d'appareils, les codes QR de provisionnement et les outils d'écriture MCP. Les appels de lecture ne sont pas décomptés.
Révisions et rollback
Chaque modification appliquée enregistre une nouvelle révision de la politique. Listez les révisions pour voir qui a modifié la politique et quand, et proposez un rollback pour annuler une modification.