A fast, scriptable CLI for App Store Connect built with Bun and TypeScript.
Manage apps, builds, TestFlight, metadata, screenshots, signing, reports, and more from your terminal or CI pipeline.
npm install -g @onmyway133/asc-cliYou'll need an App Store Connect API key — create one here.
# Interactive (prompts for missing values)
asc auth login
# Non-interactive
asc auth login \
--key-id YOUR_KEY_ID \
--issuer-id YOUR_ISSUER_ID \
--private-key ~/Downloads/AuthKey_XXXXXX.p8 \
--name personalThe private key is stored in the macOS Keychain automatically. Use --bypass-keychain to store the file path in ~/.asc/credentials.json instead.
# Add profiles
asc auth login --name work --key-id K1 --issuer-id I1 --private-key ~/.asc/work.p8
asc auth login --name client --key-id K2 --issuer-id I2 --private-key ~/.asc/client.p8
# List all profiles
asc auth list
# Switch active profile
asc auth use work # non-interactive
asc auth use # interactive selector
# Use a specific profile for one command
asc apps list --profile client
# Show current profile
asc auth status --validateasc auth profile view # view active profile
asc auth profile view work # view specific profile
asc auth profile update --rename koa # rename active profile
asc auth profile update work --rename koa # rename specific profile
asc auth profile update --vendor-number 12345678
asc auth profile delete work| Variable | Description |
|---|---|
ASC_KEY_ID |
API Key ID (overrides active profile) |
ASC_ISSUER_ID |
Issuer ID UUID (overrides active profile) |
ASC_PRIVATE_KEY_PATH |
Path to .p8 file (overrides active profile) |
ASC_PRIVATE_KEY |
Inline PEM content (overrides active profile) |
ASC_PROFILE |
Profile name to use (equivalent to --profile) |
ASC_BYPASS_KEYCHAIN |
Set to 1 to skip Keychain storage |
asc apps list [--output table|json]
asc apps get <app-id>asc builds list [--app-id <id>] [--version <v>] [--platform ios|macos|tvos|visionos]
asc builds get <build-id>
asc builds update-beta-notes --build-id <id> --locale en-US --notes "What's new"asc versions list --app-id <id> [--platform ios]
asc versions create --app-id <id> --version 2.0.0 [--platform ios]
asc versions submit <version-id>asc testflight groups list [--app-id <id>]
asc testflight testers list --group-id <id>
asc testflight testers add --group-id <id> --email user@example.com
asc testflight testers remove --group-id <id> --tester-id <id>asc metadata list --version-id <id>
asc metadata update --version-id <id> --locale en-US --whats-new "Bug fixes"
asc metadata update --version-id <id> --locale en-US --description "New description" --keywords "photo,edit"# List localization IDs for each locale in a version
asc localizations list --version-id <id>
# Update description/keywords/what's new for a specific locale
asc localizations update <localization-id> --description "..." --keywords "photo,edit" --whats-new "..."
asc localizations update <localization-id> --promotional-text "Limited time sale!"
# Create a new locale or delete one
asc localizations create --version-id <id> --locale fr-FR --description "..." --keywords "..."
asc localizations delete <localization-id>asc reviews list --app-id <id>
asc reviews get <review-id>
asc reviews respond --review-id <id> --message "Thank you for your feedback!"asc pricing schedule get --app-id <id>
asc pricing schedule set --app-id <id> --base-territory USA --price-point-id <id>
# Per-territory pricing (e.g. Big Mac Index / PPP)
asc pricing set-manual --app-id <id> --base-territory USA --prices 'USA:ppId1,GBR:ppId2,EUR:ppId3,AUS:ppId4'
asc pricing points list --app-id <id>
asc pricing points list --app-id <id> --territory GBR
asc pricing territories listasc iap list --app-id <id>
asc iap get <iap-id>
asc iap create --app-id <id> --name "Premium" --product-id "com.example.premium" --type CONSUMABLE
asc iap delete <iap-id>asc subscriptions groups list --app-id <id>
asc subscriptions groups create --app-id <id> --name "Pro"
asc subscriptions list --group-id <id>
asc subscriptions get <subscription-id>
asc subscriptions create --group-id <id> --name "Monthly" --product-id "com.example.monthly"
asc subscriptions prices list --subscription-id <id>asc signing certificates list
asc signing certificates get <certificate-id>
asc signing certificates revoke <certificate-id>
asc signing devices list
asc signing devices register --name "My iPhone" --udid <udid> --platform IOS
asc signing bundle-ids list
asc signing bundle-ids register --identifier "com.example.app" --name "My App" --platform IOS
asc signing profiles list
asc signing profiles delete <profile-id>asc reports sales --vendor-number 12345678 --frequency DAILY --date 2024-03-01
asc reports finance --vendor-number 12345678 --region US --date 2024-03
asc reports analytics list --app-id <id>
asc reports analytics request --app-id <id>asc xcode-cloud products list --app-id <id>
asc xcode-cloud workflows list --product-id <id>
asc xcode-cloud workflows get <workflow-id>
asc xcode-cloud builds list --product-id <id>
asc xcode-cloud builds run --workflow-id <id>
asc xcode-cloud artifacts list --build-id <id>
asc xcode-cloud test-results list --build-id <id>asc game-center achievements list --app-id <id>
asc game-center achievements get <achievement-id>
asc game-center leaderboards list --app-id <id>
asc game-center leaderboard-sets list --app-id <id>asc beta-review submit --build-id <id>
asc beta-review status <submission-id>
asc beta-review detail-get --build-id <id>
asc beta-review detail-update --build-id <id> --contact-email test@example.com
asc beta-review notify --build-id <id>
asc beta-review localizations list --build-id <id>All list commands support --output table (default in TTY) or --output json (default in pipes/CI):
asc apps list --output json | jq '.[].bundleId'# Get full command tree as structured JSON
asc --help --json- Credentials stored in
~/.asc/credentials.json(permissions0600) - Private keys stored in macOS Keychain via the
securityCLI (no extra dependencies) - Use
--bypass-keychainorASC_BYPASS_KEYCHAIN=1to store the key file path in JSON instead - For CI: use
ASC_KEY_ID,ASC_ISSUER_ID,ASC_PRIVATE_KEY_PATHenv vars
MIT