Before you begin
- Admin access to Unbound and Jamf Pro.
- macOS 13 or later, 300 MB free. Older Macs use the Python installer.
- HTTPS allowed to
getunbound.ai,unbound-release-artifacts.s3.us-west-2.amazonaws.com, and the hosts after--backend-urland--gateway-urlin your command.
1. Copy the command
Sign in to your Unbound dashboard and open Configure — on a dedicated deployment that is your own address, notgateway.getunbound.ai. Select My org (MDM), then the macOS tab, and copy the command. It looks like this, with your own key and URLs:
YOUR_ADMIN_API_KEY is your admin API key: one key covers the whole fleet, and each Mac uses it to fetch its own device key. It arrives filled in, so paste the command exactly as copied.
If the command starts with
sudo python3, follow the Python installer page instead.2. Create the policy
Computers → Policies → New1
General
Name it
Unbound daily onboard, tick Enabled, set Trigger to Recurring Check-in and Execution Frequency to Once every day.2
Files and Processes
Select Files and Processes → Configure, then paste the command into Execute Command as a single line.
3
Scope
Add one test Mac, then Save.
Anyone who can open the policy can read the API key it contains, so limit who can edit policies in Jamf.
3. Test, then roll out
On the test Mac, runsudo jamf policy -id POLICY_ID, where POLICY_ID is the number after id= in the policy’s URL. The first run takes a few minutes and ends with unbound-hook setup summary, every tool marked configured.
Then confirm both:
Jamf
Computers → [the Mac] → History → Policy Logs shows Completed.
Unbound
In your Unbound dashboard, the Mac appears under Settings → Devices, and its Last Sync on AI Tools Discovery is recent.
Command flags
You do not need to edit the command. This is what it carries.Troubleshooting
A failed run printsUNBOUND_INSTALL_FAILED step=<step> code=<n> in the policy log.
Remove Unbound
Disable the policy or remove the Macs from its scope, then run:UNBOUND_CLEAR_OK. To also delete what it leaves behind:
Deploy the package from your own Jamf
Use this when your security policy does not allow downloading software at install time. You verify the signed package once and host it in Jamf. Macs download nothing from Unbound when they install it.1
Download
From the latest release, download
unbound-runtime-<version>.pkg, unbound-runtime-<version>.pkg.sha256, jamf-setup.sh and jamf-setup.sh.sha256.2
Verify the downloads
Developer ID Installer: Websentry Inc (ZMA55FTA8W) and Notarization: trusted by the Apple notary service. spctl must print accepted and source=Notarized Developer ID. These two checks prove the package comes from Unbound unmodified. The hash files come from the same release, so they only catch a corrupted download: the two package hashes must match, and the script check must print jamf-setup.sh: OK.3
Upload to Jamf
In Settings → Computer management → Packages, upload the package. In Settings → Computer management → Scripts, create a script named
Unbound setup and paste the contents of jamf-setup.sh. Read it before you upload it. That is how you confirm the script, since its hash file comes from the same release. It is short, runs the installed runtime and downloads nothing. Its only network call reports the install result to your backend.Wait until the package no longer shows Availability pending before you run the policy. If it stays pending for more than an hour, delete it and upload it again.4
Create the policy
Computers → Policies → New. Set Trigger to Recurring Check-in and Execution Frequency to Once per computer. Add the package with the Install action. Add the
Unbound setup script with Priority set to After, and fill in its parameters from the command in Configure:Leave 5 and 8 empty. Test on one Mac as in step 3.
Jamf stores the API key in the policy and passes it to the script on each Mac, so anyone who can view the policy can read it. Limit who can view and edit policies in Jamf.
Unbound setup script, the same parameters, and Once every day.
Macs installed this way do not update on their own. When a new release ships, verify the new package, replace it in the policy, and Flush the policy logs so each Mac installs it once.
To remove Unbound, run the Unbound setup script with parameter 8 set to clear. No key is needed. It prints UNBOUND_CLEAR_OK.
What gets installed
Before installing, the installer checks the package against a pinned SHA-256 hash and confirms it is signed by Unbound’s Developer ID, Team IDZMA55FTA8W.
Files and services on each Mac
Files and services on each Mac
The discovery service scans the Mac on install and every twelve hours after that. Confirm it is running with
sudo launchctl print system/ai.getunbound.discovery.The package receipt is ai.getunbound.runtime. Use it to build a Jamf Smart Group, or run pkgutil --pkg-info ai.getunbound.runtime to check the installed version.Tamper Resistance
Keeping Unbound active on every device with managed settings.

