Commandes d'appareils
Les points de terminaison de commande d'appareils envoient une commande à un appareil géré. Ils nécessitent une clé API avec l'autorisation DEVICES_COMMAND, ou DEVICES_COMMAND_DESTRUCTIVE pour les quatre commandes destructives.
Vue d'ensemble
Chaque appel agit sur un seul appareil, identifié par son assetId, qui correspond au pathName renvoyé par GET /assets. Il n'existe aucun point de terminaison de traitement par lots. Pour commander plusieurs appareils, effectuez un appel par appareil dans la limite de débit autorisée. Les points de terminaison effectuent la même action que les outils de commande MCP.
La clé nécessite DEVICES_COMMAND et DEVICES_READ. change-policy nécessite également POLICIES_READ. Les commandes destructives nécessitent plutôt DEVICES_COMMAND_DESTRUCTIVE et DEVICES_READ. Envoyez la clé dans l'en-tête X-API-Key. L'API REST n'accepte pas d'en-tête Authorization.
L'appareil doit être enregistré (statut ACTIVE, INACTIVE ou SYNCHRONIZING). Certaines commandes ne fonctionnent que sur un type d'appareil, comme l'indique chaque description ci-dessous : appareils Android Management (gérés par Google) ou appareils gérés par l'agent Nomid (AOSP). Tout autre appareil reçoit une réponse 409. Un message est une notification push envoyée à l'agent Nomid et nécessite un jeton push enregistré.
Points de terminaison
| Méthode | Point d'accès | Description |
|---|---|---|
| POST | /assets/{assetId}/commands/lock | Verrouiller l'écran de l'appareil immédiatement. Appareils Android Management uniquement. Aucun corps de requête. |
| POST | /assets/{assetId}/commands/lost-mode | Verrouiller l'appareil et afficher un message, avec des coordonnées facultatives, sur son écran de verrouillage. Appareils Android Management uniquement. |
| POST | /assets/{assetId}/commands/found | Mettre fin au mode perdu. Rien ne se produit et aucune erreur n'est renvoyée si l'appareil n'était pas en mode perdu. Appareils Android Management uniquement. Aucun corps de requête. |
| POST | /assets/{assetId}/commands/message | Afficher une notification push en texte brut sur l'appareil. |
| POST | /assets/{assetId}/commands/status-report | Demander à l'appareil d'envoyer un rapport d'état actualisé maintenant. Le rapport arrive plus tard : lisez-le avec GET /assets/ASSET_ID. Aucun corps de requête. |
| POST | /assets/{assetId}/commands/location-update | Demander à l'appareil de signaler sa position actuelle maintenant. La position arrive plus tard : lisez-la avec GET /assets/ASSET_ID. Aucun corps de requête. |
| POST | /assets/{assetId}/commands/sync-policy | Renvoyer la stratégie actuelle à l'appareil. Appareils gérés par l'agent Nomid (AOSP) uniquement : les appareils Android Management reçoivent automatiquement les modifications de stratégie et renvoient 409. Aucun corps de requête. |
| POST | /assets/{assetId}/commands/reboot | Redémarrer l'appareil maintenant. La personne qui l'utilise est interrompue, et le travail non enregistré peut être perdu. Aucun corps de requête. |
| POST | /assets/{assetId}/commands/shutdown | Éteindre l'appareil maintenant. Il ne peut pas être rallumé à distance. Appareils gérés par l'agent Nomid (AOSP) uniquement. Aucun corps de requête. |
| POST | /assets/{assetId}/commands/launch-app | Ouvrir une application installée sur l'appareil par son nom de package. Appareils gérés par l'agent Nomid (AOSP) uniquement. |
| POST | /assets/{assetId}/commands/clear-app-data | Supprimer toutes les données des applications indiquées (comptes, paramètres et fichiers), comme si elles venaient d'être installées. Cette action est irréversible. Appareils Android Management uniquement. |
| POST | /assets/{assetId}/commands/change-policy | Transférer l'appareil vers une autre stratégie de l'entreprise. L'appareil applique les applications, restrictions et paramètres de la nouvelle stratégie, et tout élément présent uniquement dans la stratégie actuelle est supprimé. Nécessite également POLICIES_READ. |
Envoyez Content-Type: application/json avec les points de terminaison lost-mode, message, launch-app, clear-app-data, change-policy et change-screen-lock-password. Les autres points de terminaison ne prennent aucun corps. Les champs inconnus sont rejetés et les champs de texte obligatoires ne peuvent pas être vides.
Commandes destructives
Quatre commandes effacent les données, suppriment ou remplacent le verrouillage de l'écran, ou mettent fin à la gestion de l'appareil. Avec une clé d'API, elles s'exécutent dès que la requête est acceptée. Il n'y a aucune étape d'approbation dans le portail.
Elles nécessitent une clé d'API avec DEVICES_COMMAND_DESTRUCTIVE et DEVICES_READ. L'entreprise doit également activer les commandes destructives sous l'accès agent IA dans le portail. Ce paramètre est désactivé par défaut et nécessite que les commandes d'appareil soient également activées. Sans cela, la requête renvoie une erreur 403 avec le code forbidden.
| Méthode | Point d'accès | Description |
|---|---|---|
| POST | /assets/{assetId}/commands/wipe | Retirer l'appareil de la gestion et effacer ses données gérées. Un appareil appartenant à l'entreprise est réinitialisé aux paramètres d'usine : toutes les applications et toutes les données qu'il contient sont effacées. Sur un appareil personnel doté d'un profil professionnel, seuls le profil professionnel ainsi que ses applications et données sont supprimés ; les applications et données personnelles sont conservées. Irréversible. Aucun corps de requête. |
| POST | /assets/{assetId}/commands/reset-screen-lock | Supprimer le verrouillage de l'écran de l'appareil (code PIN, schéma ou mot de passe), afin qu'il puisse être déverrouillé sans celui-ci. Appareils Android Management uniquement. Aucun corps de requête. |
| POST | /assets/{assetId}/commands/change-screen-lock-password | Définir un nouveau mot de passe de verrouillage de l'écran. L'appareil se verrouille, et seul le nouveau mot de passe permet de le déverrouiller. Appareils Android Management uniquement. |
| POST | /assets/{assetId}/commands/relinquish-ownership | Céder un appareil appartenant à l'entreprise à son utilisateur. Le profil professionnel et ses données sont supprimés, et l'appareil n'est plus géré. Irréversible. Aucun corps de requête. |
change-screen-lock-password prend le nouveau mot de passe dans newPassword. Nomid ne le stocke, ne le renvoie ni ne le consigne jamais dans les journaux.
Corps de requête
Corps de requête du mode perdu
| Champ | Obligatoire | Description |
|---|---|---|
| message | Oui | Texte affiché sur l'écran de verrouillage. Jusqu'à 4096 caractères. |
| phoneNumber | Non | Numéro de téléphone de contact affiché sur l'écran de verrouillage. Jusqu'à 4096 caractères. |
| Non | Adresse e-mail de contact affichée sur l'écran de verrouillage. Doit être une adresse e-mail valide, jusqu'à 320 caractères. | |
| streetAddress | Non | Adresse postale de contact affichée sur l'écran de verrouillage. Jusqu'à 4096 caractères. |
| organization | Non | Nom de l'organisation affiché sur l'écran de verrouillage. Jusqu'à 4096 caractères. |
Corps de requête du message
| Champ | Obligatoire | Description |
|---|---|---|
| title | Oui | Titre de la notification. Jusqu'à 60 caractères. |
| body | Oui | Texte de la notification. Jusqu'à 500 caractères. |
Corps de requête pour lancer l'application
| Champ | Obligatoire | Description |
|---|---|---|
| packageName | Oui | Nom de package de l'application installée à ouvrir, par exemple com.example.app. |
Corps de requête pour effacer les données de l'application
| Champ | Obligatoire | Description |
|---|---|---|
| packageNames | Oui | Tableau de 1 à 20 noms de package, par exemple com.example.app, dont les données sont effacées. |
Corps de requête pour changer de stratégie
| Champ | Obligatoire | Description |
|---|---|---|
| policyId | Oui | La nouvelle stratégie, via son policyId (le pathName renvoyé par GET /policies). |
Corps de requête pour modifier le mot de passe de verrouillage de l'écran
| Champ | Obligatoire | Description |
|---|---|---|
| newPassword | Oui | Le nouveau mot de passe de verrouillage de l'écran, de 4 à 128 caractères, sans espaces au début ou à la fin. Il n'est jamais stocké, renvoyé ou consigné dans les journaux. |
Exemple : envoyer un message
Remplacez l'ID de l'actif par un pathName issu de GET /assets, et conservez la clé dans une variable d'environnement.
curl -X POST "https://api.nomid.tech/emm/api/v1/assets/k3x9m2pa/commands/message" \
-H "X-API-Key: $NOMID_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title": "Please return this device", "body": "Bring it to the IT desk by 5 pm."}' {
"assetId": "k3x9m2pa",
"type": "NOTIFICATION_MESSAGE",
"status": "SUCCESS",
"createdAt": "2026-10-06T14:30:00Z"
} Une réponse 200 signifie que la commande a été créée. Le champ status indique l'état de la commande lors du retour de la requête. Pour un message, SUCCESS signifie que le push a été accepté pour la livraison, et non que l'utilisateur l'a vu. Poursuivez avec GET /assets/ASSET_ID/commands.
Exemple : verrouiller un appareil
curl -X POST "https://api.nomid.tech/emm/api/v1/assets/k3x9m2pa/commands/lock" \
-H "X-API-Key: $NOMID_API_KEY" {
"assetId": "k3x9m2pa",
"type": "LOCK",
"status": "IN_PROGRESS",
"createdAt": "2026-10-06T14:30:00Z"
} Le verrouillage et le mode perdu renvoient IN_PROGRESS tant que l'appareil n'a pas encore confirmé la commande. L'historique des commandes affiche SUCCESS une fois que c'est fait. Le point de terminaison lock ne prend aucun corps.
Exemple : effacer un appareil
curl -X POST "https://api.nomid.tech/emm/api/v1/assets/k3x9m2pa/commands/wipe" \
-H "X-API-Key: $NOMID_API_KEY" {
"assetId": "k3x9m2pa",
"type": "WIPE_COMPANY_DATA",
"status": "IN_PROGRESS"
} Un effacement d'un appareil Android Management répond IN_PROGRESS sans createdAt. Consultez l'historique des commandes pour le suivre.
Réponses et mesures à prendre
Les règles de nouvelle tentative sont importantes. Réessayer une commande dont l'issue est inconnue peut entraîner son exécution en double.
| Statut | Signification | Mesure à prendre |
|---|---|---|
| 200 | La commande a été créée et mise en file d'attente. | Lisez le champ status. Il est à IN_PROGRESS jusqu'à ce que l'appareil confirme la commande ; vérifiez donc l'historique des commandes pour trouver SUCCESS. Certaines commandes, telles qu'un redémarrage, un effacement ou l'abandon de propriété sur un appareil Android Management, répondent IN_PROGRESS sans createdAt. |
| 202 | UNCONFIRMED. Nomid ne peut pas déterminer si la commande a atteint l'appareil, par exemple parce que le fournisseur a expiré ou a échoué de son côté. Le corps est l'objet de résultat normal avec le statut UNCONFIRMED et des instructions dans detail. En dehors des points de terminaison lock, lost-mode, found et message, il ne comporte jamais createdAt. | Ne renvoyez pas la commande. Vérifiez d'abord l'historique des commandes de l'appareil et demandez confirmation à l'utilisateur avant de l'envoyer à nouveau. Pour un message, l'historique peut afficher ERROR même si la notification a bien été affichée. La commande peut n'apparaître qu'une fois que l'appareil l'a acquittée. |
| 400 | Le corps de la requête a échoué à la validation, ou un paramètre est invalide. | Corrigez les champs listés dans le tableau errors ou dans detail. Aucune commande n'a été envoyée. |
| 401 | La clé API est manquante, invalide ou expirée. | Envoyez une clé valide dans l'en-tête X-API-Key. |
| 403 | La clé ne dispose pas de la permission requise par la commande ou, pour une commande destructive, l'entreprise n'a pas activé les commandes destructives. | Utilisez une clé créée avec DEVICES_COMMAND et DEVICES_READ, plus POLICIES_READ pour change-policy, ou avec DEVICES_COMMAND_DESTRUCTIVE et DEVICES_READ pour une commande destructive. Pour les commandes destructives, vérifiez également le paramètre de l'entreprise sous AI agent access dans le portail. |
| 404 | Aucun actif avec cet ID n'existe dans l'entreprise de la clé. Un actif provenant d'une autre entreprise renvoie également 404. Sur les points de terminaison lock, lost-mode, found et message, le corps est vide. Sur les autres points de terminaison, il s'agit d'un problème détaillé (problem details) avec le code not_found, et change-policy le renvoie également pour une stratégie inconnue. | Vérifiez l'ID de l'actif par rapport à GET /assets, et pour change-policy, l'ID de la stratégie par rapport à GET /policies. |
| 409 | L'appareil ne peut pas accepter cette commande : il n'a pas d'appareil géré, présente un statut non éligible ou un type d'appareil non pris en charge, ou, pour un message, n'a aucun jeton push valide. change-policy renvoie également 409 lorsque l'appareil utilise déjà cette stratégie. Renvoyé également lorsque le fournisseur signale que l'appareil n'est plus géré. Nomid marque alors l'appareil comme supprimé. | Réessayer échouera de la même manière jusqu'à ce que l'état de l'appareil change. Ne réessayez pas en boucle. |
| 422 | Le fournisseur a évalué la requête et l'a refusée pour cet appareil ou ce message, ou a signalé que la commande avait déjà échoué. | Ne réessayez pas avec les mêmes arguments. |
| 429 | La limite de fréquence des commandes a été dépassée. Un en-tête Retry-After indique le nombre de secondes avant la réinitialisation de la fenêtre. | Attendez le délai indiqué par Retry-After, puis réessayez. |
| 500 | Erreur inattendue. En dehors des points de terminaison lock, lost-mode, found et message, le corps comporte le code internal_error et retryable false. On ignore si la commande a atteint l'appareil. | Ne renvoyez pas immédiatement. Vérifiez d'abord l'actif et son historique de commandes. |
| 502 | Android Management a rejeté la commande pour une raison qui ne concerne pas cet appareil. Le champ retryable indique s'il faut réessayer. Les messages ne renvoient jamais 502. | Si retryable est vrai (le fournisseur applique une limitation de débit ou a signalé un conflit temporaire), réessayez après un court délai. S'il est faux, la configuration Android Management de l'entreprise présente un problème : ne réessayez pas et contactez le support. |
| 503 | Non envoyé. La requête a échoué au sein de Nomid avant que quoi que ce soit ne soit distribué. retryable est toujours vrai. | Nouvel essai sans risque. Rien n'a été distribué, une nouvelle tentative ne peut donc pas dupliquer la commande. |
Corps d'erreur
Les erreurs provenant des points de terminaison de commande utilisent application/problem+json (RFC 9457). Sur les points de terminaison lock, lost-mode, found et message, les erreurs 401 et 429 renvoient un petit objet JSON avec error, message et status, 404 n'a pas de corps, et seuls 502 et 503 ajoutent un champ booléen retryable. Sur les autres points de terminaison, chaque erreur hormis 401 correspond aux détails du problème avec un champ code, tel que not_found, unsupported, forbidden, invalid_arguments ou rate_limited, et 429, 500, 502 et 503 comportent également retryable. Une réponse 202 n'est pas une erreur : elle contient l'objet de résultat normal.
Exemple de réponse 202
HTTP/1.1 202 Accepted
{
"assetId": "k3x9m2pa",
"type": "LOCK",
"status": "UNCONFIRMED",
"detail": "The command's outcome is unknown. Check the device's command history (list_device_commands or GET /api/v1/assets/{assetId}/commands) before retrying; it may only appear once the device acknowledges it."
} Exemple de réponse 503
HTTP/1.1 503 Service Unavailable
Content-Type: application/problem+json
{
"type": "about:blank",
"title": "Service Unavailable",
"status": 503,
"detail": "Command was not sent; it is safe to retry.",
"instance": "/emm/api/v1/assets/k3x9m2pa/commands/message",
"retryable": true
} Exemple de réponse 404 provenant d'un point de terminaison autre que lock, lost-mode, found et message
HTTP/1.1 404 Not Found
Content-Type: application/problem+json
{
"type": "about:blank",
"title": "Not Found",
"status": 404,
"detail": "No device found with assetId: k3x9m2pa",
"instance": "/emm/api/v1/assets/k3x9m2pa/commands/reboot",
"code": "not_found"
} Limite de fréquence
Les commandes sont limitées à 10 par minute et par clé d'API, commandes destructives incluses. Le même quota est partagé avec les outils de commande MCP, les modifications de stratégie (chaque appel propose et apply) et les codes QR d'enrôlement, via REST ou MCP. Via REST, les requêtes dépassant la limite reçoivent une erreur HTTP 429 avec un en-tête Retry-After.
Sur les points de terminaison lock, lost-mode, found et message, seules les clés disposant de DEVICES_COMMAND consomment ce quota, et une requête avec un corps non valide ou un identifiant d'actif inconnu est tout de même comptabilisée, car la limite est appliquée avant la validation de la requête. Les autres points de terminaison de commande, les appels de modification de stratégie et les requêtes de code QR d'enrôlement ne le consomment qu'une fois que la requête a passé avec succès les vérifications d'autorisations et la validation des arguments.
Piste d'audit
Chaque commande est enregistrée dans l'historique des commandes de l'appareil au sein du portail Nomid et attribuée à la clé d'API qui l'a envoyée, et non à une personne. L'entrée indique api-key, l'identifiant de la clé et le préfixe de la clé. L'historique renvoyé par GET /assets/ASSET_ID/commands et par l'outil MCP list_device_commands contient uniquement type, status, createdAt, feedbackAt et outcome, mais pas l'auteur de l'envoi de la commande.