Apple Business API を使用して、デバイス情報取得の検証

Apple Business API を使用して、デバイス情報取得の検証

Apple Business API を使用して、デバイス情報取得の検証を行いましたので記載します。
2026.08.22

概要

Apple Business(旧 Apple Business Manager(ABM))に登録されているデバイス(Mac, iphone等)の情報は、Apple BusinessのWebポータルより確認が可能ですが、多数登録されているデバイス情報の一括取得や棚卸、定期チェックを自動化することを検討しました。そこで、Apple Business API を使用したデバイス情報の取得を先ずは検証しましたので、その際の内容を記載します。

(当社ではMDMとしてJamfを利用していますが、ABMからデバイス管理の割り当てがされてないデバイスや、ABMにて組織からの所有が解除されたデバイス情報などは、Jamf上にはデータが存在しないため、それらを含めたABM側のデータを用いた情報取得の検証となります)

作業の流れと参考資料

以下の手順で進めました。

  1. APIアカウントの作成と認証情報の取得
  2. API認証情報を使用しての接続準備
  3. デバイス情報の取得。(今回は以下のAPIエンドポイントを使用しました)
    Get Device Information

また、以下を参考に作業を行いました。

以下に、それぞれ作業の詳細を記載します。

APIアカウントの作成と認証情報の取得

Apple Businessへ「組織管理者」の権限を持つユーザでサインインします。(「組織管理者」の権限を持たないユーザでは、以下のAPI設定は表示されませんでした)

右上の組織名が表記されているドロップダウンより「設定」を選択します。
1
統合から「API」を選択し、更に「APIアカウントを追加」をクリックします。
2
以下のように表示されます。「APIアカウント名」は任意の名称を入力します。「役割アクセス」は以下に表記のものから選択可能でしたが、今回は「デバイス管理マネージャ」を選択しました。今回の目的はデバイス情報の取得のためです。
3
なお、未検証ですが、「読み取りのみ許可」や「読み取りと書き込みが許可」というような制限はされないように見受けられました。今回のケースであれば、「デバイス情報の読み取り」のみ実施できれば問題ないですが、「デバイス管理マネージャ」の権限だと、デバイス管理に関するAPIで更新処理も可能なように考えられましたので、この点は利用時に注意が必要と考えました。

入力をしたら「次へ」をクリックします
4

「秘密鍵を生成」と表示されます。「生成してダウンロード」をクリックします。<APIアカウント名>.pem のファイルがダウンロードされます。適切にアクセス制限が可能な方法で保管します。
5
以下の画面に戻ります。作成したAPIアカウントが表示されているので「編集」ボタンをクリックします。
6
以下のような内容が表示されます。(検証はしていませんが、APIアカウント名と役割アクセスは変更可能なように見えました)
ここでは、「クライアントID」と秘密鍵の「キーID」を控えて、キャンセルで閉じます。(「クライアントID」と「キーID」は以降の手順で利用します)
7
8

API認証情報を使用しての接続準備

以下でPythonスクリプトを実行しますが、今回はmacOS26.6.1、Python 3.14.6で確認しています。

まず、以下のサイトの「Create a client assertion」の項目に記載されているPythonスクリプトをコピーして、今回の処理を行う作業用ディレクトリにPythonファイルとして保存します。今回は例として、ab_api.pyというファイル名で保存しました。

Implementing OAuth for the Apple School Manager and Apple Business API

また、Pythonスクリプトの以下の部分を変更する必要があるため、適宜変更してください。

private_key_file = "秘密鍵ファイルのファイル名(xxx.pem)へ変更"
client_id = "上記で控えた「クライアントID」へ変更"
team_id = "上記で控えた「クライアントID」へ変更"
key_id = "上記で控えた「キーID」へ変更"

Pythonスクリプトを保存したディレクトリ内に、秘密鍵ファイル(xxx.pem)を保存してください。

上記の「Create a client assertion」内に記載がありますが、PyJWTのライブラリがインストールされている必要があります。環境に応じて必要なライブラリをインストールしてください。今回の検証環境では以下のように対応しました。

python3 -m venv ab
source ab/bin/activate
pip3 install pyjwt cryptography

次にスクリプトを実行します。

python3 ab_api.py

以下のような警告は表示されますが、カレントディレクトリに client_assertion.txt(クライアントアサーション)が出力されます。

python3 abm_api.py
ab_api.py:17: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
issued_at_timestamp = int(datetime.datetime.utcnow().timestamp())

クライアントアサーションを使用して、アクセストークンを取得します。
以下で、「client_id=xxxxx」 の xxxxx の部分は、上記のクライアントIDに置き換えます。

CLIENT_ASSERTION=$(cat client_assertion.txt)

curl -X POST \
  -H 'Host: account.apple.com' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  "https://account.apple.com/auth/oauth2/token?grant_type=client_credentials&client_id=xxxxx&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion=${CLIENT_ASSERTION}&scope=business.api"

以下のような形式のアクセストークンが出力されます。

{"access_token":"xxxxx","token_type":"Bearer","expires_in":3600,"scope":"business.api"}

expires_in で表記されているように有効期限は、3600秒(1時間)です。有効期限が切れた後は、アクセストークンの再取得が必要となります。

デバイス情報の取得

以下のAPIエンドポイントを使用して情報取得を確認しましたが、確認のための簡単なスクリプトを用意しました。
Get Device Information

まず、上記で出力されたアクセストークン(上記例の"access_token":"xxxxx"の xxxx の部分)を、tmp-token.txtファイルへ保存します。次に、以下のようなシェルスクリプトを作成します。

#!/bin/bash

ACCESS_TOKEN=$(cat tmp-token.txt)
SERIAL_NUMBER="$1"

curl -s -X GET \
  "https://api-business.apple.com/v1/orgDevices/${SERIAL_NUMBER}" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" | jq

デバイスのシリアルNo.を引数として、デバイスの情報を取得します。
シェルスクリプトのファイル名を check_device.sh として、以下のように実行します。

./check_device.sh <デバイスのシリアルNo>

正常に情報取得することができました。以下に取得したデータのサンプルを記載します。

まず、以下のようなMacBookの情報を取得しました。こちらは、組織所有がされていて、デバイス管理サービス(Jamf)へも割り当てられているデバイスです。
9
以下のようなデータが取得されました。

{
  "data": {
    "type": "orgDevices",
    "id": "XXXXXXXXXX",
    "attributes": {
      "productFamily": "Mac",
      "orderDateTime": "2026-05-25T07:00:00Z",
      "meid": [],
      "eid": "",
      "serialNumber": "XXXXXXXXXX",
      "orderNumber": "XXXXXXXXXX",
      "color": "SILVER",
      "isMdmMigrationCapable": true,
      "purchaseSourceType": "APPLE",
      "deviceCapacity": "512GB",
      "mdmMigrationStatus": null,
      "updatedDateTime": "2026-05-27T14:54:32.523Z",
      "wifiMacAddress": "XXXXXXXXXX",
      "releasedFromOrgDateTime": null,
      "ethernetMacAddress": [],
      "bluetoothMacAddress": "XXXXXXXXXX",
      "imei": [],
      "deviceModel": "MacBook Air (13-inch, M5)",
      "partNumber": "XXXXXXXXXX",
      "addedToOrgDateTime": "2026-05-27T14:54:32.523Z",
      "productType": "Mac17,3",
      "purchaseSourceId": "XXXXXXXXXX",
      "mdmMigrationDeadlineDateTime": null,
      "status": "ASSIGNED"
    },
    "relationships": {
      "assignedServer": {
        "links": {
          "self": "https://api-business.apple.com/v1/orgDevices/XXXXXXXXXX/relationships/assignedServer",
          "related": "https://api-business.apple.com/v1/orgDevices/XXXXXXXXXX/assignedServer"
        }
      },
      "appleCareCoverage": {
        "links": {
          "related": "https://api-business.apple.com/v1/orgDevices/XXXXXXXXXX/appleCareCoverage"
        }
      }
    },
    "links": {
      "self": "https://api-business.apple.com/v1/orgDevices/XXXXXXXXXX"
    }
  },
  "links": {
    "self": "https://api-business.apple.com/v1/orgDevices/XXXXXXXXXX"
  }
}

次に、組織所有が解除されたデバイスの情報を取得してみました。

11

{
  "data": {
    "type": "orgDevices",
    "id": "XXXXXXXXXX",
    "attributes": {
      "productFamily": "Mac",
      "orderDateTime": "2023-05-16T07:00:00Z",
      "meid": [],
      "eid": "",
      "serialNumber": "XXXXXXXXXX",
      "orderNumber": "XXXXXXXXXX",
      "color": "SPACE GRAY",
      "isMdmMigrationCapable": false,
      "purchaseSourceType": "APPLE",
      "deviceCapacity": "512GB",
      "mdmMigrationStatus": null,
      "updatedDateTime": "2026-08-19T04:20:22.617Z",
      "wifiMacAddress": "XXXXXXXXXX",
      "releasedFromOrgDateTime": "2026-08-19T04:20:22.617Z",
      "ethernetMacAddress": [],
      "bluetoothMacAddress": "XXXXXXXXXX",
      "imei": [],
      "deviceModel": "MacBook Pro (14-inch, 2023)",
      "partNumber": "XXXXXXXXXX",
      "addedToOrgDateTime": "2023-05-22T14:22:46.02Z",
      "productType": "Mac14,5",
      "purchaseSourceId": "XXXXXXXXXX",
      "mdmMigrationDeadlineDateTime": null,
      "status": "DEVICE_ASSIGNMENT_UNKNOWN"
    },
    "relationships": {
      "assignedServer": {
        "links": {
          "self": "https://api-business.apple.com/v1/orgDevices/XXXXXXXXXX/relationships/assignedServer",
          "related": "https://api-business.apple.com/v1/orgDevices/XXXXXXXXXX/assignedServer"
        }
      },
      "appleCareCoverage": {
        "links": {
          "related": "https://api-business.apple.com/v1/orgDevices/XXXXXXXXXX/appleCareCoverage"
        }
      }
    },
    "links": {
      "self": "https://api-business.apple.com/v1/orgDevices/XXXXXXXXXX"
    }
  },
  "links": {
    "self": "https://api-business.apple.com/v1/orgDevices/XXXXXXXXXX"
  }
}

「組織所有がされていて、デバイス管理サービスに割り当てされているデバイス」と、「組織所有が解除されているデバイス」では以下の項目の値に違いがあるようでした。

  • releasedFromOrgDateTime
    • 組織所有がされていて、デバイス管理サービスに割り当てされているデバイス:null
    • 組織所有が解除されているデバイス:解除日時
  • status
    • 組織所有がされていて、デバイス管理サービスに割り当てされているデバイス:ASSIGNED
    • 組織所有が解除されているデバイス:DEVICE_ASSIGNMENT_UNKNOWN

おわりに

Apple Business API を使用して、デバイス情報取得の検証を行なった際の内容を記載しました。この記事が皆様のお役に立てば幸いです。

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。
※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

関連記事