Releases: jamf/terraform-provider-jamfplatform
Release list
v0.32.0
⚠️ Action required: this provider has moved to the jamf namespace
v0.32.0 publishes as jamf/jamfplatform. Everything up to v0.31.2 published as
jamf-concepts/jamfplatform, and Terraform records the namespace in state alongside every
resource the provider manages, so editing source alone will not move a configuration across.
For each workspace and each state file holding jamfplatform resources, rewrite the state
first:
terraform state replace-provider jamf-concepts/jamfplatform jamf/jamfplatformThen point source at the new namespace, leaving any version constraint as it is:
terraform {
required_providers {
jamfplatform = {
source = "jamf/jamfplatform"
}
}
}Then run terraform init.
OpenTofu works the same way, with tofu in place of terraform.
Full instructions, and the parts that are easy to get wrong:
Moving to the jamf namespace.
What stays the same
Nothing on the Jamf side changes. The same credentials, base_url, scope attribute, resources and
data sources apply on either side of the move.
Previous releases keep working. Everything from v0.12.1 to v0.31.2 is published under
jamf/jamfplatform as well, and the jamf-concepts/jamfplatform versions go on resolving, so
nothing breaks if you do nothing today. You can change namespace now and upgrade whenever you
like. New versions land only under jamf from v0.32.0 on.
The repository moved to
github.com/jamf/terraform-provider-jamfplatform.
Existing links and clone URLs redirect.
Also in this release
The migration warning that fired on every plan and apply is gone.
What's Changed
- chore: move the provider to the jamf namespace by Neil Martin (@neilmartin83) in #420
Full Changelog: v0.31.2...v0.32.0
v0.31.2
What's Changed
- fix(pro): tolerate the web clip icon re-render on configuration profiles by Neil Martin (@neilmartin83) in #419
Full Changelog: v0.31.1...v0.31.2
v0.31.1
What's Changed
- chore(deps): Bump google.golang.org/grpc from 1.83.1 to 1.83.2 in the go_modules group across 1 directory by Dependabot (@dependabot)[bot] in #417
- fix(sso_connection): stop generating configuration this resource refuses by Neil Martin (@neilmartin83) in #416
- fix(account_group): never adopt a privilege the tenant will not grant by Neil Martin (@neilmartin83) in #415
- fix(pro): hydrate list results whose endpoint returns only a summary row by Neil Martin (@neilmartin83) in #412
- fix(ai_governance): type Timeouts when the read has no prior state to decode by Neil Martin (@neilmartin83) in #413
- fix(policy): require local_accounts[].home for a Create action by Neil Martin (@neilmartin83) in #414
Full Changelog: v0.31.0...v0.31.1
v0.31.0
What's Changed
- fix: stop config generation emitting configuration the provider refuses (#379) by Neil Martin (@neilmartin83) in #382
- fix: emulate per-category privilege retention on account and account_group (#385) by Neil Martin (@neilmartin83) in #389
- fix: stop config generation emitting configuration the provider refuses (#379), and accept an identity-based import on every singleton by Neil Martin (@neilmartin83) in #381
- chore: stop golangci-lint walking the gitignored local-testing directory by Neil Martin (@neilmartin83) in #380
- test: omit-retains contract on the block-gated classic resources (#383) by Neil Martin (@neilmartin83) in #386
- test(pro): order the vpp omit-retains teardown so it stops leaking a user group by Neil Martin (@neilmartin83) in #395
- fix(pro): report Jamf Pro UI drift on 7 classic resources; stop advertising attributes the API ignores (#387) by Neil Martin (@neilmartin83) in #388
- test(pro): stop the omit-retains configs declaring attributes #387 made read-only by Neil Martin (@neilmartin83) in #397
- chore(deps): SDK v0.22.1, and fix the two macOS profile defects it exposed by Neil Martin (@neilmartin83) in #396
- fix: always emit clearable classic scalars so a dropped value clears (#384) by Neil Martin (@neilmartin83) in #390
- fix: send display_in so Self Service categories are stored at all by Neil Martin (@neilmartin83) in #398
- fix(mobile_device_configuration_profile)!: remove self_service_description (#393) by Neil Martin (@neilmartin83) in #401
- fix(pro): hydrate every ownership-gated block on import, one shape (#391) by Neil Martin (@neilmartin83) in #400
- fix(patch_software_title): never hydrate undeclared package assignments (#403) by Neil Martin (@neilmartin83) in #406
- fix(cloud_identity_provider): preserve Entra attribute mappings on omission (#404) by Neil Martin (@neilmartin83) in #407
- feat(cloud_identity_provider): add the defaults data source by Neil Martin (@neilmartin83) in #409
- docs: explain the post-import settle plan, and state the omit-preserves contract everywhere (#383) by Neil Martin (@neilmartin83) in #402
- fix(sso_settings): merge the plan over the tenant's settings, not over nothing (#405) by Neil Martin (@neilmartin83) in #408
- fix(provider): stop an unrouted 404 emptying the state file by Neil Martin (@neilmartin83) in #411
Full Changelog: v0.30.0...v0.31.0
v0.30.0
v0.30.0: this provider is moving to the jamf namespace soon!
Advance notice of the namespace move, plus the fixes reported against v0.29.0.
The jamf namespace
A future release will publish this provider as jamf/jamfplatform in place of jamf-concepts/jamfplatform. Terraform records that namespace in state, so a version bump will not pick it up.
Change nothing today. Releases under jamf-concepts/jamfplatform keep working. From this release the provider warns you on every plan and apply.
When you upgrade to that release, in each workspace and state file holding jamfplatform resources:
terraform state replace-provider jamf-concepts/jamfplatform jamf/jamfplatform- Point
sourceatjamf/jamfplatforminrequired_providers. terraform init -upgrade
Step 1 asks for confirmation and writes a backup; add -auto-approve for CI. OpenTofu works the same way, with tofu for terraform. Reference.
Platform API GA follow-up
v0.28.1 and earlier cannot reach the Jamf Platform API, which retired its beta gateway and revoked beta credentials at GA. Register a replacement API integration in Jamf Account, environment-scoped, and read Upgrading to the Platform API GA.
The provider now refuses the wrong integration scope at configure time, before an apply starts: a tenant-scoped credential aimed at Blueprints or Compliance Benchmarks stops in under a second with a named diagnostic, and that diagnostic names the swap, since tenant_id and environment_id are mutually exclusive. Jamf Account will not grant either family's permissions to a tenant-scoped integration. Platform devices, device groups and device actions still work under tenant_id.
Every "Required Jamf permissions" table now names the integration scope alongside the boxes to tick.
Fixes
- An unstable upload URL failed a first apply with "Provider produced inconsistent final plan" on
jamfplatform_pro_icon,jamfplatform_pro_self_service_branding_imageandjamfplatform_pro_enrollment_customization. Apple's iTunes artwork CDN answers one URL with different bytes per request. All three now hash the bytes they upload, during apply. A local path is still hashed on every plan. A URL is not fetched during a plan, so the provider will not see a new image published behind an unchanged URL. Commit the file instead. (#373) - Import dropped attributes.
jamfplatform_device_groupleftdescriptionandmembersnull.jamfplatform_pro_accountleft the wholeprivilegesgrid null, soterraform plan -generate-config-outemitted a Full Access account with no privileges block. (#372) - Corrected the branding image documentation. Jamf Pro stores an uploaded branding image verbatim, so point
image_file_sourceat your own file. The re-encode warning belongs tojamfplatform_pro_icon. - Fixed a nil-pointer crash on a Terraform client with no resource-identity support. Terraform 1.13 and later are unaffected.
Built on jamfplatform-go-sdk v0.22.0.
Full Changelog: v0.29.0...v0.30.0
v0.29.0: the Jamf Platform API GA release
The Jamf Platform API reached general availability on 3 September 2026, and this release targets it.
Every configuration written against the public beta needs work before it will plan. The beta gateway has been retired and beta credentials revoked, so v0.28.1 and earlier can no longer reach the Platform API at all.
What you must do
For full details, see: Upgrading to the Platform API GA.
- Register a replacement API integration in Jamf Account and take its credentials. You cannot migrate a beta client. (how)
- Register it environment-scoped, and replace
tenant_idwithenvironment_id. - Set
base_urltohttps://{region}.api.jamfcloud.com. - Back up state, then
terraform state rmjamfplatform_pro_api_clientandjamfplatform_pro_api_role. Until you do, every operation in the workspace fails. - Delete the configuration blocks for the removed data sources, list resources and MDM command actions, listed under Breaking changes.
terraform {
required_providers {
jamfplatform = {
source = "Jamf-Concepts/jamfplatform"
version = ">= 0.29.0"
}
}
}
provider "jamfplatform" {
base_url = "https://eu.api.jamfcloud.com" # or us., or apac.
environment_id = var.jamf_environment_id
}Track the latest release rather than pinning a version. The platform services behind this provider are updated on a schedule of their own, so a pinned provider drifts away from the API it talks to. A workspace pinned to a 0.29.0-rc.* candidate should move to 0.29.0.
Thank you to everyone who ran the provider during the public beta. Bug reports and feedback from beta participants shaped a substantial part of this release, including environment scope, proxy support and a range of resource behaviour.
Breaking changes
Several endpoints were unpublished at GA, so the constructs built on them have been removed: the jamfplatform_pro_api_client and jamfplatform_pro_api_role resources, with their data sources and list resources, and the jamfplatform_pro_api_role_privileges data source. Jamf Pro API roles and clients remain available through the Jamf Pro UI and API.
Fourteen MDM command actions have been removed: device_lock, enable_lost_mode, disable_lost_mode, play_lost_mode_sound, enable_remote_desktop, disable_remote_desktop, clear_restrictions_password, clear_passcode, delete_user, log_out_user, unlock_user_account, set_auto_admin_password, trigger_enhanced_log_collection and cancel_enhanced_log_collection.
environment_id joins tenant_id, and you set one or the other. Prefer environment_id: one integration covers a group of tenants across products, and it is the only scope that can hold the blueprint and compliance-benchmark permissions. Set neither to reach the new jamfplatform_account_* family, which nothing else reaches.
Four attribute changes, each covered in the guide:
jamfplatform_cbengine_benchmarkresource and data source:target_device_groupremoved. Usetarget_device_groups.jamfplatform_pro_patch_software_titleresource and data source:category_nameandsite_nameremoved. On the resource,category_idandsite_idno longer accept"0"; use-1to clear.jamfplatform_security_cloud_uem_connectresource:unmanaged_sync_thresholdis now read-only. Delete the line from your configuration.jamfplatform_pro_app_installer_titlesdata source:titles[*]drops thirteen attributes. Read them from thejamfplatform_pro_app_installer_titledata source instead.
Two App Installer schema descriptions were corrected. quit_delay is in minutes, not seconds, so quit_delay = 300 is five hours. selected_version holds the version you pinned when update_behavior is MANUAL, and sits empty when it is AUTOMATIC.
New construct families
Jamf Security Cloud, jamfplatform_security_cloud_*: custom DNS zones, search domains and hostname mappings; ZTNA gateways, grouped gateways and access policy apps; device groups; UEM Connect; activation profiles; content categories. Read Jamf Security Cloud.
Jamf Account, jamfplatform_account_*: SSO domains and the identity provider connections that sign users in for them. The provider's first organization-scoped family, served only from the US gateway. Several behaviours come from Jamf Account rather than from the provider, including replacement on any connection change. Read Jamf Account single sign-on.
Jamf AI Governance, jamfplatform_ai_governance_*: the settings a blueprint delivers to Claude Code, Claude Desktop or OpenAI Codex, plus the product catalogue. Environment scope only. Read AI Governance policies.
Also in this release
- Reverse proxy support:
custom_headersandauthorization_header_name. See Reverse proxies and custom headers. - A
jamfplatform_pro_tenant_iddata source, resolving the Jamf Pro tenant identifier from the configured scope. jamfplatform_pro_patch_software_titlenow uses Jamf Pro's current patch configuration endpoints. App Installer gains retry and version-update actions, and aversionargument for reading a historical version of a title.- The
jamfplatform_pro_patch_policylist resource now warns about any policy it could not enumerate, instead of dropping it from the result. - The provider reports an incorrect
base_urlappropriately, rather than surfacing a generic network failure. - The required-permission tables on every construct page follow the GA capability model.
- This release rewrites every schema description and example comment in a plainer voice. No attribute, value, default or behaviour changed with it.
- The provider targets Jamf Pro 11.31.0 and builds on
jamfplatform-go-sdkv0.21.0.
Full Changelog: v0.28.1...v0.29.0
v0.29.0-rc.7
What's Changed
- feat(account): Jamf Account SSO connections by Neil Martin (@neilmartin83) in #367
Full Changelog: v0.29.0-rc.6...v0.29.0-rc.7
v0.29.0-rc.6
What's Changed
- refactor(pro): migrate computers-inventory v3→v4, patch-software-title-configurations v2→v3 by Neil Martin (@neilmartin83) in #357
- fix(security_cloud): unmanaged_sync_threshold is read-only, unbreaking every uem_connect apply by Neil Martin (@neilmartin83) in #358
- feat(security_cloud): warn about the UEM Connect credential leak, enforce the sync-interval enum by Neil Martin (@neilmartin83) in #359
- feat(security_cloud): activation profiles — SDK df2ee00 ingest plus the resource that mints one by Neil Martin (@neilmartin83) in #360
- feat(pro): migrate patch_software_title to the Jamf Pro v3 configurations API by Neil Martin (@neilmartin83) in #362
- chore(deps): bump google.golang.org/grpc from 1.82.1 to 1.83.1 in the go_modules group across 1 directory by Dependabot (@dependabot)[bot] in #361
- chore(deps): ingest SDK 65ce8a0f, moving the withdrawn patchpolicies list to Pro v2 by Neil Martin (@neilmartin83) in #363
- feat(account): Jamf Account SSO domains — the first organization-scoped constructs by Neil Martin (@neilmartin83) in #364
- docs(platform_api_ga): pin rc.6, and cover the additions since rc.5 by Neil Martin (@neilmartin83) in #365
- ci(release): label pre-releases, and take the notes GitHub already writes by Neil Martin (@neilmartin83) in #366
Full Changelog: v0.29.0-rc.5...v0.29.0-rc.6
v0.29.0-rc.5
What's Changed
- docs: write the required-permission tables the way Jamf Account reads by Neil Martin (@neilmartin83) in #350
- chore(deps): ingest SDK 8df0fe4 — the UEM Connect create is a vendor union by Neil Martin (@neilmartin83) in #351
- docs(ai_governance): cite Jamf's configuration guide and enrich from it by Neil Martin (@neilmartin83) in #352
- feat(security_cloud): wait for a ZTNA gateway to report a settled status by Neil Martin (@neilmartin83) in #355
- docs(security_cloud): add a Jamf Security Cloud guide, wire-verified by Neil Martin (@neilmartin83) in #353
- docs(platform_api_ga): pin rc.5, and note the gateway wait by Neil Martin (@neilmartin83) in #356
Full Changelog: v0.29.0-rc.4...v0.29.0-rc.5
v0.29.0-rc.4
Preparing for the Platform API GA
This pre-release targets the GA gateway. Every configuration written against the public beta needs changes, so please read the migration guide before upgrading:
📘 Preparing for the Platform API GA
The Platform API is still moving ahead of GA. That guide is provisional and may change without notice.
⚠️ Breaking changes
- 31 constructs were removed — 4 resources, 10 data sources, 3 list resources and 14 MDM command actions — because the endpoints behind them were unpublished. A workspace still holding one of the removed resources in state cannot produce a plan of any kind, including
plan -destroy, and the error reads like a Terraform bug. It is not. Remove the state entries withterraform state rm; the guide lists every affected type and the exact commands. base_urlmust change tohttps://{region}.api.jamfcloud.com, in the same change as the provider upgrade. The beta host is not supported on this version, and the GA host is not supported on earlier ones.- Beta API integration credentials are revoked at GA and cannot be migrated. They still work until then, including against the GA host — so this release can be adopted now, and the credential swap deferred to GA.
target_device_grouponjamfplatform_cbengine_benchmarkis replaced bytarget_device_groups. State migrates automatically; only the configuration needs editing.
At GA you will also register a replacement integration and, for most configurations, swap tenant_id for environment_id — mandatory if you manage blueprints or compliance benchmarks, whose permissions cannot be granted to a tenant-scoped integration. Nothing to do before then.
Installing
Terraform never resolves to a pre-release, so the version must be named exactly — ~> 0.29 and an unconstrained required_providers block both resolve to v0.28.1, which is bound to the retired beta gateway:
terraform {
required_providers {
jamfplatform = {
source = "Jamf-Concepts/jamfplatform"
version = "0.29.0-rc.4"
}
}
}Then terraform init -upgrade. A stable v0.29.0 follows shortly after GA; relax the constraint once it is out.
Also in this release
Jamf Security Cloud (custom DNS, ZTNA gateways and access policies, device groups, UEM Connect), Jamf AI Governance policies, environment_id scope, and proxy support via custom_headers. Built against Jamf Pro 11.31.0 and Classic API 11.28.0. All additive — see the guide's "Additions since v0.28.1", and the full commit log below.