Getting started

Make your first API call in Jamf's Platform API Gateway.

Overview

The Platform API Gateway is one entry point for every Jamf API. You create one integration in Jamf Account, grant it the capabilities it needs, and use it to call blueprints, device inventory, Jamf Pro, Jamf Security Cloud, and the rest of the platform. One set of credentials and one permission model covers all of them.

This article covers creating an integration and making your first authenticated request. Everything that applies to every API behind the gateway, including regions, permissions, pagination, and errors, is in Platform API fundamentals.

💡

Looking to implement Infrastructure as Code with Jamf? Check out the Jamf Platform Terraform provider and documentation.

What you need

Before you begin, make sure you have:

  • Access to Jamf Account for your organization, with the Administrator role or a custom role with Integrations privileges
  • At least one Jamf product tenant associated with your organization
  • A platform environment containing at least one of those tenants, if you plan to call platform APIs
📘

Can't sign in, or don't see Integrations? Ask an administrator at your organization for access, or create a custom role with Integrations privileges, assign it to your user, then log out and back in for the change to take effect.

Choose a scope level

Every integration is scoped to one level. The level you pick decides which APIs you can reach and which permissions are available to grant.

Scope levelWhat it reachesUse it for
Organization managementJamf Account APIs: audit events, licensing, partners, SSOAccount administration across your whole organization
Platform environmentPlatform APIs plus the product APIs of the tenants in that environmentCross-product workflows: blueprints, devices, device groups, actions, compliance benchmarks, declaration reporting, audit events, AI policies
TenantProduct APIs only, for the tenants you selectWorking against a single product instance

A platform environment is a defined group of tenants that your organization has across the Jamf platform. It links resources and capabilities across products, which is why platform APIs work only at the environment level.

📘

Jamf already groups most organizations' tenants into an environment automatically, based on how your organization is set up, so no action is needed. Some organizations include tenants purchased or set up in a way that doesn't map cleanly to one environment; those organizations can group tenants manually in the platform environments UI in Jamf Account. If a tenant doesn't appear in your environments at all, contact Jamf Support.

⚠️

Created an environment but don't see it when scoping your integration? A manually created environment only becomes selectable once Jamf can determine its region. That requires the environment to include an MDM solution, such as Jamf Pro or Jamf School, and all of its tenants except Jamf Security Cloud to be in the same region. Allow up to 15 minutes for a newly created or edited environment to appear.

Create your first integration

An integration defines what you can reach, what you're allowed to do, and holds the client ID and secret you authenticate with.

  1. Sign in to Jamf Account and select Integrations from the left navigation.
  2. Click Create integration and give it a name and, optionally, a description.
  3. Set the scope level to organization management, platform environment, or tenant. Then select the organization, environment(s), or tenant(s) it applies to.
  4. Assign permissions by browsing through capabilities. Grant only what your integration needs.
  5. Click Create integration to save.

The permissions on offer depend on what you selected in step 3, so the list shows only the capabilities your tenants support.

Jamf Account then displays your client ID and client secret, along with a ready-to-use curl command.

⚠️

Store your client secret now. It appears once, and regenerating it is the only way to get a new one.

Integrations are valid for six months. Plan for rotation as part of your build.

Find your base URL

Which host you call depends on your scope level.

Scope levelBase URL
Organization managementhttps://api.jamfcloud.com
Platform environmenthttps://{region}.api.jamfcloud.com
Tenanthttps://{region}.api.jamfcloud.com

{region} is us, eu, or apac, matching the region your product instances are hosted in. Organization management uses the bare host, which always routes to the US region.

⚠️

Tokens are region-locked. Request your token from the same host you send requests to. See Regions and data residency for the full picture, including product availability by region.

Endpoint paths follow a single pattern:

/{domain-namespace}/v{n}/{resource-path}

The version segment is required.

💡

Rather not build these requests by hand? jamf-cli handles everything below automatically: the base URL, the context header, the token exchange, and pagination. One binary covers the Platform APIs, Jamf Pro, Jamf Protect, and Jamf School. Install it with brew install Jamf-Concepts/tap/jamf-cli.

Pass context in headers

Tenant and environment IDs travel in headers rather than the URL path:

HeaderWhen to send it
X-Tenant-IdTenant-scoped requests
X-Environment-IdPlatform environment-scoped requests

Organization management requests need no context header. A token belongs to exactly one organization, so the gateway resolves it from the token itself.

To find an ID, open your integration in Jamf Account and click a tenant or environment pill in the Integration details panel to copy the ID to your clipboard.

⚠️

This changed at GA. During the public beta, tenant and environment IDs were path segments (/tenant/{tenantId}/). Production now accepts headers only. If you built against the beta, see Updating existing Jamf Pro integrations.

Request an access token

An access token is a short-lived credential you exchange your client ID and secret for, then pass in the Authorization header of every API request.

Post your credentials as form fields to the token endpoint:

curl --request POST \
  --url https://us.api.jamfcloud.com/auth/token \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'grant_type=client_credentials' \
  --data-urlencode 'client_id=<your_client_ID>' \
  --data-urlencode 'client_secret=<your_client_secret>'

The gateway responds with:

{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
  "expires_in": 900,
  "refresh_expires_in": 0,
  "token_type": "Bearer",
  "not-before-policy": 0
}
💡

Tokens expire after 900 seconds. Request a fresh one with the same client credentials when the old one runs out. Track expires_in and request the next token before the current one expires.

Make your first API call

Pass the token as a Bearer token in the Authorization header, and the tenant or environment ID in its header.

A platform environment-scoped request to the Devices API:

curl --request GET \
  --url 'https://us.api.jamfcloud.com/devices/v1/devices' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <your_access_token>' \
  --header 'X-Environment-Id: <your_environment_ID>'

And a tenant-scoped request to the Jamf Pro API, using an integration scoped to that tenant:

curl --request GET \
  --url 'https://us.api.jamfcloud.com/pro/v1/buildings' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer <your_access_token>' \
  --header 'X-Tenant-Id: <your_tenant_ID>'

A 200 OK confirms everything is wired up correctly.

Page through results

Collection endpoints are paginated and accept page, page-size, sort, and an RSQL filter. Response envelopes vary between APIs, so check the reference page for the endpoint you are calling.

See Pagination, sorting, and filtering for the parameters, the RSQL operators, and the envelope shapes.

💡

A 15-minute token expires partway through a large pagination loop. Refresh on a timer based on expires_in.

Where to go next