Zmiany zasad
Zmieniaj ustawienia zasady Androida, twórz zasadę jako kopię innej lub przywracaj zasadę do wcześniejszej wersji. Każda zmiana jest weryfikowana przed jej zastosowaniem.
Jak to działa
Każda zmiana wymaga dwóch kroków. Najpierw ją proponujesz: API rejestruje wniosek i zwraca listę zmian z bieżącą i nową wartością każdego ustawienia, wpływem oraz terminem wygaśnięcia wniosku. W zasadzie nic się jeszcze nie zmienia. Następnie stosujesz wniosek na podstawie jego proposalId, po tym jak osoba odpowiedzialna przejrzy listę zmian.
Tylko klucz API, który utworzył wniosek, może go odczytać lub zastosować. W przypadku połączenia OAuth może to zrobić tylko to samo połączenie i ten sam użytkownik. Wniosek wygasa po 10 minutach od jego utworzenia; pole expiresAt podaje dokładny czas.
W ten sposób można zmieniać wyłącznie zasady Androida. Zasad zarządzanych przez Nomid nie można modyfikować w ten sposób. Utworzenie zasady wymaga również, aby firma była połączona z Android Enterprise.
Wymagania
- Klucz API z uprawnieniem POLICIES_WRITE (Zmiany zasad), połączonym z POLICIES_READ. Tylko użytkownik portalu z uprawnieniem do edycji zasad może utworzyć klucz z uprawnieniem POLICIES_WRITE. Wymagany przez cztery punkty końcowe POST oraz narzędzia MCP do wprowadzania zmian w zasadach.
- Ustawienie firmowe Zmiany zasad, w sekcji Dostęp agenta AI w portalu, musi być włączone. Domyślnie jest wyłączone. Gdy jest wyłączone, każde wywołanie propozycji i zastosowania zwraca kod 403. Odczytywanie ustawień, wersji i propozycji wymaga tylko uprawnienia POLICIES_READ.
- Klienci MCP, którzy łączą się za pomocą opcji Zaloguj się przez Nomid zamiast klucza API, wymagają zakresu mcp:policies:write.
Punkty końcowe
Wszystkie ścieżki są względne wobec bazowego adresu URL API i wymagają nagłówka X-API-Key. Ciała żądań są w formacie JSON.
| Metoda | Punkt końcowy | Opis |
|---|---|---|
| GET | /policies/{policyId}/settings | Edytowalne ustawienia zasady, każde z bieżącą wartością, dozwolonymi wartościami, grupą oraz informacją, czy jego zmiana ma wysoki wpływ. Zwraca również wersję zasady, deviceCount oraz informację, czy zasada jest edytowalna. |
| GET | /policies/{policyId}/revisions | Zapisane wersje zasady, od najnowszej, wraz z informacją, kiedy i przez kogo każda z nich została zapisana. Parametr limit jest opcjonalny, od 1 do 100, domyślnie 20. |
| GET | /policy-proposals/{proposalId} | Propozycja utworzona przez ten klucz, z listą zmian i statusem: PENDING, EXECUTING, SUCCEEDED, FAILED, UNCONFIRMED lub EXPIRED. |
| POST | /policies/{policyId}/changes | Zaproponuj zmiany ustawień w istniejącej zasadzie. Zwraca kod 201 wraz z propozycją. |
| POST | /policies | Zaproponuj nową zasadę jako kopię istniejącej, z opcjonalnymi zmianami ustawień. Bez zmian powoduje zduplikowanie zasady. Zwraca kod 201 wraz z propozycją. |
| POST | /policies/{policyId}/rollbacks | Zaproponuj przywrócenie zasady do wcześniejszej wersji. Zwraca kod 201 wraz z propozycją. |
| POST | /policy-proposals/{proposalId}/apply | Zastosuj oczekującą propozycję. Zwraca kod 200 wraz z propozycją i jej wynikiem: policyId, displayName, version oraz łączem do portalu. |
Treści żądań
Zmień ustawienia
| Pole | Wymagane | Opis |
|---|---|---|
| changes | Tak | Tablica obiektów z polami setting (identyfikator ustawienia) i value (jedna z dozwolonych wartości). Każde ustawienie co najwyżej raz. W wartościach wielkość liter nie ma znaczenia. |
Utwórz zasadę
| Pole | Wymagane | Opis |
|---|---|---|
| fromPolicyId | Tak | Zasada do skopiowania, według jej identyfikatora zasady (pathName). Kopia przejmuje jej aplikacje, ustawienia i ograniczenia. |
| displayName | Tak | Nazwa nowej zasady wyświetlana w portalu, maksymalnie 50 znaków. |
| changes | Nie | Zmiany ustawień do zastosowania w kopii, w tym samym formacie co powyżej. Pomiń, aby zduplikować zasadę. Żadne urządzenie nie używa nowej zasady, dopóki nie zostaną do niej przeniesione urządzenia. |
Cofnij zasadę
| Pole | Wymagane | Opis |
|---|---|---|
| revision | Tak | Numer wersji do przywrócenia, z punktu końcowego wersji. Opis, tagi i grupa zasady pozostają bez zmian. Jej nazwa powraca do nazwy z tej wersji, jeśli się różnią, co jest widoczne na liście zmian. |
Zastosuj propozycję
| Pole | Wymagane | Opis |
|---|---|---|
| confirmation | Dla WYSOKIEGO wpływu | Wymagane, gdy propozycja ma wartość requiresConfirmation ustawioną na true: nazwa zasady wpisana przez osobę zatwierdzającą zmianę. Dopasowanie ignoruje wielkość liter oraz otaczające spacje. |
Propozycja
Każdy punkt końcowy propozycji oraz punkty końcowe pobierania i stosowania zwracają propozycję. Najbardziej przydatne pola:
| Pole | Opis |
|---|---|
| proposalId | Identyfikator służący do odczytania lub zastosowania propozycji. |
| status | PENDING do momentu zastosowania oraz EXECUTING w trakcie stosowania zmian: żaden z nich nie jest stanem ostatecznym. Następnie SUCCEEDED lub FAILED, UNCONFIRMED, gdy nieoczekiwany błąd pozostawił wynik jako nieznany, lub EXPIRED, gdy upłynął czas expiresAt. |
| impact | NORMAL lub HIGH. Zobacz: Wpływ i potwierdzenie. |
| requiresConfirmation | Wartość true w przypadku propozycji o wpływie HIGH: zastosowanie wymaga pola confirmation. |
| fields | Lista zmian. Każdy wpis zawiera label (nazwę ustawienia), value (nową wartość) oraz previousValue (bieżącą wartość). |
| summary | Jedno zdanie opisujące zmianę, w tym liczbę urządzeń korzystających z polityki. |
| target | Polityka, którą modyfikuje propozycja: kind, id oraz name. |
| expiresAt | Kiedy propozycja wygasa. Po tym czasie nie można jej już zastosować. |
| result | Dotyczy tylko odpowiedzi na żądanie zastosowania: polityka w obecnym stanie, z policyId, displayName, version, komunikatem oraz portalUrl. |
Wpływ i potwierdzenie
Propozycja ma wpływ HIGH, gdy polityka obejmuje co najmniej jedno urządzenie i spełniony jest dowolny z poniższych warunków:
- Jest to wycofanie zmian.
- Zmienia ustawienie o dużym wpływie: aplikacje z nieznanych źródeł, Google Play Protect, przywracanie ustawień fabrycznych, opcje programisty, przesyłanie danych przez USB lub szyfrowanie pamięci masowej.
- Polityka obejmuje co najmniej 50 urządzeń, niezależnie od zmiany.
Wszystko inne ma status NORMAL, w tym każda nowa polityka, ponieważ żadne urządzenie jeszcze z niej nie korzysta.
Propozycje są przypisane do wersji polityki
Propozycja rejestruje wersję polityki, na podstawie której utworzono jej listę zmian. Jeśli polityka zostanie ponownie zapisana przed zastosowaniem propozycji – przez kogokolwiek i skądkolwiek – zastosowanie nie powiedzie się z kodem 409 i kodem stale_proposal, a nic nie ulegnie zmianie. Odczytaj politykę ponownie, zgłoś propozycję jeszcze raz i przejrzyj nową listę zmian.
Przykład: zgłoszenie propozycji i zastosowanie
Najpierw odczytaj bieżące ustawienia polityki, aby uzyskać identyfikatory ustawień i dozwolone wartości:
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
}
]
} Zaproponuj zablokowanie aparatu i przesyłania danych przez 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
} Skrócona odpowiedź. Przesyłanie danych przez USB jest ustawieniem o dużym wpływie, a polityka ma przypisane urządzenia, więc propozycja ma wpływ HIGH i wymaga potwierdzenia. Przed zastosowaniem propozycji pokaż listę zmian osobie odpowiedzialnej.
Gdy osoba ta zatwierdzi zmianę i wpisze nazwę polityki, zastosuj propozycję wraz z wpisaną przez nią wartością:
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."
}
} Skrócona odpowiedź. Urządzenia objęte polityką zastosują nowe ustawienia podczas kolejnej synchronizacji.
Gdy polityka zmieniła się w międzyczasie
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
} Edytowalne ustawienia
Oto identyfikatory ustawień akceptowane w zmianach wraz z ich dozwolonymi wartościami. Etykieta to nazwa zwracana przez API na liście zmian.
Podczas odczytu ustawień wartością może być także NOT_SET (pozostawiona urządzeniu lub domyślna dla Google) lub CUSTOM (wartość ustawiona w portalu, której te wartości nie mogą wyrazić). Żadnej z nich nie można wysłać, ale obie można zastąpić wartością dozwoloną.
| Ustawienie | Etykieta | Grupa | Dozwolone wartości | Wysoki wpływ |
|---|---|---|---|---|
| PLAY_STORE_MODE | Play Store mode | APPS | BLACKLIST, WHITELIST | Nie |
| DEFAULT_PERMISSION_POLICY | Default runtime permission policy | APPS | DENY, PROMPT | Nie |
| APP_AUTO_UPDATE_POLICY | App auto-update policy | APPS | ALWAYS, CHOICE_TO_THE_USER, NEVER, WIFI | Nie |
| UNTRUSTED_APPS_POLICY | Apps from unknown sources | SECURITY | ALLOW_INSTALL_IN_PERSONAL_PROFILE_ONLY, DISALLOW_INSTALL | Tak |
| PLAY_PROTECT | Google Play Protect app verification | SECURITY | ENABLED, USER_CHOICE | Tak |
| SCREEN_CAPTURE | Screen capture | RESTRICTIONS | ALLOW, BLOCK | Nie |
| CAMERA | Camera | RESTRICTIONS | ALLOW, BLOCK | Nie |
| FACTORY_RESET | Factory reset from Settings | RESTRICTIONS | ALLOW, BLOCK | Tak |
| UNINSTALL_APPS | Uninstalling apps | RESTRICTIONS | ALLOW, BLOCK | Nie |
| ACCOUNT_MODIFICATION | Adding or removing accounts | RESTRICTIONS | ALLOW, BLOCK | Nie |
| ADD_USER | Adding users | RESTRICTIONS | ALLOW, BLOCK | Nie |
| REMOVE_USER | Removing users | RESTRICTIONS | ALLOW, BLOCK | Nie |
| DEVELOPER_SETTINGS | Developer options and USB debugging | SECURITY | ALLOW, BLOCK | Tak |
| USB_DATA_ACCESS | USB data transfer | CONNECTIVITY | ALLOW, BLOCK | Tak |
| LOCATION_MODE | Location | LOCATION | DISABLED, ENFORCED, USER_CHOICE | Nie |
| LOCATION_SHARING | Sharing location | LOCATION | ALLOW, BLOCK | Nie |
| OUTGOING_CALLS | Outgoing calls | RESTRICTIONS | ALLOW, BLOCK | Nie |
| SMS | SMS | RESTRICTIONS | ALLOW, BLOCK | Nie |
| BLUETOOTH | Bluetooth | CONNECTIVITY | ALLOW, BLOCK | Nie |
| DATA_ROAMING | Data roaming | CONNECTIVITY | ALLOW, BLOCK | Nie |
| NETWORK_RESET | Network settings reset | CONNECTIVITY | ALLOW, BLOCK | Nie |
| VPN_CONFIGURATION | Configuring VPNs | CONNECTIVITY | ALLOW, BLOCK | Nie |
| CONFIGURE_WIFI | Configuring Wi-Fi networks | CONNECTIVITY | ALLOW, BLOCK | Nie |
| WIFI_DIRECT | Wi-Fi Direct | CONNECTIVITY | ALLOW, BLOCK | Nie |
| TETHERING | Tethering and hotspot | CONNECTIVITY | ALLOW, BLOCK | Nie |
| WIFI_STATE | Wi-Fi on or off | CONNECTIVITY | DISABLED, ENABLED, USER_CHOICE | Nie |
| AIRPLANE_MODE | Airplane mode | CONNECTIVITY | DISABLED, USER_CHOICE | Nie |
| MINIMUM_WIFI_SECURITY | Minimum Wi-Fi security | CONNECTIVITY | OPEN_NETWORK, PERSONAL_NETWORK | Nie |
| AUTO_DATE_TIME | Automatic date, time and time zone | RESTRICTIONS | ENFORCED, USER_CHOICE | Nie |
| ENCRYPTION_POLICY | Storage encryption | SECURITY | ENABLED_WITHOUT_PASSWORD, ENABLED_WITH_PASSWORD, UNSPECIFIED | Tak |
| APPLICATION_REPORT_LEVEL | Installed apps reporting | REPORTING | DISABLED, INSTALLED_AND_REMOVED_APPS, INSTALLED_APPS | Nie |
| REPORT_DEVICE_SETTINGS | Device settings reporting | REPORTING | DISABLED, ENABLED | Nie |
| REPORT_DISPLAY_INFO | Display information reporting | REPORTING | DISABLED, ENABLED | Nie |
| REPORT_HARDWARE_STATUS | Hardware status reporting | REPORTING | DISABLED, ENABLED | Nie |
| REPORT_MEMORY_INFO | Memory information reporting | REPORTING | DISABLED, ENABLED | Nie |
| REPORT_NETWORK_INFO | Network information reporting | REPORTING | DISABLED, ENABLED | Nie |
| REPORT_POWER_EVENTS | Power events reporting | REPORTING | DISABLED, ENABLED | Nie |
| REPORT_SOFTWARE_INFO | Software information reporting | REPORTING | DISABLED, ENABLED | Nie |
| REPORT_SYSTEM_PROPERTIES | System properties reporting | REPORTING | DISABLED, ENABLED | Nie |
Narzędzia MCP
Serwer MCP udostępnia te same operacje jako narzędzia. Przyjmują one te same argumenty co punkty końcowe REST, z policyId i proposalId jako argumentami zamiast segmentów ścieżki.
| Narzędzie | Uprawnienie | Opis |
|---|---|---|
| get_policy_settings | POLICIES_READ | Odczytaj edytowalne ustawienia zasad wraz z ich bieżącymi i dozwolonymi wartościami. |
| list_policy_revisions | POLICIES_READ | Wyświetl listę zapisanych wersji zasad, od najnowszej. |
| get_policy_proposal | POLICIES_READ | Odczytaj wniosek złożony przy użyciu tego samego klucza lub połączenia wraz z jego statusem. |
| update_policy_settings | POLICIES_WRITE + POLICIES_READ | Zaproponuj zmiany ustawień w istniejącej zasadzie. |
| create_policy | POLICIES_WRITE + POLICIES_READ | Zaproponuj nową zasadę jako kopię istniejącej, z opcjonalnymi zmianami ustawień. |
| rollback_policy | POLICIES_WRITE + POLICIES_READ | Zaproponuj przywrócenie zasady do wcześniejszej wersji. |
| apply_policy_proposal | POLICIES_WRITE + POLICIES_READ | Zastosuj oczekujący wniosek na podstawie jego identyfikatora proposalId, z potwierdzeniem, gdy ma on status HIGH impact. |
Asystent musi pokazać użytkownikowi listę zmian i uzyskać jego wyraźną zgodę w konwersacji, zanim wywoła apply_policy_proposal. W przypadku wniosku o statusie HIGH impact musi poprosić użytkownika o wpisanie nazwy zasady i przekazać dokładnie to, co wpisał.
Błędy
Po uwierzytelnieniu klucza API błędy używają formatu application/problem+json z dwoma dodatkowymi polami: code, czyli stałym identyfikatorem do rozgałęziania logiki, oraz retryable, który określa, czy to samo żądanie może zostać wysłane ponownie. Brakujący lub nieprawidłowy klucz powoduje zwrócenie wspólnej odpowiedzi 401, czyli małego obiektu JSON z polami error, message i status. Narzędzia MCP zwracają ten sam kod i komunikat jako błąd narzędzia.
| Status | Kod | Znaczenie |
|---|---|---|
| 400 | invalid_arguments | Treść jest nieprawidłowa: nieznane ustawienie, niedozwolona wartość, ustawienie wymienione dwukrotnie lub brakujące pole. Szczegóły (detail) wskazują, o co chodzi. |
| 403 | forbidden | Klucz nie ma uprawnień POLICIES_WRITE lub POLICIES_READ albo ustawienie firmowe Policy changes jest wyłączone. |
| 404 | not_found | Brak takiej zasady lub wersji widocznej dla tego klucza bądź brak wniosku o tym identyfikatorze złożonego przy użyciu tego klucza. |
| 409 | unsupported | Zasada nie może zostać zmieniona w ten sposób: nie jest zasadą systemu Android lub jest zarządzana przez Nomid. |
| 409 | not_pending | Propozycja nie ma już statusu PENDING. Odczytaj ją, aby sprawdzić jej status: jeśli to SUCCEEDED, zmiana została wprowadzona. Jeśli to EXECUTING, odczytuj ją ponownie, aż się zakończy. Jeśli to UNCONFIRMED, odczytaj ustawienia polityki przed ponownym zaproponowaniem. Jeśli to FAILED lub EXPIRED, zaproponuj ponownie. |
| 409 | stale_proposal | Polityka została zapisana po utworzeniu propozycji. Nic nie zostało zastosowane. Odczytaj politykę ponownie i zaproponuj ponownie. |
| 422 | refused | Żądanie nie może zostać zrealizowane: nic by się nie zmieniło, firma nie jest połączona z Android Enterprise lub nowa nazwa polityki nie może zostać użyta. |
| 422 | confirmation_required | Propozycja ma wpływ HIGH i brakuje potwierdzenia lub nie jest ono zgodne z nazwą polityki. Nic nie zostało zastosowane, a propozycja pozostaje oczekująca do czasu wygaśnięcia. |
| 429 | rate_limited | Zbyt wiele żądań zapisu dla tego klucza API lub połączenia. Nagłówek Retry-After oraz szczegóły podają liczbę sekund do odczekania. retryable ma wartość true. |
| 500 | internal_error | Nieoczekiwany błąd. Odczytaj propozycję przed ponowieniem próby: jeśli jej status to FAILED, zaproponuj ponownie. Jeśli to UNCONFIRMED, odczytaj ustawienia polityki, aby sprawdzić, czy zmiana została wprowadzona przed ponownym jej zaproponowaniem. |
Limity szybkości (Rate limits)
Każde wywołanie propose i apply wlicza się do limitu zapisu wynoszącego 10 żądań na minutę dla każdego klucza API lub połączenia Sign in with Nomid, współdzielonego z punktami końcowymi poleceń urządzeń, kodami QR do aprowizacji i narzędziami zapisu MCP. Wywołania odczytu nie wliczają się do tego limitu.
Wersje i wycofywanie zmian
Każda zastosowana zmiana zapisuje nową wersję polityki. Wyświetl listę wersji, aby zobaczyć, kto i kiedy zmienił politykę, oraz zaproponuj wycofanie, aby cofnąć zmianę.