Jamf School API for Deno
An unofficial, idiomatic API wrapper for Jamf School. Itâs designed to be easy for IT professionals with JavaScript experience to learn, and to be safe enough to trust in production.
If something doesnât work as expected or you just want some help, please raise an issue on GitHub. Bad documentation is a bug!
Currently, only a subset of API features are supported.
Hereâs the documentation for the latest release.
Features
- Designed for modern JavaScript
- A low-level API wrapper and a higher-level object-oriented interface
- Data validation means you always get the data youâre promised
- Comprehensive documentation and easy-to-follow example
- Only requires
--allow-net=YOUR_SCHOOL.jamfcloud.com
Usage
Hereâs how to get your API credentials. Youâll have to replace the token, ID, and URL in the examples.
This example will print the name of each registered device.
device_names.ts
import * as jamf from "https://deno.land/x/jamf_school@0.4.1/mod.ts";
const client = jamf.createClient({
id: "YOUR_NETWORK_ID",
token: "YOUR_API_TOKEN",
url: "https://YOUR_SCHOOL.jamfcloud.com/api",
});
// See the docs for everything clients can do.
const devices = await client.getDevices();
for (const device of devices) {
console.log(device.udid, device.name);
}
Now run that script.
deno run --allow-net=YOUR_SCHOOL.jamfcloud.com device_names.ts
Changelog
Each entry explains what changed and links to a pull request that has more details.
Version 0.4.1
Added
User.restartDevices()
(#73)
Users contain devices, so this makes the API more consistent.Fixed
DeviceGroup.restartDevices()
(#75)
The documentation claimed that failing to restart devices wouldnât throw, but it actually did.
Version 0.4.0
Added methods to edit a User/UserGroup/Device/DeviceGroup (#58, #61, #62)
Update multiple properties using anAPI
, or more easily with the respective objectsâset
methods.Added methods to set User/Device locations (#63, #66)
Move individual users and devices, or move in bulk withLocation
objects. Search the docs for âmoveâ or âlocationâ.Added
Client.getUserByUsername
(#58)
Usernames are inherently unique, so this makes it a reliable way to fetch users.Added
locationId
&ownerId
property to relevant objects (#66)
Makes it easier to use the objects and allows for better optimization.Added
DeviceGroup.restartDevices()
&Location.restartDevices()
(#70)
These methods make simple restart-scripts much easier to write, but they donât provide detailed results (failure to restart will not result in an exception).Renamed
API.assignDeviceOwner
(#58)
Now itâs more consistent:API.setDeviceOwner
Relaxed signature of
Client.getDevicesInGroups
(#58)
The only property of theDeviceGroup
objects used wasid
, and this update is aiming to make this style general.Improved how objects are displayed in the console (#60)
console.log(someDevices)
no longer results inDevice {}
! Indentation doesnât work properly due to some internal Deno stuff.Breaking: Methods that returned
Promise<this>
now returnPromise<void>
(#68)
Returningthis
is unexpected and encourages worse code than returning nothing at all.
Older versions
Version 0.3.2
- Improved the implementation of
Device.enrollment
(#56)
This should be marginally faster. The âmanualâ type now also includes apending
property (currently alwaysfalse
).
Version 0.3.1
Added
Device.enrollment
(#53)
Itâs an object instead of a string. See the docs for more information.Added
Client.getUserByName
(#53)
Returns null if there are no users with the name, fails if multiple users have it.
Version 0.3.0
Added support for apps (#15)
This includesClient.getApps
,Client.getAppsById
, andDevice.getApps
. See the documentation for more information (theApp
interface).Added support for locations (#40)
Locations can get the data that belongs to them, and all objects can now get their location.Specified the behaviour of toString and toJSON methods (#49)
These methods can now be used reliably now that their behaviour is consistent and obvious.
Version 0.2.1
- Suggest identifiers for APIGetDevicesOptions.modelIdentifier (#34)
This uses the list curated in SeparateRecords/apple_device_identifiers to suggest strings, and still allows any string to be assigned to the property.
Version 0.2.0
Breaking: Changed how clients are instantiated with an API (#8)
TheAPI
object must now be passed in as anapi
property on an object.Added methods to set device ownership (#10, #16)
API.assignDeviceOwner
andDevice.setOwner
. The documentation contains examples.Various schema improvements and corrections (#10, #20)
More data is now included. To the best of my knowledge, the current schemas are complete.Schemas donât fail when additional properties are returned (#19)
Release builds of schemas are now resilient against additional properties being added, but will still fail if any required properties are omitted.Handle authentication errors with a better message (#24)
Previously, authentication errors were lumped in with other errors, which made them confusing to read.Changed how data is validated (#7)
Technical change, but a good increase in real-world performance.
Version 0.1.0
- Initial release
Includes basic API support for devices, device groups, users, and user groups, as well as an object-oriented layer to simplify using the API.
License and Disclaimer
JAMF is a trademark beloning to JAMF Software, LLC. This projectâs development is not affiliated with JAMF Software, LLC.
There is a copy of the projectâs license (MIT) located in the root of the repository and in the module entrypoint (mod.ts).