Jamf Developers
Group Hub Activity
The Jamf Marketplace was launched in 2017 during JNUC to share ways of extending what you can do with your Jamf environment. Since the launch, we have over 300 listings from software organizations, ISV’s and developers.
Did you know?
We have a global team of Partner Managers that work with organizations and developers from across the world!
Do you have a suggestion/favourite integration that you'd like to see on our Marketplace?
Please add your suggestion in the comments and we'll do our best to work with them to get them added.
See below for the latest new Listings added in May 2025:
Cyberhaven
Trelica by 1Password
Manifesto
... View more
While the API Changelog provides a great deep dive into the specific changes to the Jamf Pro API for each release, we’d like to start introducing an easier to read, high level overview of the API changes you’ll find in each version.
Additions and Updates
DigiCert Trust Lifecycle Manager Integration
A new suite of endpoints has been added to support DigiCert ONE Trust Lifecycle Manager integration, allowing for better PKI certificate management:
Create and validate client certificates
Manage trust lifecycle configurations
Monitor connection status
Update and remove configurations
New Computer Inventory Endpoint
Added a new POST endpoint which allows for the creation of computer records /v1/computers-inventory
IP Address Reporting Improvements
The API now provides better IPv4/IPv6 support across computer inventory endpoints:
Deprecated the generic lastReportedIp field
Added separate lastReportedIpV4 and lastReportedIpV6 fields
New filtering capabilities for both IPv4 and IPv6 addresses
Mobile Device Inventory Enhancements
Added new fields across mobile device inventory endpoints:
preferredVoiceNumber - for better contact management
unlockToken - for device security management
New sorting and filtering options for these fields
MDM Command Updates
The CLEAR_PASSCODE command can now be issued via the Jamf Pro API
Volume Purchasing Updates
Volume purchasing location endpoints now include:
New email field
Ability to filter by email address
Support for viewing and updating email information
🗑️ Removals & Deprecations
Prestage Enrollment Changes
Several prestage enrollment endpoints have been removed:
Computer prestage endpoints (v1 and v2)
Mobile device prestage endpoints including:
Scope management
Sync operations
Attachment handling
History tracking
Note: If you're using any of the removed prestage enrollment endpoints, you'll need to update your integration to use the latest versions of these endpoints within the Jamf Pro API.
Let us know if this format is helpful or if you have recommendations on how changes to Jamf APIs can be better communicated in an effective manner that meets your needs.
... View more
Hello Jamf Nation Developers! Today we’re going to explore how Application & Custom Settings provide benefits for both application vendors and Jamf administrators.
Why Application & Custom Settings Matter
Application & Custom Settings represents a significant advancement in macOS application management, offering benefits for both vendors and administrators.
For Administrators
Streamlined Configuration: A user-friendly GUI for managing application settings directly within Jamf Pro
Simplified Deployment: Automatically deploy standardized configurations across your entire fleet
Reduced Complexity: No more managing external plists or complex preference files
Centralized Management: Configure all supported applications from one consistent interface
For Vendors
Enhanced User Experience: Provide a seamless configuration experience for your enterprise customers
Reduced Support Overhead: Standardized deployment means fewer configuration-related support tickets
Greater Enterprise Appeal: Make your app more attractive to enterprise customers with professional-grade management capabilities
Future-Proof Integration: Align with Apple's modern management approaches similar to iOS App Config
How It Works
The technology allows vendors to provide a JSON schema that transforms complex application preferences into an intuitive GUI within Jamf Pro. Administrators can then easily configure these settings through configuration profiles, ensuring consistent deployment across their environment.
Pro Tip: This approach is particularly valuable for applications with complex configuration requirements or applications that require frequent changes to preference configurations.
Call to Action
We'd love to hear from the community:
For Administrators: Which applications do you wish had official Application & Custom Settings support? Share your top applications below, and we'll help amplify these requests to vendors.
For Vendors: If you're interested in implementing Application & Custom Settings support for your application, Jamf's developer resources provide comprehensive documentation to get you started. Your customers will thank you!
Together, we can help drive adoption of this powerful technology and make macOS application management even better for everyone in our community.
Note to vendors: If you're interested in getting your application listed in the Jamf Repository with Application & Custom Settings support, contact your Technology Partner Manager for guidance and resources.
... View more
Hello Jamf Nation! Today we’ll be diving into the recent deprecation of the computers inventory endpoints in the Classic API. This guide will help you transition your existing code to use the new Jamf Pro API computer inventory endpoints, which offer enhanced capabilities including sorting, filtering, and pagination.
Key Differences
Endpoint Structure
Classic API: /JSSResource/computers
Jamf Pro API: /api/v1/computers-inventory
Data Format
Classic API:
XML-based requests and responses (default)
JSON responses available but XML required for PUT/POST
Jamf Pro API:
JSON-based for all operations
More structured and consistent data types
Clearer property naming conventions
New Features in Jamf Pro API
1. Section-Based Data Retrieval
The Jamf Pro API allows you to request specific sections of computer data. If no section parameter is supplied, only the “General” section will be returned, with other sections including a null value. If the data you’re looking for is missing, make sure to specify the corresponding section within the request.
GET /api/v1/computers-inventory?section=GENERAL§ion=HARDWARE
You can also provide a list of sections for using commas to separate the values. The following request is equivalent to the one above and saves some characters. Saving characters can be important if you're using a complex RSQL filter.
GET /api/v1/computers-inventory?section=GENERAL,HARDWARE
For a full list of the sections available, check out the API reference documentation on the Developer Portal.
2. RSQL Filtering
The Jamf Pro API supports powerful RSQL filtering. Some of the existing capabilities in the Classic API, such as the ability to obtain a device via serial number have been maintained via RSQL filtering. Check out the examples below, and see our full guide on filtering with RSQL here.
# Find computers by serial number
GET /api/v1/computers-inventory?filter=hardware.serialNumber=="C02L29ECF8J1"
# Find computers by udid
GET /api/v1/computers-inventory?filter=udid=="6ac0ea2a-b4ff-4fe7-93d5-eccdd14bb1a3"
# Complex filtering with multiple conditions
GET /api/v1/computers-inventory?filter=general.name=="*Lab*";hardware.make=="Apple"
3. Pagination
Forget the days of needing to iterate over every device one API request at a time. Pagination allows you to control result size and navigate through large datasets with ease. Default page size is 100, but can be customized to a maximum of 2000 results per page. If no page or page-size parameter are provided, the first 100 results will be returned.
GET /api/v1/computers-inventory?page=0&page-size=100
4. Sorting
When working with large datasets, make sure to use the same sorting preferences throughout all requests. Changing the sorting preferences will change which data results are returned on which page, creating opportunities for missing results. See the example below to sort results using multiple criteria:
GET /api/v1/computers-inventory?sort=general.name:asc,general.reportDate:desc
Code Example: Obtaining Computer Inventory Data via Jamf Pro API
Below we’ve constructed a sample Python script which models many of the basic functions needed to work with the Jamf Pro API, including how to handle authentication, pagination and section query parameters.
#!/usr/bin/env python3
import requests
import json
from typing import List, Dict, Any
from urllib.parse import urljoin
class JamfProAPI:
def __init__(self, url: str, username: str, password: str):
"""
Initialize the Jamf Pro API client
Args:
url: Jamf Pro URL (e.g., 'https://your.jamf.server')
username: API username
password: API password
"""
self.base_url = url.rstrip('/')
self.username = username
self.password = password
self.token = None
def authenticate(self) -> None:
"""Authenticate and get bearer token"""
auth_url = urljoin(self.base_url, '/api/v1/auth/token')
response = requests.post(
auth_url,
auth=(self.username, self.password),
headers={'Accept': 'application/json'}
)
response.raise_for_status()
self.token = response.json()['token']
def get_computers_inventory(self, sections: List[str] = None, page: int = 0,
page_size: int = 100) -> Dict[str, Any]:
"""
Retrieve computer inventory data with pagination and optional section filtering
Args:
sections: List of sections to retrieve (e.g., ['GENERAL', 'HARDWARE'])
If None, returns GENERAL section by default
page: Page number (0-based)
page_size: Number of records per page (default 100, max 2000)
Returns:
Dict containing results and total count
"""
if not self.token:
self.authenticate()
endpoint = '/api/v1/computers-inventory'
url = urljoin(self.base_url, endpoint)
# Build query parameters
params = {
'page': page,
'page-size': page_size
}
# Add sections if specified
if sections:
for section in sections:
params['section'] = sections
headers = {
'Accept': 'application/json',
'Authorization': f'Bearer {self.token}'
}
response = requests.get(url, headers=headers, params=params)
response.raise_for_status()
return response.json()
def get_all_computers(jamf: JamfProAPI, sections: List[str] = None) -> List[Dict[str, Any]]:
"""
Retrieve all computers by handling pagination automatically
Args:
jamf: Initialized JamfProAPI instance
sections: List of sections to retrieve
Returns:
List of all computer records
"""
all_computers = []
page = 0
page_size = 100
while True:
# Get page of results
response = jamf.get_computers_inventory(sections=sections,
page=page,
page_size=page_size)
# Add results to master list
computers = response.get('results', [])
all_computers.extend(computers)
# Check if we've retrieved all records
total_count = response.get('totalCount', 0)
if len(all_computers) >= total_count:
break
# Move to next page
page += 1
return all_computers
def main():
# Example usage
jamf_url = 'https://your.jamf.server'
username = 'your-username'
password = 'your-password'
# Initialize API client
jamf = JamfProAPI(jamf_url, username, password)
# Example sections to retrieve
sections = [
'GENERAL',
'HARDWARE',
'OPERATING_SYSTEM',
'USER_AND_LOCATION'
]
try:
# Get all computers with specified sections
computers = get_all_computers(jamf, sections=sections)
print(f"Retrieved {len(computers)} computers")
# Example: Print some basic info for each computer
for computer in computers:
general = computer.get('general', {})
print(f"Name: {general.get('name')}")
print(f"Serial: {general.get('serialNumber')}")
print(f"Last Check-in: {general.get('lastContactTime')}")
print("---")
except requests.exceptions.RequestException as e:
print(f"Error accessing Jamf Pro API: {e}")
if __name__ == '__main__':
main()
Benefits of Using the Jamf Pro API
Better Performance: Request only the sections you need
Flexible Filtering: Complex queries using RSQL
Efficient Pagination: Handle large datasets more effectively
Consistent JSON: Modern data format with well-defined schemas
Future-Proof: All new features will only be available in the Jamf Pro API
Best Practices
Use RSQL filters instead of separate endpoints for different lookup types
Request only needed sections to improve performance
Implement pagination for large data sets
Use sorting to maintain consistent data ordering
Test thoroughly during migration to ensure data consistency
Additional Resources
Jamf Pro API Documentation
RSQL Filtering Guide
API Deprecation Documentation
Remember to test your code thoroughly when migrating from the Classic API to the Jamf Pro API, as there are significant differences in data structure and response formats. The new API provides more powerful and flexible ways to interact with computer inventory data while improving performance and maintainability.
Need more help getting started with your scripts? Ask the AI assistant! The sample code included above was generated by the Jamf AI assistant which can help you update your code as well. Please share any feedback, questions, or your own experiences around the migration to the Jamf Pro API.
... View more
The Jamf Marketplace was launched in 2017 during JNUC to share ways of extending what you can do with your Jamf environment. Since the launch, we have over 300 listings from software organizations, ISV’s and developers.
We add a new Marketplace listing almost every week, so each month, we’ll update you with the latest new listings that been launched in the past 30 days.
See below for the latest new Listings added in April 2025:
Zscaler Posture Check
AWS Private CA
Jamf AD CS Connector
VAULT
Did you know that you can leave a review on your favourite Marketplace listings?
Head to the listing on the Marketplace
Click on “Ratings and Reviews”
Click “Write a Review”
The Jamf Marketplace is now embedded into Jamf Pro
We’ve created a preview of some of the featured and latest listings of the Jamf Marketplace into Jamf Pro. To see them, click on “Jamf Marketplace” from the Resource Center.
Log into Jamf Pro
Click on the Resource Center (icon in the lower right corner)
Click on Jamf Marketplace
... View more