Apple Business API を使用して、デバイス情報取得の検証
概要
Apple Business(旧 Apple Business Manager(ABM))に登録されているデバイス(Mac, iphone等)の情報は、Apple BusinessのWebポータルより確認が可能ですが、多数登録されているデバイス情報の一括取得や棚卸、定期チェックを自動化することを検討しました。そこで、Apple Business API を使用したデバイス情報の取得を先ずは検証しましたので、その際の内容を記載します。
(当社ではMDMとしてJamfを利用していますが、ABMからデバイス管理の割り当てがされてないデバイスや、ABMにて組織からの所有が解除されたデバイス情報などは、Jamf上にはデータが存在しないため、それらを含めたABM側のデータを用いた情報取得の検証となります)
作業の流れと参考資料
以下の手順で進めました。
- APIアカウントの作成と認証情報の取得
- API認証情報を使用しての接続準備
- デバイス情報の取得。(今回は以下のAPIエンドポイントを使用しました)
Get Device Information
また、以下を参考に作業を行いました。
- APIアカウントの作成と認証情報の取得: Apple BusinessでAPIアカウントを作成する
- API認証情報を使用しての接続準備: Implementing OAuth for the Apple School Manager and Apple Business API
- Apple Business APIの一覧:Apple Business API
以下に、それぞれ作業の詳細を記載します。
APIアカウントの作成と認証情報の取得
Apple Businessへ「組織管理者」の権限を持つユーザでサインインします。(「組織管理者」の権限を持たないユーザでは、以下のAPI設定は表示されませんでした)
右上の組織名が表記されているドロップダウンより「設定」を選択します。

統合から「API」を選択し、更に「APIアカウントを追加」をクリックします。

以下のように表示されます。「APIアカウント名」は任意の名称を入力します。「役割アクセス」は以下に表記のものから選択可能でしたが、今回は「デバイス管理マネージャ」を選択しました。今回の目的はデバイス情報の取得のためです。

なお、未検証ですが、「読み取りのみ許可」や「読み取りと書き込みが許可」というような制限はされないように見受けられました。今回のケースであれば、「デバイス情報の読み取り」のみ実施できれば問題ないですが、「デバイス管理マネージャ」の権限だと、デバイス管理に関するAPIで更新処理も可能なように考えられましたので、この点は利用時に注意が必要と考えました。
入力をしたら「次へ」をクリックします

「秘密鍵を生成」と表示されます。「生成してダウンロード」をクリックします。<APIアカウント名>.pem のファイルがダウンロードされます。適切にアクセス制限が可能な方法で保管します。

以下の画面に戻ります。作成したAPIアカウントが表示されているので「編集」ボタンをクリックします。

以下のような内容が表示されます。(検証はしていませんが、APIアカウント名と役割アクセスは変更可能なように見えました)
ここでは、「クライアントID」と秘密鍵の「キーID」を控えて、キャンセルで閉じます。(「クライアントID」と「キーID」は以降の手順で利用します)


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)へも割り当てられているデバイスです。

以下のようなデータが取得されました。
{
"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"
}
}
次に、組織所有が解除されたデバイスの情報を取得してみました。

{
"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月 アノテーション㈱から社名変更しました






