{"id":20252587,"url":"https://github.com/univ-of-utah-marriott-library-apple/python-jamf","last_synced_at":"2026-03-03T03:15:29.325Z","repository":{"id":39990455,"uuid":"307855976","full_name":"univ-of-utah-marriott-library-apple/python-jamf","owner":"univ-of-utah-marriott-library-apple","description":"`python-jamf` is a library for connecting to a Jamf Server. It maps Jamf Pro records to a Record class. It is the basis for the `jctl` tool to automate patch management \u0026 packages and many other items.","archived":false,"fork":false,"pushed_at":"2026-02-24T19:35:41.000Z","size":609,"stargazers_count":63,"open_issues_count":3,"forks_count":15,"subscribers_count":7,"default_branch":"main","last_synced_at":"2026-02-24T23:49:19.055Z","etag":null,"topics":["automation","autopkg","installer-packages","jamf","jamf-pro","jamf-pro-api","macos","patch","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/univ-of-utah-marriott-library-apple.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-10-27T23:44:25.000Z","updated_at":"2025-11-20T18:51:50.000Z","dependencies_parsed_at":"2023-11-13T22:31:29.787Z","dependency_job_id":"28ff9563-05d5-4a6f-8dcc-8797841a9e52","html_url":"https://github.com/univ-of-utah-marriott-library-apple/python-jamf","commit_stats":{"total_commits":234,"total_committers":13,"mean_commits":18.0,"dds":0.6111111111111112,"last_synced_commit":"ca1466366ee1f6ca5f68a91ccf686fc0f84ceca3"},"previous_names":[],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/univ-of-utah-marriott-library-apple/python-jamf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/univ-of-utah-marriott-library-apple%2Fpython-jamf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/univ-of-utah-marriott-library-apple%2Fpython-jamf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/univ-of-utah-marriott-library-apple%2Fpython-jamf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/univ-of-utah-marriott-library-apple%2Fpython-jamf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/univ-of-utah-marriott-library-apple","download_url":"https://codeload.github.com/univ-of-utah-marriott-library-apple/python-jamf/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/univ-of-utah-marriott-library-apple%2Fpython-jamf/sbom","scorecard":{"id":910387,"data":{"date":"2025-08-11","repo":{"name":"github.com/univ-of-utah-marriott-library-apple/python-jamf","commit":"713c24d79d72fa1dac9b8b6d18ea8acf95a32b28"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.2,"checks":[{"name":"Maintained","score":1,"reason":"2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/26 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build.yml:1","Warn: no topLevel permission defined: .github/workflows/pre-commit.yml:1","Warn: no topLevel permission defined: .github/workflows/python-package.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 0.9.9 not signed: https://api.github.com/repos/univ-of-utah-marriott-library-apple/python-jamf/releases/154478225","Warn: release artifact 0.9.8 not signed: https://api.github.com/repos/univ-of-utah-marriott-library-apple/python-jamf/releases/148335143","Warn: release artifact 0.9.7 not signed: https://api.github.com/repos/univ-of-utah-marriott-library-apple/python-jamf/releases/145922370","Warn: release artifact 0.9.6 not signed: https://api.github.com/repos/univ-of-utah-marriott-library-apple/python-jamf/releases/139998023","Warn: release artifact 0.9.5 not signed: https://api.github.com/repos/univ-of-utah-marriott-library-apple/python-jamf/releases/139181652","Warn: release artifact 0.9.9 does not have provenance: https://api.github.com/repos/univ-of-utah-marriott-library-apple/python-jamf/releases/154478225","Warn: release artifact 0.9.8 does not have provenance: https://api.github.com/repos/univ-of-utah-marriott-library-apple/python-jamf/releases/148335143","Warn: release artifact 0.9.7 does not have provenance: https://api.github.com/repos/univ-of-utah-marriott-library-apple/python-jamf/releases/145922370","Warn: release artifact 0.9.6 does not have provenance: https://api.github.com/repos/univ-of-utah-marriott-library-apple/python-jamf/releases/139998023","Warn: release artifact 0.9.5 does not have provenance: https://api.github.com/repos/univ-of-utah-marriott-library-apple/python-jamf/releases/139181652"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/univ-of-utah-marriott-library-apple/python-jamf/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/univ-of-utah-marriott-library-apple/python-jamf/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pre-commit.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/univ-of-utah-marriott-library-apple/python-jamf/pre-commit.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pre-commit.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/univ-of-utah-marriott-library-apple/python-jamf/pre-commit.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-package.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/univ-of-utah-marriott-library-apple/python-jamf/python-package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-package.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/univ-of-utah-marriott-library-apple/python-jamf/python-package.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-package.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/univ-of-utah-marriott-library-apple/python-jamf/python-package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/python-package.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/univ-of-utah-marriott-library-apple/python-jamf/python-package.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/python-package.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/univ-of-utah-marriott-library-apple/python-jamf/python-package.yml/main?enable=pin","Warn: containerImage not pinned by hash: python-jamf-docker/python-jamf-dev/Dockerfile:1: pin your Docker image by updating python:3 to python:3@sha256:3b2f1b9c9948e9dc96e1a2f4668ba9870ff43ab834f91155697476142b3bc299","Warn: containerImage not pinned by hash: python-jamf-docker/python-jamf-github/Dockerfile:1: pin your Docker image by updating python:3 to python:3@sha256:3b2f1b9c9948e9dc96e1a2f4668ba9870ff43ab834f91155697476142b3bc299","Warn: containerImage not pinned by hash: python-jamf-docker/python3/Dockerfile:1: pin your Docker image by updating python:3 to python:3@sha256:3b2f1b9c9948e9dc96e1a2f4668ba9870ff43ab834f91155697476142b3bc299","Warn: pipCommand not pinned by hash: python-jamf-docker/python-jamf-dev/Dockerfile:4","Warn: pipCommand not pinned by hash: python-jamf-docker/python-jamf-dev/Dockerfile:5","Warn: pipCommand not pinned by hash: python-jamf-docker/python-jamf-github/Dockerfile:4-8","Warn: pipCommand not pinned by hash: python-jamf-docker/python-jamf-github/Dockerfile:4-8","Warn: pipCommand not pinned by hash: python-jamf-docker/python3/Dockerfile:2","Warn: pipCommand not pinned by hash: .github/workflows/pre-commit.sh:2","Warn: pipCommand not pinned by hash: .github/workflows/build.yml:22","Warn: pipCommand not pinned by hash: .github/workflows/build.yml:23","Warn: pipCommand not pinned by hash: .github/workflows/build.yml:24","Warn: pipCommand not pinned by hash: .github/workflows/build.yml:25","Warn: pipCommand not pinned by hash: .github/workflows/python-package.yml:18","Warn: pipCommand not pinned by hash: .github/workflows/python-package.yml:19","Info:   0 out of   7 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned","Info:   0 out of   3 containerImage dependencies pinned","Info:   0 out of  12 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 4 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-24T18:54:03.252Z","repository_id":39990455,"created_at":"2025-08-24T18:54:03.252Z","updated_at":"2025-08-24T18:54:03.252Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30030850,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-03T00:31:48.536Z","status":"online","status_checked_at":"2026-03-03T02:00:07.650Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","autopkg","installer-packages","jamf","jamf-pro","jamf-pro-api","macos","patch","python"],"created_at":"2024-11-14T10:17:30.692Z","updated_at":"2026-03-03T03:15:29.319Z","avatar_url":"https://github.com/univ-of-utah-marriott-library-apple.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# python-jamf\n_Programmatic Automation, Access \u0026 Control of Jamf Pro_\n\n![python_jamf_logo](https://github.com/univ-of-utah-marriott-library-apple/python-jamf/wiki/images/python_jamf_logo.png)\n\n## Introduction\n\n`python-jamf` is a Python 3 library to access the Jamf Pro Classic API. It also comes with the CLI tool, `jctl`. The Classic API is a tool for programmatic access to data on a Jamf Pro server to allow integrations with other utilities or systems. The concept behind it is to have a class or simply a collection of data (variables) and methods (functions) that maps directly to the API (https://example.com:8443/api).\n\n![python_jamf workflow](https://github.com/univ-of-utah-marriott-library-apple/python-jamf/wiki/images/python_jamf_workflow.png)\n\n### What are `python-jamf` and `jctl`?\n\nThis repository contains both the `python-jamf` library and the `jctl` command-line interface.\n\n`python-jamf` is a Python library that allows [CRUD](https://en.wikipedia.org/wiki/Create,_read,_update_and_delete) operations on about 50 Jamf records using the Classic API and [jps-api-wrapper](https://pypi.org/project/jps-api-wrapper/). It includes keychain support for Jamf Pro credentials using the [keyring](https://github.com/jaraco/keyring) library. We are slowly adding newer Jamf Pro API support. You can install python-jamf and `jctl` using [PyPi](https://pypi.org/project/python-jamf/).\n\n`jctl` exposes `python-jamf` CRUD operations at the command line, allowing you to incorporate Jamf tasks into scripts (including BASH). It can automate repetitive tasks and provide options not available in the web GUI.\n\nThere are a few other tools that are part of this project. `pkgctl` automates operations with packages, such as promotion and creating patch definitions.\n\n### Supported Jamf Records\n\nCurrently, the `python-jamf` and `jctl` support about 50 Jamf records like Buildings, Categories, Computers, OSXConfigurationProfiles, and Policies. The supported records are very similar to each other and so if learn how to work with one record type, you will know how to work with almost all of them.\n\nEach record is a generic Python object and most functionality comes from the parent Record class. Objects do not have member variables for Jamf data. All Jamf Pro data is stored as a Python dictionary that is accessed with the data() method. All lists of records are subclasses of the Records class.\n\nExcept for create and delete, all changes you make are local until you save or refresh the object.\n\nTo work with Jamf records that we don't support yet, it's best to use the [jps-api-wrapper](https://pypi.org/project/jps-api-wrapper/) library directly.\n\n### Quick Example\n\nThis is just a quick example of the power and ease-of-use of python-jamf. The following code creates a computer record, changes the new record's name, then shows some examples of how to find records, then deletes the record created by the script.\n\n```python\nfrom python_jamf import server\n\njps = server.Server(hostname=\"http://localhost:8443\", username=\"demo\", password=\"demo\", client=False)\n\n# Get all the computer records.\ncomputers = jps.Computers()\n\n# for a list of all record types, see the wiki\n# https://github.com/univ-of-utah-marriott-library-apple/python-jamf/wiki#supported-jamf-records\n\n# Print the names of all the computers, then print all the ids\ncomputers.names()\ncomputers.ids()\n\n# Create the record (record is auto-saved)\nrecord_to_delete = None\nif \"test\" not in computers:\n    record_to_delete = jps.Computers().create({'general':{'name': 'test'}})\n\n# Get the computer named \"test\"\nresults = computers.recordsWithName(\"test\")\n\n# Note, it's possible to create computers with the same name using the API, so you\n# must work with multiple records\nif len(results) \u003e 0:\n    # Just take the first one (because multiple records is probably unintended)\n    test_computer = results[0]\n\n# Change the name and then save\ntest_computer.data[\"general\"][\"name\"] = \"test2\"\ntest_computer.save()\n\n# Print the whole record\nprint(test_computer.data)\n\n# Search by regex\nfor computer in computers.recordsWithRegex(\"tes\"):\n    print(f\"{computer.data['general']['name']} has id {computer.data['general']['id']}\")\n    last_id = computer.data['general']['id']\n\n# Search by ID\nlast_result = computers.recordWithId(last_id)\nif last_result:\n    print(f\"{last_result.data['general']['id']} has name {computer.data['general']['name']}\")\n\n# If this script created a record, delete it\nif record_to_delete:\n    print(f\"Deleting record created by this script\")\n    record_to_delete.delete() # delete is instant, no need to save\n```\n\nAll supported record types are accessed like this: `jps.Computers()`, `jps.Policies()`, `jps.Packages()`, etc. Note: python-jamf versions prior to 0.10.0 used `jps.records.Computers()`. 0.10.0 deprecates this. Please switch to `jps.Computers()`.\n\n## Quick Start\n\n### Installing\n\nFor those that want to try `python-jamf` quickly here are some general steps:\n\n- Install Module \u0026 Requirements: `pip3 install python-jamf`\n- Create an Jamf Pro API User: `conf-python-jamf`\n- Enter hostname, username, and password\n- Test: `conf-python-jamf -t`\n\nYou might need to use `sudo pip3 install python-jamf`, depending on how you have Python installed.\n\n### Uninstalling\n\nUninstalling `python-jamf` is easy if you installed it via `pip`. `pip` is the **P**ackage **I**nstaller for **P**ython.\n\nTo uninstall `python-jamf` run the following command:\n\n```bash\nsudo pip3 uninstall python-jamf\n```\n\n### Upgrading\n\nUpgrading `python-jamf` is easy if you installed it via `pip`. `pip` is the **P**ackage **I**nstaller for **P**ython.\n\nTo upgrade `python-jamf` run the following command:\n\n```bash\npip3 install --upgrade python-jamf\n```\n\nYou might need to use `sudo pip3 install --upgrade python-jamf`, depending on how you have Python installed.\n\n## Getting Help\n\n### Wiki\n\n#### More Documentation\n\nFor further in-depth details please check out [the wiki](https://github.com/univ-of-utah-marriott-library-apple/python-jamf/wiki).\n\n#### Searching the wiki\n\nTo search this wiki use the \"Search\" field in the GitHub navigation bar above. Then on the search results page select the \"Wiki\" option or [click here](https://github.com/univ-of-utah-marriott-library-apple/python-jamf/search?q=\u0026type=Wikis\u0026utf8=✓) and search.\n\n### MacAdmin Slack Channel\n\nIf you have additional questions, or need more help getting started, post a question on the MacAdmin's Slack [jctl](https://macadmins.slack.com/archives/C01C8KVV2UD) channel.\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://github.com/univ-of-utah-marriott-library-apple/python-jamf/wiki/images/MacAdmins_Slack_logo.png\" alt=\"MacAdmin's Slack Logo\"\u003e\n\u003c/p\u003e\n\n## Latest Status\n\n### Releases\n\nPlease see the [Changelog](https://github.com/univ-of-utah-marriott-library-apple/python-jamf/blob/main/CHANGELOG.md) for all release notes.\n\nWe would like to thank the following for their contributions: \u003cem\u003e0xmachos, homebysix, Honestpuck, ORyanHampton, pythoninthegrass, SamBaRufus, Tophernad, yairf-s1\u003c/em\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funiv-of-utah-marriott-library-apple%2Fpython-jamf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Funiv-of-utah-marriott-library-apple%2Fpython-jamf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funiv-of-utah-marriott-library-apple%2Fpython-jamf/lists"}