What it does • Requirements • Installation • Quick Start • Tabs Overview • Wiki • License
Sync AppleCare warranty coverage from Apple Business Manager (ABM) or Apple School Manager (ASM) into Jamf Pro — across multiple environments, in four steps, on one Mac.
AxM Jamf Sync runs a four-step pipeline on demand:
| Step | What happens |
|---|---|
| 1 — AxM Devices | Downloads every device record from your ABM or ASM organisation |
| 2 — Jamf Inventory | Downloads computers and mobile devices from Jamf Pro |
| 3 — AppleCare Coverage | Fetches warranty and AppleCare status from Apple's coverage API |
| 4 — Jamf Update | Writes warranty date, AppleCare agreement number, vendor, PO number, and PO date back to each matching Jamf record |
The result: every device record in Jamf Pro shows accurate, up-to-date warranty and purchasing information pulled straight from Apple — no spreadsheets, no manual entry.
v2.2 introduces a serial sync queue so multiple environments sync unattended without risk of parallel Apple API calls.
- Sync All button in the sidebar — select environments, add them to the queue, walk away
- Run Sync on any environment enqueues rather than triggering immediately — waits its turn if another sync is running
- In Queue state shown on the button while waiting
- Stop & Save and Cancel All controls in the queue progress banner, both with confirmation dialogs
- Browse Dashboard, Devices, and Export freely on any environment while the queue runs on another
v2.1 surfaces MDM server assignment throughout the app — device list badges, filter dropdown, detail panel, dashboard card, CSV export, and sync log. Devices in AxM but not enrolled in any MDM server are marked Unassigned.
v2.0 introduces Environments — fully isolated configurations for MSPs or admins who manage multiple Apple/Jamf tenants.
Each environment has its own:
- ABM or ASM credentials (Keychain-isolated per environment)
- Jamf Pro credentials and server URL
- Device cache (separate SQLite database)
- Sync preferences and timestamps
- Log file
Switch environments instantly from the sidebar. Existing v1 data migrates automatically into a "Default" environment on first launch — no cache wipe required.
- macOS 14.0 (Sonoma) or later
- Apple Business Manager or Apple School Manager with API access
- Jamf Pro (cloud or on-prem) with an OAuth API client
- An Apple API private key (
.pemfile) from ABM/ASM
This app was developed with the help of AI agents. Please test thoroughly before using in production. Submit bugs and feature requests in the Issues section.
- Download
AxMJamfSync.dmgfrom the Releases page - Open the DMG and drag AxM Jamf Sync to Applications
- Launch — it is signed and notarized, Gatekeeper opens it without warnings
git clone https://github.com/karthikeyan-mac/AxMJamfSync.git
cd AxMJamfSync
open AxMJamfSync.xcodeprojSelect your team in Signing & Capabilities, then build with ⌘B.
- Sign in to business.apple.com or school.apple.com
- Go to Settings → API → click + to create a new key
- Download the
.pemfile — Apple only lets you download it once - Note the Client ID and Key ID
- Go to Settings → API Roles and Clients
- Create a Role with: Read Computers, Read Mobile Devices, Update Computers, Update Mobile Devices
- Create a Client, assign the role, generate a Client Secret
- Launch the app — your setup opens in the sidebar as Default
- In Setup → Apple Manager, enter your Client ID and Key ID, load your
.pemfile - Tick Save to Keychain and click Test Auth — green ✓
- In Setup → Jamf Pro, enter URL, Client ID, and Client Secret
- Tick Save to Keychain and click Test Auth
Go to the Sync tab and click Run Sync.
Click Sync All in the sidebar header, select the environments you want, and click Add to Queue. Syncs run one at a time in order — browse freely while the queue runs.
Click + in the sidebar, give it a name, and configure separate credentials in Setup. Each environment is fully isolated.
Full guides: Project Wiki
| Tab | Purpose |
|---|---|
| Setup | Credentials, cache settings, sync options |
| Sync | Run, monitor, and stop syncs; view the live log |
| Dashboard | Device counts, coverage breakdown, ring chart, last-run stats |
| Devices | Searchable, filterable table of every device |
| Export | CSV export with presets and configurable columns |
- No data leaves your Mac except to Apple's ABM/ASM API and your own Jamf Pro server
- All credentials stored in the macOS Keychain (
kSecAttrAccessibleWhenUnlockedThisDeviceOnly), namespaced per environment - TLS certificate validation enforced on every connection
- JWT client assertions use ES256 with a 10-minute lifetime
- Log files written to
~/Library/Logs/AxMJamfSync/with0600permissions - Fully App Sandboxed
- Caching — device list cached 1 day, coverage 7 days by default. Second run same day skips re-downloading unless Force Refresh is enabled
- Sync Device Types — choose Mac + Mobile (default), Mac Only, or Mobile Only
- Coverage Fetch Limit — cap Apple API calls per run; next run resumes exactly where the last stopped
- Do Not Refetch — skip devices already checked, reducing API calls significantly
- Purchasing fields — PO Number, PO Date, and Vendor (formatted as
"purchaseSourceType (purchaseSourceId)") are written to Jamf alongside warranty data - External change detection — if warranty date, vendor, PO number, or PO date are edited in Jamf after a sync, the next run re-queues those devices automatically
- Serial sync queue — all syncs run serially; clicking Run Sync while another environment is syncing adds it to the queue rather than running in parallel
| Problem | What to check |
|---|---|
| Test Auth fails for ABM/ASM | Confirm Client ID, Key ID, and .pem file match the key in ABM/ASM |
| Test Auth fails for Jamf | No trailing slash on URL; confirm API client hasn't expired |
| Coverage shows 0 fetched | Check ABM/ASM has the correct records; confirm API key not revoked |
| Jamf Update all Failed | Confirm API Role includes Update Computers / Update Mobile Devices |
| In Both count is 0 | Run a full sync (Step 1 + Step 2) so devices can be matched by serial |
| App won't open (Gatekeeper) | Right-click → Open on first launch, or download the signed release |
Full log: Help → Open Sync Log in Console or ~/Library/Logs/AxMJamfSync/
AxMJamfSync/
├── Models.swift — Data types, enums, Device struct
├── AppStore.swift — @MainActor state, CoreData CRUD, filtering
├── AppPreferences.swift — UserDefaults (env-namespaced in v2)
├── PersistenceController.swift — CoreData stack, per-environment SQLite
├── KeychainService.swift — Keychain CRUD, env-namespaced credentials
├── ABMService.swift — Apple ABM/ASM API (devices + coverage)
├── JamfService.swift — Jamf Pro API (computers + mobile + PATCH)
├── SyncEngine.swift — 4-step pipeline orchestration
├── LogService.swift — Per-environment log (UI + rotating file)
├── EnvironmentStore.swift — Multi-environment management + sync queue (v2)
├── ContentView.swift — NavigationSplitView root
├── EnvironmentSidebarView.swift — Environment sidebar + Sync All button (v2)
├── SetupView.swift — Credentials + settings UI
├── SyncPanelView.swift — Sync progress and live log
├── DashboardView.swift — Stats tiles and coverage ring chart
├── DevicesView.swift — Device table with filtering
└── ExportView.swift — CSV export with presets
MIT — see LICENSE
- Apple — SwiftUI framework
- Jamf — Jamf Pro API documentation
- Mac Admins India — https://macadmins.in/
- Jamf Nation Community — Feedback and feature requests
- AI — ChatGPT & Claude
AxM Jamf Sync is not affiliated with, endorsed by, or sponsored by Jamf Software LLC. Jamf and Jamf Pro are trademarks of Jamf Software LLC.




