Skip to main content

Async Python client for the Apple Business API

Project description

applebusiness

Async Python client for the Apple Business API.

Install

pip install applebusiness

Requires Python 3.14+.

Authentication

You need an API key generated in Apple Business Manager. The client uses the OAuth 2.0 client-credentials flow with a JWT client assertion signed by your private key. See Implementing OAuth for the Apple School Manager and Apple Business API.

You'll need:

  • key_id — the key identifier from Apple Business Manager
  • client_id — your API account's client ID
  • private_key_pem — the PEM-encoded EC private key

Usage

import asyncio
from applebusiness import Client

async def main():
    async with Client(key_id, client_id, private_key_pem) as client:
        devices = await client.get_org_devices()
        for device in devices.data:
            print(device.id, device.attributes.serialNumber)

asyncio.run(main())

Token caching

By default, OAuth tokens are cached in memory on the Client instance. To share tokens across processes (e.g. via Redis), subclass Client and override _get_cached_token / _set_cached_token:

class RedisClient(Client):
    async def _get_cached_token(self):
        raw = await redis.get("ab-token")
        return json.loads(raw) if raw else None

    async def _set_cached_token(self, token):
        await redis.set("ab-token", json.dumps(token), ex=token["expires_in"])

Coverage

The client implements every Apple Business API endpoint documented as of this release:

  • Devicesget_org_devices, get_org_device, get_org_device_apple_care_coverage, get_mdm_devices, get_mdm_device_details
  • Device Management Servicesget_mdm_servers, get_mdm_server_device_ids, get_org_device_assigned_server_id, get_org_device_assigned_server, assign_devices_to_server, unassign_devices_from_server, get_org_device_activity
  • Usersget_users, get_user
  • User Groupsget_user_groups, get_user_group, get_user_group_user_ids
  • Apps & Packagesget_apps, get_app, get_packages, get_package
  • Blueprintsget_blueprints, create_blueprint, get_blueprint, update_blueprint, delete_blueprint, and get_blueprint_<rel>_ids add_<rel>_to_blueprint / remove_<rel>_from_blueprint for apps, configurations, packages, org_devices, users, user_groups
  • Configurationsget_configurations, create_configuration, get_configuration, update_configuration, delete_configuration
  • Auditget_audit_events

All responses are returned as typed Pydantic models (importable from the top-level applebusiness package).

Pagination

List endpoints accept limit and cursor for manual paging. Each response exposes meta.paging.nextCursor — pass it back as cursor to fetch the next page:

page = await client.get_org_devices(limit=100)
while page.meta.paging.nextCursor:
    page = await client.get_org_devices(
        limit=100, cursor=page.meta.paging.nextCursor
    )

To iterate every item across all pages, pass the bound list method to Client.paginate. Extra keyword arguments (e.g. limit, filters) are forwarded on every request:

async for device in client.paginate(client.get_org_devices, limit=200):
    print(device.id)

async for event in client.paginate(
    client.get_audit_events,
    start_timestamp="2026-01-01T00:00:00Z",
    end_timestamp="2026-02-01T00:00:00Z",
):
    ...

Activity polling

assign_devices_to_server and unassign_devices_from_server poll the resulting orgDeviceActivity until it leaves IN_PROGRESS. The polling timeout defaults to 300 seconds and raises TimeoutError when exceeded. To skip polling, pass wait=False; to wait indefinitely, pass timeout=None.

Errors

Non-2xx responses raise applebusiness.ClientError, which exposes the HTTP status and parsed ErrorResponse body.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

applebusiness-0.2.1.tar.gz (11.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

applebusiness-0.2.1-py3-none-any.whl (14.3 kB view details)

Uploaded Python 3

File details

Details for the file applebusiness-0.2.1.tar.gz.

File metadata

  • Download URL: applebusiness-0.2.1.tar.gz
  • Upload date:
  • Size: 11.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for applebusiness-0.2.1.tar.gz
Algorithm Hash digest
SHA256 ef544781864e6afdf90d394572194577cd1719fc2f560e54d769cfdfdbf70628
MD5 412b70d570ac624f1a0711af2e74cab3
BLAKE2b-256 c00a39c2388c253d701d94333ef1f0c882de2b533f2dd7cc33fccde1b2333b87

See more details on using hashes here.

Provenance

The following attestation bundles were made for applebusiness-0.2.1.tar.gz:

Publisher: publish.yml on merlinz01/applebusiness

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file applebusiness-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: applebusiness-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 14.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for applebusiness-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f852383b85f07367e4ccb81a0447aa0d43a59fad7bf4deca17fb75267ff0bbe4
MD5 3fe68bdb7a5b95843e6d33f073e611a0
BLAKE2b-256 cb8ed22717dc9fc68ce71227936bb2f0e10c403a9ffce5955759206cda9fabff

See more details on using hashes here.

Provenance

The following attestation bundles were made for applebusiness-0.2.1-py3-none-any.whl:

Publisher: publish.yml on merlinz01/applebusiness

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page