{"registry_version":"2026.1025.387","generated_at":"2026-10-25T06:27:00Z","content_sha256":"089d16f627d9365e3d0663cc8069203706d7cb23a76c332226e29686968811a5","signed":true,"signature":{"key_id":"ed25519:74ca19268e364242","algorithm":"ed25519","expires_at":"2026-11-24T06:27:09Z","expired":false,"manifest":"/registry/manifest.json"},"id":"apple/app-store-connect-api","name":"App Store Connect API key","vendor":"Apple","status":"researched","last_verified":null,"last_researched":"2026-10-25","summary":"Get programmatic access to App Store Connect (builds, TestFlight, metadata, users, provisioning, reports). The Account Holder requests API access once; Apple reviews it; then Admins create team keys (or users create individual keys) whose private .p8 half is downloadable only once and signs 20-minute JWTs.","account_model":{"summary":"API access is switched on per App Store Connect team (one per developer membership) by the Account Holder. Team keys belong to the team, carry a role (e.g. Admin, App Manager, Developer) and see all apps; individual keys inherit one user's apps and permissions.","accounts":[{"name":"Apple Developer Program membership / App Store Connect team","kind":"developer","owned_by":"the company (or individual developer)","required":true},{"name":"Account Holder","kind":"personal","parent":"Apple Developer Program membership / App Store Connect team","required":true,"note":"Only role that can request API access."},{"name":"Admin user","kind":"personal","parent":"Apple Developer Program membership / App Store Connect team","required":false,"note":"Can generate and revoke team keys after access is approved."}],"notes":["Team keys cannot be limited to particular apps; pick the narrowest role that works.","Individual keys cannot use Provisioning endpoints."]},"prerequisites":[{"entry":"apple/developer-program-org","note":"An active membership; individual memberships can also request access."}],"identity_requires":[],"have_ready":[{"kind":"other","description":"The Account Holder available to sign in and accept the API terms.","why":"Only the Account Holder can request access.","needed_for":["request-access"],"auto_check":"none","source_url":"https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api/"},{"kind":"other","description":"A secret store ready for the .p8 file and the decision on which role the key needs.","why":"The key downloads once; its role cannot be changed later.","needed_for":["generate-team-key","download-key"],"auto_check":"none","source_url":"https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api/"}],"steps":[{"id":"sign-in","title":"Sign in to App Store Connect","summary":"Sign in as the Account Holder (first time) or an Admin.","route":"guided","gate":"2fa","human_only":true,"gate_label":"You enter a 2-step code","depends_on":[],"optional":false,"url":"https://appstoreconnect.apple.com/","lead_time":null,"preflight":[],"captures":null},{"id":"request-access","title":"Request API access (Account Holder, once per team)","summary":"In Users and Access > Integrations, click Request Access, tick the box to agree to the terms and submit.","route":"guided","gate":"human_terms","human_only":true,"gate_label":"You accept the terms","depends_on":["sign-in"],"optional":false,"url":"https://appstoreconnect.apple.com/","lead_time":null,"preflight":[],"captures":null},{"id":"access-review","title":"Wait for Apple to approve access","summary":"Apple reviews and approves requests case by case. Team Keys appear once approved.","route":"guided","gate":"third_party_review","human_only":true,"gate_label":"The provider reviews it","depends_on":["request-access"],"optional":false,"url":null,"lead_time":{"official":{"text":"Reviewed and approved on a case-by-case basis; no timeline published.","source_url":"https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api/","source_title":"App Store Connect API - Get started - App Store Connect Help"},"reported":null,"typical_minutes":null},"preflight":[],"captures":null},{"id":"generate-team-key","title":"Generate a team API key","summary":"Users and Access > Integrations > App Store Connect API > Team Keys > Generate API Key (+). Name it and choose the role. Name and role cannot be edited later; revoke and recreate to change them.","route":"guided","gate":"human_submit","human_only":true,"gate_label":"You press submit","depends_on":["access-review"],"optional":false,"url":"https://appstoreconnect.apple.com/","lead_time":null,"preflight":[],"captures":null},{"id":"download-key","title":"Download the private key once","summary":"Click Download API Key next to the new key and store the AuthKey_<KEY_ID>.p8 file in your secret store. The link disappears after one download.","route":"guided","gate":"none","human_only":false,"gate_label":null,"depends_on":["generate-team-key"],"optional":false,"url":null,"lead_time":null,"preflight":[],"captures":"APP_STORE_CONNECT_API_PRIVATE_KEY"},{"id":"record-ids","title":"Copy the Issuer ID and Key ID","summary":"The Issuer ID is shown near the top of the Integrations page; the Key ID is listed under Active keys.","route":"guided","gate":"none","human_only":false,"gate_label":null,"depends_on":["generate-team-key"],"optional":false,"url":"https://appstoreconnect.apple.com/","lead_time":null,"preflight":[],"captures":null},{"id":"individual-key","title":"Or generate an individual key","summary":"From your user profile in App Store Connect, generate an Individual API Key (one active key per user); it carries your own permissions.","route":"guided","gate":"human_submit","human_only":true,"gate_label":"You press submit","depends_on":["access-review"],"optional":true,"url":null,"lead_time":null,"preflight":[],"captures":null},{"id":"sign-tokens","title":"Sign request tokens","summary":"Sign an ES256 JWT with kid = Key ID and payload iss = Issuer ID, iat, exp (no more than 20 minutes ahead), aud = appstoreconnect-v1, optionally scope to limit requests. Send as a Bearer token.","route":"guided","gate":"none","human_only":false,"gate_label":null,"depends_on":["download-key","record-ids"],"optional":false,"url":null,"lead_time":null,"preflight":[],"captures":null}],"gates":[{"step":"sign-in","gate":"2fa","label":"You enter a 2-step code"},{"step":"request-access","gate":"human_terms","label":"You accept the terms"},{"step":"access-review","gate":"third_party_review","label":"The provider reviews it"},{"step":"generate-team-key","gate":"human_submit","label":"You press submit"},{"step":"individual-key","gate":"human_submit","label":"You press submit"}],"lead_times":[{"step":"access-review","what":"Wait for Apple to approve access","official":{"text":"Reviewed and approved on a case-by-case basis; no timeline published.","source_url":"https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api/","source_title":"App Store Connect API - Get started - App Store Connect Help"},"reported":null}],"outputs":[{"name":"APP_STORE_CONNECT_ISSUER_ID","description":"Issuer ID for team keys (UUID).","secret":false,"example_format":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","environments":null},{"name":"APP_STORE_CONNECT_KEY_ID","description":"Key ID of the API key (JWT kid).","secret":false,"example_format":"ABC123DEFG","environments":null},{"name":"APP_STORE_CONNECT_API_PRIVATE_KEY","description":"The .p8 private key that signs API tokens. Secret; Apple keeps no copy.","secret":true,"example_format":"contents of AuthKey_<KEY_ID>.p8","environments":null}],"renewals":[{"what":"API request token (JWT) - regenerate before it expires (max 20 minutes ahead for most resources)","every":"20 minutes","every_days":null,"source_url":"https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests"}],"estimated_minutes":null,"guide_url":"https://verapli.com/guides/apple/app-store-connect-api"}