Jamf Developers
Group Hub Activity
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
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 name containing specific text
GET /api/v1/computers-inventory?filter=general.name=="*MacBook*"
# 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
Hello Jamf Nation Developers!
I'm excited to share how you can use Jamf's AI assistant to supercharge your development workflow when working with Jamf APIs, webhooks, and other developer tools. Whether you're new to Jamf development or an experienced integrator, this AI tool can help streamline your development process.
What Can the AI Assistant Help With?
1. API Development Support
Get guidance on both Classic API and Jamf Pro API implementations
Receive help with API authentication and token management
Get explanations of API endpoints and their parameters
Troubleshoot common API response codes and errors
Generate sample API requests and payloads
2. Webhook Integration
Understand webhook configuration and setup
Get help implementing webhook consumers
Explore event-driven workflow possibilities
Debug webhook-related issues
3. Development Tools & Frameworks
The AI can guide you through using various development tools, including:
Chook - Ruby framework for webhook event handling
Jamf Pro SDK for Python
JAWA (Jamf Automation and Workflow Assistant)
Jamf Pro Actions for Apple Shortcuts
Real-World Applications
The AI can assist with practical development scenarios such as:
Setting up automated device enrollment workflows
Creating custom reporting integrations
Implementing real-time inventory sync with other systems
Building automated compliance checking systems
Developing custom admin tools
Development Best Practices
The AI can provide guidance on:
API security best practices
Error handling and logging
Rate limiting and performance optimization
Testing and validation approaches
Documentation standards
Getting Started
To leverage the AI assistant for your development needs:
Ask Specific Questions: The more specific your question, the more detailed and helpful the response will be. Example: "How do I structure a webhook payload for device enrollment events?"
Share Context: Include relevant details about your development environment and goals. Example: "I'm building a Python script to sync device inventory with ServiceNow..."
Iterate: The AI can help refine your code and approach through multiple iterations.
Available Resources
The AI can point you to:
Official API documentation at http://developer.jamf.com
Code samples and example implementations
Community-contributed tools and frameworks
Relevant JNUC session recordings
Integration guides and tutorials
Pro Tip: When working with webhooks, consider using the AI to help you set up a testing environment using tools like Chook or the Jamf Pro SDK for Python to speed up your development cycle.
Ongoing Support
Remember that the AI assistant is continuously updated with:
Latest API documentation
New feature implementations
Best practices and common patterns
Community-sourced solutions
Get Started Today
Whether you're building your first Jamf integration or optimizing an existing one, the AI assistant is here to help accelerate your development process. Start by asking a question about your current development challenge! More details on how to access the AI assistant can be found here.
Note: While the AI is a powerful tool for development assistance, always validate critical implementations against official documentation and test thoroughly in a non-production environment.
Did you know that the AI assistant was used to generate some of the documentation on the Jamf Developer Portal? Share your experiences using the AI assistant for your Jamf development projects in the comments below!
... View more
Hello everyone! I'm excited to announce the launch of our dedicated Jamf Developers Community space. This is more than just another technical forum – it's a collaborative hub where different types of developers can come together, share knowledge, and build better solutions for the Apple enterprise ecosystem.
Who Should Join?
This community is designed for two key groups who approach development from different but complementary perspectives:
Third-Party Developers & Partners
Building commercial solutions that integrate with Jamf
Bringing deep programming expertise to the table
Looking to understand Jamf product capabilities and use cases
Seeking to identify market opportunities and customer needs
Jamf Customers & In-House Developers
Managing Jamf implementations within their organizations
Experts in Jamf product capabilities and workflows
Looking to enhance their development skills
Seeking to automate and customize their Jamf environment
Why This Community Matters
What makes this space unique is the opportunity for these different perspectives to converge and create value together. Here's what you can expect:
Direct Engagement with Jamf: Get insights and updates directly from Jamf's Developer Relations team
Peer Learning: Share challenges and solutions with others who understand your context
Partnership Opportunities: Connect with potential collaborators or solution providers
Real-World Use Cases: Learn how others are solving similar challenges
Best Practices: Access guidance on development standards and approaches
Let's Start the Conversation
To kick things off, we'd love to hear from you:
What type of solutions have you built or are in the process of building?
Which of Jamf’s developer tools are you using?
What would make this community most valuable for you?
... View more