Back to All Cheatsheet Libraries cheatsheets

SimpleMDM

Lightweight, API-first Apple device management with built-in Munki hosting — built for small teams who would rather script than click.

Deliberately less product

SimpleMDM's design goal is to be understandable in an afternoon. It covers Apple device management — enrollment, profiles, apps, scripts, patching — with a clean REST API and without the configuration surface of Jamf. If your requirements are mainstream and you'd rather automate than click, this is a strong fit. If you need deep custom scoping logic, it isn't.

Object What it is Notes
Device GroupThe primary unit of organisation. Profiles, apps, and scripts are assigned to groups.Assignment is group-centric rather than criteria-driven — closer to a folder than a Jamf Smart Group.
Assignment GroupBinds a set of apps to a set of devices, with optional auto-install and auto-update.The main app-deployment mechanism. Enable auto-update so apps stay current without policies.
Configuration ProfileStandard Apple payloads, either built in the console or uploaded as custom .mobileconfig.Custom profile upload is well supported — the escape hatch for anything the GUI doesn't expose.
Custom AttributeA key/value field on a device, settable via API or script.Can be referenced as a variable inside profiles — how you template per-device values like a hostname or asset tag.
ScriptShell script run on macOS devices, on demand or on a schedule.Straightforward. No extension-attribute-style feedback loop into dynamic grouping.
Munki integrationBuilt-in Munki catalogue hosting for third-party app deployment.A genuine differentiator — you get Munki's power without hosting a repo yourself.
EnrollmentADE (zero-touch) via ABM, or one-time enrollment URLs/QR for existing devices.Per-enrollment limits and expiry are configurable, which is handy for controlled rollouts.

The API is the reason to choose it

SimpleMDM's REST API is clean, well documented, and uses plain HTTP Basic auth with your API key as the username. If your instinct is to script fleet operations rather than click through a console, this is where the product earns its place.

Task Example Notes
List devicescurl -u $API_KEY: https://a.simplemdm.com/api/v1/devicesNote the trailing colon — the key is the username, password is empty.
Get one devicecurl -u $API_KEY: .../api/v1/devices/<id>Returns full inventory including OS version, model, and custom attributes.
Push an update / lock / wipecurl -X POST -u $API_KEY: .../api/v1/devices/<id>/lockLifecycle commands are all simple POSTs. Wipe is irreversible — guard it in any script.
Set a custom attributecurl -X PUT -u $API_KEY: .../api/v1/devices/<id>/custom_attribute_values/<name> -d "value=X"How you feed external data (HR system, asset DB) into device records.
List/assign appscurl -u $API_KEY: .../api/v1/appsAssignment groups are also fully API-manageable.
Pagination?limit=100&starting_after=<id>Cursor-based. Loop until has_more is false rather than assuming one page.

A practical example — flag every Mac that hasn't checked in for 30 days, for an offboarding audit:

#!/bin/bash # Requires: SIMPLEMDM_API_KEY in the environment, plus jq CUTOFF=$(date -v-30d +%s 2>/dev/null || date -d '30 days ago' +%s) NEXT="" while :; do URL="https://a.simplemdm.com/api/v1/devices?limit=100${NEXT}" RESP=$(curl -sS -u "$SIMPLEMDM_API_KEY": "$URL") echo "$RESP" | jq -r --argjson cutoff "$CUTOFF" ' .data[] | select((.attributes.last_seen_at // "1970-01-01T00:00:00Z" | fromdateiso8601) < $cutoff) | "\(.id)\t\(.attributes.name)\t\(.attributes.last_seen_at)"' [ "$(echo "$RESP" | jq -r '.has_more')" = "true" ] || break LAST=$(echo "$RESP" | jq -r '.data[-1].id') NEXT="&starting_after=${LAST}" done
SimpleMDM fits well when…
  • You manage roughly 10–500 Apple devices with mainstream requirements.
  • Nobody's job title is "Mac admin" — the product is genuinely learnable without training.
  • You'd rather express fleet operations as scripts against a clean API than as console configuration.
  • You want Munki's third-party app management without running a Munki repo.
  • Predictable per-device pricing matters more than feature maximalism.
Look elsewhere when…
  • You need criteria-driven dynamic grouping that recalculates from collected inventory — that's Jamf's Smart Group model and SimpleMDM doesn't match it.
  • You have Windows or Android in scope. SimpleMDM is Apple-only; see Hexnode or Intune.
  • You need bundled endpoint security and identity — Mosyle Fuse packages those.
  • You're running thousands of devices with complex delegated administration.

Gotchas

Apple's annual certificate expiries apply here too
  • APNs push certificate: expires every 12 months. Renew with the same Apple ID or re-enroll everything.
  • ABM/ADE and VPP tokens also expire annually.
  • This is an Apple constraint shared by every MDM — not something a simpler product avoids.
API keys are full-access credentials
  • A SimpleMDM API key can wipe devices. Treat it exactly like a production secret.
  • Store it in a secret manager or environment variable — never commit it to a repo or paste it into a shared doc.
  • Rotate on staff changes, and use separate keys per integration so one can be revoked without breaking the others.
Secure Token / Bootstrap Token still bite on Apple silicon
  • Platform-level Apple behaviour: a user needs a Secure Token for FileVault and OS updates.
  • Ensure the Bootstrap Token escrows to SimpleMDM, or MDM-driven FileVault enablement fails on tokenless accounts.
  • Check with profiles status -type bootstraptoken on the device.
PPPC profiles are still mandatory
  • Full Disk Access, Screen Recording, and Accessibility can only be pre-approved by an MDM-delivered PPPC profile.
  • Build one with PPPC Utility and upload it as a custom profile — you need the app's bundle ID and code requirement.

Resources