App Store Connect Automation
JWT API + Playwright hybrid for ASC tasks.
Prerequisites
# API Key from App Store Connect
export ASC_KEY_ID="xxx"
export ASC_ISSUER_ID="xxx"
export ASC_PRIVATE_KEY_PATH="~/.appstore/AuthKey_xxx.p8"
Quick Reference
Generate JWT
# JWT valid for 20 minutes
jwt encode --alg ES256 \
--kid $ASC_KEY_ID \
--iss $ASC_ISSUER_ID \
--exp "+20min" \
--secret @$ASC_PRIVATE_KEY_PATH
List Apps
curl -H "Authorization: Bearer $JWT" \
"https://api.appstoreconnect.apple.com/v1/apps"
Get Builds
curl -H "Authorization: Bearer $JWT" \
"https://api.appstoreconnect.apple.com/v1/builds?filter[app]=$APP_ID"
Submit for Review
curl -X POST -H "Authorization: Bearer $JWT" \
-H "Content-Type: application/json" \
-d '{"data":{"type":"appStoreVersionSubmissions","relationships":{"appStoreVersion":{"data":{"type":"appStoreVersions","id":"$VERSION_ID"}}}}}' \
"https://api.appstoreconnect.apple.com/v1/appStoreVersionSubmissions"
Common Workflows
TestFlight Distribution
- Upload build (via Xcode/fastlane)
- Wait for processing
- Add to test group
- Notify testers
App Submission
- Create new version
- Upload screenshots
- Fill metadata
- Submit for review
Playwright Fallback
For UI-only features (screenshot ordering, promo text):
await page.goto('https://appstoreconnect.apple.com')
await page.fill('#account_name_text_field', email)
// ... automation
Rate Limits
- 3600 requests/hour per key
- Use pagination for large lists
