fn testConnection()
Sign a token and read one team member, proving the key, the Issuer ID, and the key's role all work
fn sync(expiringWithinDays?: number)
Roll up the whole team in one call: members by role, pending invitations, devices by class and status, and every certificate or profile that has expired or expires within `expiringWithinDays`. The quickest way to catch a signing asset before it lapses — an expired development profile makes a tvOS or iOS app silently refuse to launch.
| Argument | Type | Required | Description |
|---|
| expiringWithinDays? | number | no | Flag certificates and profiles expiring within this many days |
fn listUsers(limit?: number, maxPages?: number, selector?: string)
List team members with their roles, whether they can see all apps, and provisioningAllowed (the 'Access to Certificates, Identifiers & Profiles' permission)
| Argument | Type | Required | Description |
|---|
| limit? | number | no | Records per page. App Store Connect caps these collections at 200 |
| maxPages? | number | no | Page ceiling, so a large team can't run unbounded |
| selector? | string | no | Optional CEL predicate filtered client-side over each flattened record, e.g. certificateType == "DEVELOPMENT" |
fn listUserInvitations(limit?: number, maxPages?: number, selector?: string)
List invitations that have been sent but not yet accepted
| Argument | Type | Required | Description |
|---|
| limit? | number | no | Records per page. App Store Connect caps these collections at 200 |
| maxPages? | number | no | Page ceiling, so a large team can't run unbounded |
| selector? | string | no | Optional CEL predicate filtered client-side over each flattened record, e.g. certificateType == "DEVELOPMENT" |
fn inviteUser(email: string, firstName: string, lastName: string, roles?: array, provisioningAllowed?: boolean, allAppsVisible?: boolean)
Invite someone to the team by email with the given roles. provisioningAllowed grants 'Access to Certificates, Identifiers & Profiles', which a DEVELOPER needs before Xcode can create their signing certificate. Apple emails the invitation; the person accepts with an existing Apple ID or creates one. Idempotent: when the email already has a pending invitation or is already a team member, nothing is sent and the existing record is returned with noop set.
| Argument | Type | Required | Description |
|---|
| email | string | yes | |
| firstName | string | yes | |
| lastName | string | yes | |
| roles? | array | no | |
| provisioningAllowed? | boolean | no | |
| allAppsVisible? | boolean | no | |
fn cancelUserInvitation(id: string)
Cancel a pending invitation by its id (from listUserInvitations), so the emailed link stops working. An invitation that is already gone (accepted, expired, or cancelled) is reported with noop set rather than failing.
| Argument | Type | Required | Description |
|---|
| id | string | yes | |
fn updateUser(id: string, roles?: array, provisioningAllowed?: boolean, allAppsVisible?: boolean)
Change an existing member's roles, provisioningAllowed, or allAppsVisible. Only the fields you pass change. Removing a member is deliberately not wrapped; do that in App Store Connect.
| Argument | Type | Required | Description |
|---|
| id | string | yes | User id from listUsers |
| roles? | array | no | |
| provisioningAllowed? | boolean | no | |
| allAppsVisible? | boolean | no | |
fn listDevices(limit?: number, maxPages?: number, selector?: string)
List registered development devices with UDID, deviceClass (APPLE_TV, IPHONE, IPAD, MAC...), model, and ENABLED/DISABLED status. Apple allows 100 per device class per membership year.
| Argument | Type | Required | Description |
|---|
| limit? | number | no | Records per page. App Store Connect caps these collections at 200 |
| maxPages? | number | no | Page ceiling, so a large team can't run unbounded |
| selector? | string | no | Optional CEL predicate filtered client-side over each flattened record, e.g. certificateType == "DEVELOPMENT" |
fn registerDevice(name: string, udid: string, platform?: enum)
Register a development device by UDID so new development profiles include it. Apple TV and iPhone/iPad use platform IOS; Macs use MAC_OS. Registration counts against the yearly per-class limit even if the device is later disabled. Idempotent: a UDID that is already registered is returned with noop set, without spending a slot.
| Argument | Type | Required | Description |
|---|
| name | string | yes | |
| udid | string | yes | Hardware UDID, e.g. 00008110-000A1B2C3D4E5F60 for an Apple TV 4K (3rd gen) |
| platform? | enum | no | |
fn updateDevice(id: string, name?: string, status?: enum)
Rename a registered device or set its status to ENABLED or DISABLED (by device id from listDevices). A disabled device drops out of new profiles but still counts against the yearly per-class limit; Apple does not allow deleting a registration.
| Argument | Type | Required | Description |
|---|
| id | string | yes | Device id from listDevices |
| name? | string | no | |
| status? | enum | no | |
fn listCertificates(limit?: number, maxPages?: number, selector?: string)
List signing certificates with type, owner display name, serial number, expirationDate, and daysToExpiry
| Argument | Type | Required | Description |
|---|
| limit? | number | no | Records per page. App Store Connect caps these collections at 200 |
| maxPages? | number | no | Page ceiling, so a large team can't run unbounded |
| selector? | string | no | Optional CEL predicate filtered client-side over each flattened record, e.g. certificateType == "DEVELOPMENT" |
fn listProfiles(limit?: number, maxPages?: number, selector?: string)
List provisioning profiles with type (e.g. TVOS_APP_DEVELOPMENT), state (ACTIVE/INVALID), UUID, expirationDate, and daysToExpiry. Xcode-managed team profiles (automatic signing) are not returned by the API; this lists only profiles created in the portal or through the API.
| Argument | Type | Required | Description |
|---|
| limit? | number | no | Records per page. App Store Connect caps these collections at 200 |
| maxPages? | number | no | Page ceiling, so a large team can't run unbounded |
| selector? | string | no | Optional CEL predicate filtered client-side over each flattened record, e.g. certificateType == "DEVELOPMENT" |
fn listBundleIds(limit?: number, maxPages?: number, selector?: string)
List registered bundle identifiers with platform and seed id
| Argument | Type | Required | Description |
|---|
| limit? | number | no | Records per page. App Store Connect caps these collections at 200 |
| maxPages? | number | no | Page ceiling, so a large team can't run unbounded |
| selector? | string | no | Optional CEL predicate filtered client-side over each flattened record, e.g. certificateType == "DEVELOPMENT" |
fn request(method?: enum, path: string, query?: string, body?: string)
Authenticated passthrough to any App Store Connect API path, for endpoints this model does not wrap yet. Handles token signing, retries, and error decoding; you supply the method, path, and optional body.
| Argument | Type | Required | Description |
|---|
| method? | enum | no | |
| path | string | yes | API-relative path beginning with /v1, e.g. /v1/bundleIds/ABC/bundleIdCapabilities |
| query? | string | no | Optional query string, e.g. limit=200&filter[platform]=IOS |
| body? | string | no | Optional JSON request body as a string |
Resources
team(30d)— Team rollup — members and pending invitations, devices by class and status, and the certificates and profiles that are expired or expiring soon
collection(30d)— A list of one kind of team object (users, userInvitations, devices, certificates, profiles, bundleIds). Records with an expirationDate carry daysToExpiry
change(365d)— The result of a write — an invitation sent or cancelled, a user's roles changed, or a device registered or updated. noop is true when nothing was sent because the target was already in the requested state
response(7d)— Raw response from the generic authenticated passthrough