A fast, lightweight, and scriptable CLI for App Store Connect. Automate your iOS app workflows from your IDE/terminal.
| Problem | Solution |
|---|---|
| Manual App Store Connect work | Automate everything from CLI |
| Slow, heavy tooling | Single Go binary, instant startup |
| Poor scripting support | JSON output, explicit flags, clean exit codes |
Apps shipping with asc-cli. Add yours via PR!
Agent Skills for automating asc workflows including builds, TestFlight, metadata sync, submissions, and signing. https://github.com/rudrankriyam/app-store-connect-cli-skills
- Why ASC?
- ASC Skills
- Quick Start
- Commands
- Scripting Tips
- TestFlight
- Beta Groups
- Beta Testers
- Devices
- App Store
- App Tags
- App Events
- Alternative Distribution
- Analytics & Sales
- Finance Reports
- Sandbox Testers
- Xcode Cloud
- Notarization
- Game Center
- Signing
- Certificates
- Profiles
- Bundle IDs
- Subscriptions
- In-App Purchases
- Performance
- Webhooks
- Publish (End-to-End Workflows)
- App Clips
- Encryption
- Assets (Screenshots & Previews)
- Background Assets
- Routing Coverage
- Notify
- Apps & Builds
- App Setup
- Design Philosophy
- Installation
- Documentation
- How to test in <10 minutes
- Security
- Contributing
- License
- Author
- Star History
# Via Homebrew (recommended)
brew tap rudrankriyam/tap
brew install rudrankriyam/tap/asc
# Install script (macOS/Linux)
curl -fsSL https://raw.githubusercontent.com/rudrankriyam/App-Store-Connect-CLI/main/install.sh | bash
# Installs to ~/.local/bin by default (ensure it's on your PATH)
# Or build from source
git clone https://github.com/rudrankriyam/App-Store-Connect-CLI.git
cd App-Store-Connect-CLI
make build
./asc --helpasc checks for updates on startup and auto-updates when installed via the GitHub release install script. Homebrew installs will show a brew upgrade hint instead. Disable update checks with --no-update or ASC_NO_UPDATE=1.
# Register your App Store Connect API key
asc auth login \
--name "MyApp" \
--key-id "ABC123" \
--issuer-id "DEF456" \
--private-key /path/to/AuthKey.p8
# Validate credentials via network during login
asc auth login \
--network \
--name "MyApp" \
--key-id "ABC123" \
--issuer-id "DEF456" \
--private-key /path/to/AuthKey.p8
# Skip JWT + network validation (useful in CI)
asc auth login \
--skip-validation \
--name "MyApp" \
--key-id "ABC123" \
--issuer-id "DEF456" \
--private-key /path/to/AuthKey.p8
# Add another profile and switch defaults
asc auth login \
--name "ClientApp" \
--key-id "XYZ789" \
--issuer-id "LMN000" \
--private-key /path/to/ClientAuthKey.p8
asc auth switch --name "ClientApp"
# Use a profile for a single command
asc --profile "ClientApp" apps list
# Fail if credentials resolve from mixed sources
asc --strict-auth apps list
# Create a template config.json (global, no secrets)
asc auth init
# Create a repo-local config.json
asc auth init --local
# Store credentials in global config.json (bypass keychain)
asc auth login \
--bypass-keychain \
--name "MyApp" \
--key-id "ABC123" \
--issuer-id "DEF456" \
--private-key /path/to/AuthKey.p8
# Store credentials in repo-local config.json
asc auth login \
--bypass-keychain \
--local \
--name "MyApp" \
--key-id "ABC123" \
--issuer-id "DEF456" \
--private-key /path/to/AuthKey.p8Generate API keys at: https://appstoreconnect.apple.com/access/integrations/api
Open the API keys page in your browser:
asc auth init --openCredentials are stored in the system keychain when available, with a config fallback
at ~/.asc/config.json (restricted permissions). A repo-local ./.asc/config.json
takes precedence when present. Override with ASC_CONFIG_PATH. When
ASC_BYPASS_KEYCHAIN is set and environment credentials are fully provided, the
environment values take precedence over config.
Environment variable fallback:
ASC_KEY_IDASC_ISSUER_IDASC_PRIVATE_KEY_PATHASC_PRIVATE_KEY(raw key content; CLI writes a temp key file)ASC_PRIVATE_KEY_B64(base64 key content; CLI writes a temp key file)ASC_CONFIG_PATH(absolute path to config.json)ASC_PROFILEASC_BYPASS_KEYCHAIN(ignore keychain and use config/env auth)ASC_STRICT_AUTH(fail when credentials resolve from multiple sources)
Use --strict-auth or ASC_STRICT_AUTH=1 to fail when credentials are resolved from multiple sources.
App ID fallback:
ASC_APP_ID
Analytics & sales env:
ASC_VENDOR_NUMBER(Sales, Trends, and Finance reports)ASC_ANALYTICS_VENDOR_NUMBER(fallback for analytics vendor number)ASC_TIMEOUT(e.g.,90s,2m)ASC_TIMEOUT_SECONDS(e.g.,120)ASC_UPLOAD_TIMEOUT(e.g.,60s,2m)ASC_UPLOAD_TIMEOUT_SECONDS(e.g.,120)
Retry behavior env:
ASC_MAX_RETRIES(default: 3) for GET/HEAD requestsASC_BASE_DELAY(default:1s)ASC_MAX_DELAY(default:30s)ASC_RETRY_LOG=1to log retries to stderr- Retry errors include
retry afterin the final error message when available
Output format:
ASC_DEFAULT_OUTPUTsets the default--outputformat (json,table,markdown, ormd)- Explicit
--outputflags always override the environment variable
Debug logging:
ASC_DEBUG=1to enable debug outputASC_DEBUG=apito include HTTP request/response details (redacted)- Use
--debugfor per-command debug output - Use
--api-debugfor per-command HTTP debug output (redacted)
Config.json keys (same semantics, snake_case):
app_idvendor_numberanalytics_vendor_numbertimeout,timeout_secondsupload_timeout,upload_timeout_secondsmax_retriesbase_delaymax_delayretry_log(set to1ortrueto enable)debug(set to1for debug output orapifor HTTP details)
- JSON output is default for easy parsing; add
--prettywhen debugging. - Use
--paginateto automatically fetch all pages. --paginateworks on list commands including apps, builds list, builds uploads list, app-tags list, app-tags territories, offer-codes list, devices list, feedback, crashes, reviews, versions list, pre-release versions list, localizations list, build-localizations list, beta-groups list, beta-testers list, sandbox list, analytics requests/get, testflight apps list, game-center achievements/leaderboards/leaderboard-sets lists (including localizations/releases/members), Xcode Cloud workflows/build-runs, certificates list, profiles list, bundle-ids list, subscriptions groups/list, iap list, webhooks list, app-clips list, encryption declarations list, background-assets list, and performance diagnostics list.- Use
--limit+--next "<links.next>"for manual pagination control. - Sort with
--sort(prefix-for descending):- Feedback/Crashes:
createdDate/-createdDate - Reviews:
rating/-rating,createdDate/-createdDate - Apps:
name/-name,bundleId/-bundleId - Builds:
uploadedDate/-uploadedDate
- Feedback/Crashes:
# List beta feedback (JSON output)
asc feedback --app "123456789"
# Filter feedback by device model and OS version
asc feedback --app "123456789" --device-model "iPhone15,3" --os-version "17.2"
# Filter feedback by platform/build/tester
asc feedback --app "123456789" --app-platform IOS --device-platform IOS --build "BUILD_ID" --tester "TESTER_ID"
# Fetch all feedback pages automatically
asc feedback --app "123456789" --paginate
# Get crash reports (table format - for humans)
asc crashes --app "123456789" --output table
# Get crash reports (markdown - for docs)
asc crashes --app "123456789" --output markdown
# Limit results per page (pagination)
asc crashes --app "123456789" --limit 25
# Sort crashes by created date (newest first)
asc crashes --app "123456789" --sort -createdDate --limit 5
# Fetch all crash pages automatically
asc crashes --app "123456789" --paginate
# List TestFlight apps
asc testflight apps list
# Fetch a TestFlight app by ID
asc testflight apps get --app "APP_ID"
# Export TestFlight configuration to YAML
asc testflight sync pull --app "APP_ID" --output "./testflight.yaml"
asc testflight sync pull --app "APP_ID" --output "./testflight.yaml" --include-builds --include-testers
# TestFlight review and submission
asc testflight review get --app "APP_ID"
asc testflight review submit --build "BUILD_ID" --confirm
# Beta details
asc testflight beta-details get --build "BUILD_ID"
asc testflight beta-details update --id "DETAIL_ID" --auto-notify
# Beta license agreements
asc testflight beta-license-agreements list --app "APP_ID"
asc testflight beta-license-agreements update --id "AGREEMENT_ID" --agreement-text "New terms..."
# Send beta notification for a build
asc testflight beta-notifications create --build "BUILD_ID"
# TestFlight metrics
asc testflight metrics public-link --group "GROUP_ID"
asc testflight metrics beta-tester-usages --app "APP_ID"# List beta groups for an app
asc testflight beta-groups list --app "APP_ID"
# Fetch all beta groups (all pages)
asc testflight beta-groups list --app "APP_ID" --paginate
# Create, fetch, update, delete
asc testflight beta-groups create --app "APP_ID" --name "Beta Testers"
asc testflight beta-groups get --id "GROUP_ID"
asc testflight beta-groups update --id "GROUP_ID" --name "New Name"
asc testflight beta-groups update --id "GROUP_ID" --public-link-enabled true --feedback-enabled true
asc testflight beta-groups delete --id "GROUP_ID" --confirm
# Add/remove testers
asc testflight beta-groups add-testers --group "GROUP_ID" --tester "TESTER_ID"
asc testflight beta-groups remove-testers --group "GROUP_ID" --tester "TESTER_ID"
# View linked app and recruitment criteria
asc testflight beta-groups app get --group-id "GROUP_ID"# List beta testers
asc testflight beta-testers list --app "APP_ID"
# Filter by build or group
asc testflight beta-testers list --app "APP_ID" --build "BUILD_ID"
asc testflight beta-testers list --app "APP_ID" --group "Beta"
# Fetch all beta testers (all pages)
asc testflight beta-testers list --app "APP_ID" --paginate
# Get, add, remove, invite
asc testflight beta-testers get --id "TESTER_ID"
asc testflight beta-testers add --app "APP_ID" --email "tester@example.com" --group "Beta"
asc testflight beta-testers remove --app "APP_ID" --email "tester@example.com"
asc testflight beta-testers invite --app "APP_ID" --email "tester@example.com"
# Manage group membership
asc testflight beta-testers add-groups --id "TESTER_ID" --group "GROUP_ID"
asc testflight beta-testers remove-groups --id "TESTER_ID" --group "GROUP_ID"
# Manage build access
asc testflight beta-testers add-builds --id "TESTER_ID" --build "BUILD_ID"
asc testflight beta-testers remove-builds --id "TESTER_ID" --build "BUILD_ID" --confirm
# Tester metrics
asc testflight beta-testers metrics --tester-id "TESTER_ID" --app "APP_ID"# List devices
asc devices list
# Filter by platform/status/UDID
asc devices list --platform IOS --status ENABLED --udid "UDID1,UDID2"
# Filter by name or ID
asc devices list --name "My iPhone"
asc devices list --id "DEVICE_ID1,DEVICE_ID2"
# Sort and select fields
asc devices list --sort name --fields "name,platform,udid"
# Fetch all devices (all pages)
asc devices list --paginate
# Get a device by ID
asc devices get --id "DEVICE_ID"
# Register a device
asc devices register --name "My iPhone" --udid "UDID" --platform IOS
# Register using the local macOS hardware UDID
asc devices register --name "My Mac" --udid-from-system --platform MAC_OS
# Update device name/status
asc devices update --id "DEVICE_ID" --name "New Name"
asc devices update --id "DEVICE_ID" --status DISABLED
# Get local macOS hardware UDID
asc devices local-udid# List customer reviews (JSON output)
asc reviews --app "123456789"
# Filter by stars (table format - for humans)
asc reviews --app "123456789" --stars 1 --output table
# Filter by territory (markdown - for docs)
asc reviews --app "123456789" --territory US --output markdown
# Sort reviews by created date (newest first)
asc reviews --app "123456789" --sort -createdDate --limit 5
# Fetch all reviews pages automatically
asc reviews --app "123456789" --paginate
# Get a specific review by ID
asc reviews get --id "REVIEW_ID"
# Get review ratings summary
asc reviews ratings --app "123456789"
# Get review summarizations
asc reviews summarizations --app "123456789" --platform IOS --territory USA
# Respond to a customer review
asc reviews respond --review-id "REVIEW_ID" --response "Thanks for your feedback!"
# Get a review response by ID
asc reviews response get --id "RESPONSE_ID"
# Get the response for a specific review
asc reviews response for-review --review-id "REVIEW_ID"
# Delete a review response
asc reviews response delete --id "RESPONSE_ID" --confirm# List app tags for an app
asc app-tags list --app "APP_ID"
# Filter, sort, and request specific fields
asc app-tags list --app "APP_ID" --visible-in-app-store true --sort -name --fields "name,visibleInAppStore"
# Include territories (requires explicit include)
asc app-tags list --app "APP_ID" --include territories --territory-fields currency --territory-limit 50
# Fetch all tag pages
asc app-tags list --app "APP_ID" --paginate
# Get a tag by ID
asc app-tags get --app "APP_ID" --id "TAG_ID"
# Update tag visibility (requires confirm)
asc app-tags update --id "TAG_ID" --visible-in-app-store=false --confirm
# List territories attached to a tag
asc app-tags territories --id "TAG_ID" --fields currency
# List territory relationships for a tag
asc app-tags territories-relationships --id "TAG_ID"
# List tag relationships for an app
asc app-tags relationships --app "APP_ID"# List in-app events for an app
asc app-events list --app "APP_ID"
# List localizations for an event
asc app-events localizations list --event-id "EVENT_ID"
# List localization screenshots and video clips
asc app-events localizations screenshots list --localization-id "LOC_ID"
asc app-events localizations video-clips list --localization-id "LOC_ID"
# List localization relationships for an event
asc app-events relationships --event-id "EVENT_ID"
# List localization media relationships
asc app-events localizations screenshots-relationships --localization-id "LOC_ID"
asc app-events localizations video-clips-relationships --localization-id "LOC_ID"# List domains and keys
asc alternative-distribution domains list
asc alternative-distribution keys list
# Create and delete a domain
asc alternative-distribution domains create --domain "example.com" --reference-name "Example"
asc alternative-distribution domains delete --domain-id "DOMAIN_ID" --confirm
# Create a key and fetch the key for an app
asc alternative-distribution keys create --app "APP_ID" --public-key-path "./key.pem"
asc alternative-distribution keys app --app "APP_ID"
# Create and fetch packages and versions
asc alternative-distribution packages create --app-store-version-id "APP_STORE_VERSION_ID"
asc alternative-distribution packages get --package-id "PACKAGE_ID"
asc alternative-distribution packages versions list --package-id "PACKAGE_ID"
asc alternative-distribution packages versions get --version-id "VERSION_ID"
asc alternative-distribution packages versions deltas --version-id "VERSION_ID"
asc alternative-distribution packages versions variants --version-id "VERSION_ID"# Download daily sales summary (writes .tsv.gz)
asc analytics sales --vendor "12345678" --type SALES --subtype SUMMARY --frequency DAILY --date "2024-01-20"
# Download and decompress
asc analytics sales --vendor "12345678" --type SALES --subtype SUMMARY --frequency DAILY --date "2024-01-20" --decompress
# Create analytics report request
asc analytics request --app "123456789" --access-type ONGOING
# List analytics report requests (all pages)
asc analytics requests --app "123456789" --paginate
# Get analytics reports with instances
asc analytics get --request-id "REQUEST_ID"
# Get analytics report instances for a specific date
asc analytics get --request-id "REQUEST_ID" --date "2024-01-20"
# Include report segments in the output
asc analytics get --request-id "REQUEST_ID" --include-segments
# Fetch a specific instance and include segments
asc analytics get --request-id "REQUEST_ID" --instance-id "INSTANCE_ID" --include-segments
# Download analytics report data
asc analytics download --request-id "REQUEST_ID" --instance-id "INSTANCE_ID"Notes:
- Sales report date formats: DAILY/WEEKLY
YYYY-MM-DD, MONTHLYYYYY-MM, YEARLYYYYY - Reports may not be available yet; ASC returns availability errors when data is pending
- Use
ASC_TIMEOUTorASC_TIMEOUT_SECONDSfor long analytics pagination asc analytics get --date ... --paginatewill scan all report pages (slower, but avoids missing instances)
# Download consolidated report (all regions in one file)
asc finance reports --vendor "12345678" --report-type FINANCIAL --region "ZZ" --date "2025-12"
# Download US-only monthly report
asc finance reports --vendor "12345678" --report-type FINANCIAL --region "US" --date "2025-12"
# Download detailed report (transaction-level data) and decompress
asc finance reports --vendor "12345678" --report-type FINANCE_DETAIL --region "Z1" --date "2025-12" --decompress
# List finance report region codes and currencies
asc finance regions --output tableReport Types (API to UI mapping):
| API Report Type | UI Option | Region Code(s) |
|---|---|---|
FINANCIAL |
All Countries or Regions (Single File) | ZZ (consolidated) |
FINANCIAL |
All Countries or Regions (Multiple Files) | US, EU, JP, etc. |
FINANCE_DETAIL |
All Countries or Regions (Detailed) | Z1 (required) |
| Not available | Transaction Tax (Single File) | N/A - manual download |
Notes:
- Report date format:
YYYY-MM(Apple fiscal month) - Reports typically appear the first Friday of the following fiscal month
FINANCE_DETAILrequires region codeZ1(the only valid region for detailed reports)- Transaction Tax reports are not available via API - download manually from App Store Connect
- Use
asc finance regionsto list all valid region codes and currencies - Requires Account Holder, Admin, or Finance role
Region codes reference: https://developer.apple.com/help/app-store-connect/reference/financial-report-regions-and-currencies/
# List sandbox testers
asc sandbox list
# Filter by email or territory
asc sandbox list --email "tester@example.com"
asc sandbox list --territory "USA"
# Fetch all sandbox testers (all pages)
asc sandbox list --paginate
# Get sandbox tester details
asc sandbox get --id "SANDBOX_TESTER_ID"
asc sandbox get --email "tester@example.com"
# Update a sandbox tester
asc sandbox update --id "SANDBOX_TESTER_ID" --territory "USA"
asc sandbox update --email "tester@example.com" --interrupt-purchases
asc sandbox update --id "SANDBOX_TESTER_ID" --subscription-renewal-rate "MONTHLY_RENEWAL_EVERY_ONE_HOUR"
# Clear purchase history
asc sandbox clear-history --id "SANDBOX_TESTER_ID" --confirm
asc sandbox clear-history --email "tester@example.com" --confirmNotes:
- Territory uses 3-letter App Store territory codes (e.g.,
USA,JPN) - Sandbox list/get/update/clear-history use the v2 API
# List workflows for an app (find workflow IDs)
asc xcode-cloud workflows --app "123456789"
# List build runs for a workflow (find run IDs)
asc xcode-cloud build-runs --workflow-id "WORKFLOW_ID"
# Fetch all workflows/build runs (all pages)
asc xcode-cloud workflows --app "123456789" --paginate
asc xcode-cloud build-runs --workflow-id "WORKFLOW_ID" --paginate
# Trigger a workflow by name (requires --app)
asc xcode-cloud run --app "123456789" --workflow "CI Build" --branch "main"
# Trigger a workflow by ID (no app needed)
asc xcode-cloud run --workflow-id "WORKFLOW_ID" --git-reference-id "REF_ID"
# Trigger and wait for completion
asc xcode-cloud run --app "123456789" --workflow "Deploy" --branch "release/1.0" --wait
# Trigger with custom polling interval and timeout
asc xcode-cloud run --app "123456789" --workflow "CI" --branch "main" --wait --poll-interval 30s --timeout 1h
# Check build run status
asc xcode-cloud status --run-id "BUILD_RUN_ID"
# Check status with table output
asc xcode-cloud status --run-id "BUILD_RUN_ID" --output table
# Wait for an existing build run to complete
asc xcode-cloud status --run-id "BUILD_RUN_ID" --wait
# CI Products
asc xcode-cloud products --app "APP_ID"
# Source code management
asc xcode-cloud scm providers list
asc xcode-cloud scm providers get --provider-id "PROVIDER_ID"
asc xcode-cloud scm providers repositories --provider-id "PROVIDER_ID"
asc xcode-cloud scm repositories list
asc xcode-cloud scm repositories get --id "REPO_ID"
asc xcode-cloud scm repositories git-references --repo-id "REPO_ID"
asc xcode-cloud scm git-references get --id "REF_ID"
# Build actions and artifacts
asc xcode-cloud actions --run-id "BUILD_RUN_ID"
asc xcode-cloud artifacts list --action-id "ACTION_ID"
asc xcode-cloud artifacts get --id "ARTIFACT_ID"
asc xcode-cloud artifacts download --id "ARTIFACT_ID" --path "./artifact.zip"
# Test results and issues
asc xcode-cloud test-results list --action-id "ACTION_ID"
asc xcode-cloud test-results get --id "RESULT_ID"
asc xcode-cloud issues list --action-id "ACTION_ID"
# Available macOS and Xcode versions
asc xcode-cloud macos-versions
asc xcode-cloud xcode-versionsNotes:
- Workflows must have manual start conditions enabled to be triggered via API
- Use
--workflowwith--appfor human-friendly workflow lookup by name - Use
--workflow-idand--git-reference-idfor direct ID-based triggering - Use
asc xcode-cloud workflowsandasc xcode-cloud build-runsto discover IDs - When using
--wait, the command polls until the build completes (or times out) - Exit code is non-zero if the build fails, errors, or is canceled
- Use
ASC_TIMEOUTenv var or--timeoutflag for long-running builds
# Submit a file for macOS notarization
asc notarization submit --file ./MyApp.zip
# Submit and wait for notarization to complete
asc notarization submit --file ./MyApp.zip --wait
# Submit with custom polling interval and timeout
asc notarization submit --file ./MyApp.zip --wait --poll-interval 30s --timeout 1h
# Check notarization status
asc notarization status --id "SUBMISSION_ID"
# Get the developer log URL for a submission
asc notarization log --id "SUBMISSION_ID"
# List previous notarization submissions
asc notarization list
asc notarization list --output tableNotes:
- Supported file formats: zip, dmg, pkg
- The submit command computes the SHA-256 hash, creates a submission, and uploads the file to Apple
- Use
--waitto poll until notarization completes (default timeout: 30 minutes) - If notarization fails, use
asc notarization log --idto retrieve the developer log URL with detailed results - Uses the Apple Notary API v2 (
appstoreconnect.apple.com/notary/v2)
# Achievements
asc game-center achievements list --app "APP_ID"
asc game-center achievements get --id "ACHIEVEMENT_ID"
asc game-center achievements create --app "APP_ID" --reference-name "First Win" --vendor-id "com.example.firstwin" --points 10
asc game-center achievements update --id "ACHIEVEMENT_ID" --points 20
asc game-center achievements delete --id "ACHIEVEMENT_ID" --confirm
# Achievement localizations
asc game-center achievements localizations list --achievement-id "ACHIEVEMENT_ID"
asc game-center achievements localizations create --achievement-id "ACHIEVEMENT_ID" --locale en-US --name "First Win" --before-earned-description "Win your first game" --after-earned-description "You won!"
asc game-center achievements localizations update --id "LOC_ID" --name "New Name"
asc game-center achievements localizations delete --id "LOC_ID" --confirm
# Achievement images
asc game-center achievements images upload --localization-id "LOC_ID" --file "path/to/image.png"
asc game-center achievements images get --id "IMAGE_ID"
asc game-center achievements images delete --id "IMAGE_ID" --confirm
# Achievement releases
asc game-center achievements releases list --achievement-id "ACHIEVEMENT_ID"
asc game-center achievements releases create --app "APP_ID" --achievement-id "ACHIEVEMENT_ID"
asc game-center achievements releases delete --id "RELEASE_ID" --confirm
# Leaderboards
asc game-center leaderboards list --app "APP_ID"
asc game-center leaderboards get --id "LEADERBOARD_ID"
asc game-center leaderboards create --app "APP_ID" --reference-name "High Score" --vendor-id "com.example.highscore" --formatter INTEGER --sort DESC --submission-type BEST_SCORE
asc game-center leaderboards update --id "LEADERBOARD_ID" --reference-name "New Name"
asc game-center leaderboards delete --id "LEADERBOARD_ID" --confirm
# Leaderboard localizations
asc game-center leaderboards localizations list --leaderboard-id "LEADERBOARD_ID"
asc game-center leaderboards localizations create --leaderboard-id "LEADERBOARD_ID" --locale en-US --name "High Score"
asc game-center leaderboards localizations update --id "LOC_ID" --name "New Name"
asc game-center leaderboards localizations delete --id "LOC_ID" --confirm
# Leaderboard images
asc game-center leaderboards images upload --localization-id "LOC_ID" --file "path/to/image.png"
asc game-center leaderboards images delete --id "IMAGE_ID" --confirm
# Leaderboard releases
asc game-center leaderboards releases list --leaderboard-id "LEADERBOARD_ID"
asc game-center leaderboards releases create --app "APP_ID" --leaderboard-id "LEADERBOARD_ID"
asc game-center leaderboards releases delete --id "RELEASE_ID" --confirm
# Leaderboard Sets
asc game-center leaderboard-sets list --app "APP_ID"
asc game-center leaderboard-sets get --id "SET_ID"
asc game-center leaderboard-sets create --app "APP_ID" --reference-name "Season 1" --vendor-id "com.example.season1"
asc game-center leaderboard-sets update --id "SET_ID" --reference-name "Season 1 - Updated"
asc game-center leaderboard-sets delete --id "SET_ID" --confirm
# Leaderboard Set members
asc game-center leaderboard-sets members list --set-id "SET_ID"
asc game-center leaderboard-sets members set --set-id "SET_ID" --leaderboard-ids "id1,id2,id3"
# Leaderboard Set localizations
asc game-center leaderboard-sets localizations list --set-id "SET_ID"
asc game-center leaderboard-sets localizations create --set-id "SET_ID" --locale en-US --name "Season 1"
asc game-center leaderboard-sets localizations update --id "LOC_ID" --name "New Name"
asc game-center leaderboard-sets localizations delete --id "LOC_ID" --confirm
# Leaderboard Set images
asc game-center leaderboard-sets images upload --localization-id "LOC_ID" --file "path/to/image.png"
asc game-center leaderboard-sets images delete --id "IMAGE_ID" --confirm
# Leaderboard Set releases
asc game-center leaderboard-sets releases list --set-id "SET_ID"
asc game-center leaderboard-sets releases create --app "APP_ID" --set-id "SET_ID"
asc game-center leaderboard-sets releases delete --id "RELEASE_ID" --confirm# Fetch signing files (certificates + profiles) for an app
asc signing fetch --bundle-id "com.example.app" --profile-type IOS_APP_STORE --output "./signing"
# Create missing profiles automatically
asc signing fetch --bundle-id "com.example.app" --profile-type IOS_APP_DEVELOPMENT --device "DEVICE_ID" --create-missing
# Filter by certificate type
asc signing fetch --bundle-id "com.example.app" --profile-type IOS_APP_STORE --certificate-type IOS_DISTRIBUTION# List signing certificates
asc certificates list
asc certificates list --certificate-type "IOS_DISTRIBUTION,IOS_DEVELOPMENT"
# Fetch all certificates (all pages)
asc certificates list --paginate
# Get a certificate by ID
asc certificates get --id "CERT_ID"
# Create a signing certificate
asc certificates create --certificate-type "IOS_DISTRIBUTION" --csr "./CertificateSigningRequest.certSigningRequest"
# Update a certificate
asc certificates update --id "CERT_ID" --activated true
# Revoke a certificate (irreversible)
asc certificates revoke --id "CERT_ID" --confirm# List provisioning profiles
asc profiles list
asc profiles list --profile-type "IOS_APP_STORE,IOS_APP_DEVELOPMENT"
# Fetch all profiles (all pages)
asc profiles list --paginate
# Get a profile by ID (with related resources)
asc profiles get --id "PROFILE_ID" --include "bundleId,certificates,devices"
# Create a provisioning profile
asc profiles create --name "My App Store Profile" --profile-type IOS_APP_STORE --bundle "BUNDLE_ID" --certificate "CERT_ID"
# Create a development profile with devices
asc profiles create --name "Dev Profile" --profile-type IOS_APP_DEVELOPMENT --bundle "BUNDLE_ID" --certificate "CERT_ID" --device "DEVICE_ID1,DEVICE_ID2"
# Download a profile
asc profiles download --id "PROFILE_ID" --output "./profile.mobileprovision"
# Delete a profile
asc profiles delete --id "PROFILE_ID" --confirm
# View profile relationships
asc profiles relationships bundle-id --id "PROFILE_ID"
asc profiles relationships certificates --id "PROFILE_ID"
asc profiles relationships devices --id "PROFILE_ID"# List bundle IDs
asc bundle-ids list
asc bundle-ids list --paginate
# Get a bundle ID by ID
asc bundle-ids get --id "BUNDLE_ID"
# Create a bundle ID
asc bundle-ids create --identifier "com.example.app" --name "My App" --platform IOS
# Update a bundle ID
asc bundle-ids update --id "BUNDLE_ID" --name "New Name"
# Delete a bundle ID
asc bundle-ids delete --id "BUNDLE_ID" --confirm
# View linked app
asc bundle-ids app get --id "BUNDLE_ID"
# List linked profiles
asc bundle-ids profiles list --id "BUNDLE_ID"
# Manage capabilities
asc bundle-ids capabilities list --bundle "BUNDLE_ID"
asc bundle-ids capabilities add --bundle "BUNDLE_ID" --capability IN_APP_PURCHASE
asc bundle-ids capabilities remove --id "CAPABILITY_ID" --confirm# Subscription groups
asc subscriptions groups list --app "APP_ID"
asc subscriptions groups create --app "APP_ID" --reference-name "Premium"
asc subscriptions groups get --id "GROUP_ID"
asc subscriptions groups update --id "GROUP_ID" --reference-name "Premium+"
asc subscriptions groups delete --id "GROUP_ID" --confirm
# Group localizations
asc subscriptions groups localizations list --group-id "GROUP_ID"
asc subscriptions groups localizations create --group-id "GROUP_ID" --locale en-US --name "Premium"
asc subscriptions groups localizations update --id "LOC_ID" --name "Premium+"
asc subscriptions groups localizations delete --id "LOC_ID" --confirm
# Submit a group for review
asc subscriptions groups submit --group-id "GROUP_ID" --confirm
# Subscriptions within a group
asc subscriptions list --group "GROUP_ID"
asc subscriptions create --group "GROUP_ID" --ref-name "Monthly" --product-id "com.example.monthly" --subscription-period "ONE_MONTH"
asc subscriptions get --id "SUB_ID"
asc subscriptions update --id "SUB_ID" --ref-name "Monthly Premium"
asc subscriptions delete --id "SUB_ID" --confirm
asc subscriptions submit --subscription-id "SUB_ID" --confirm
# Pricing
asc subscriptions pricing --app "APP_ID"
asc subscriptions pricing --subscription-id "SUB_ID" --territory "USA"
# Prices
asc subscriptions prices list --id "SUB_ID"
asc subscriptions prices add --id "SUB_ID" --price-point "PRICE_POINT_ID"
asc subscriptions prices delete --price-id "PRICE_ID" --confirm
# Availability
asc subscriptions availability get --subscription-id "SUB_ID"
asc subscriptions availability set --id "SUB_ID" --territory "USA,GBR,JPN"
asc subscriptions availability available-territories --id "AVAILABILITY_ID"
# Localizations
asc subscriptions localizations list --subscription-id "SUB_ID"
asc subscriptions localizations create --subscription-id "SUB_ID" --locale en-US --name "Monthly"
asc subscriptions localizations update --id "LOC_ID" --name "Monthly Premium"
asc subscriptions localizations delete --id "LOC_ID" --confirm
# Introductory offers
asc subscriptions introductory-offers list --subscription-id "SUB_ID"
asc subscriptions introductory-offers create --subscription-id "SUB_ID" --offer-duration "ONE_MONTH" --offer-mode "FREE_TRIAL" --number-of-periods 1
asc subscriptions introductory-offers delete --id "OFFER_ID" --confirm
# Promotional offers
asc subscriptions promotional-offers list --subscription-id "SUB_ID"
asc subscriptions promotional-offers create --subscription-id "SUB_ID" --offer-code "PROMO1" --name "Holiday" --offer-duration "ONE_MONTH" --offer-mode "PAY_AS_YOU_GO" --number-of-periods 3 --prices "PRICE_ID1,PRICE_ID2"
asc subscriptions promotional-offers delete --id "OFFER_ID" --confirm
# Price points
asc subscriptions price-points list --subscription-id "SUB_ID"
asc subscriptions price-points get --id "PRICE_POINT_ID"
asc subscriptions price-points equalizations --id "PRICE_POINT_ID"
# Images and review screenshots
asc subscriptions images list --subscription-id "SUB_ID"
asc subscriptions images create --subscription-id "SUB_ID" --file "./image.png"
asc subscriptions review-screenshots create --subscription-id "SUB_ID" --file "./screenshot.png"# List in-app purchases
asc iap list --app "APP_ID"
asc iap list --app "APP_ID" --paginate
# Legacy in-app purchases
asc iap list --app "APP_ID" --legacy
asc iap get --id "IAP_ID" --legacy
# Create an in-app purchase
asc iap create --app "APP_ID" --type CONSUMABLE --ref-name "100 Coins" --product-id "com.example.coins100"
# Update and delete
asc iap update --id "IAP_ID" --ref-name "200 Coins"
asc iap delete --id "IAP_ID" --confirm
# Pricing summary
asc iap prices --app "APP_ID"
asc iap prices --iap-id "IAP_ID" --territory "USA"
# Submit for review
asc iap submit --iap-id "IAP_ID" --confirm
# Localizations
asc iap localizations list --iap-id "IAP_ID"
asc iap localizations create --iap-id "IAP_ID" --locale en-US --name "100 Coins" --description "Buy 100 coins"
asc iap localizations update --id "LOC_ID" --name "200 Coins"
asc iap localizations delete --id "LOC_ID" --confirm
# Images and review screenshots
asc iap images list --iap-id "IAP_ID"
asc iap images create --iap-id "IAP_ID" --file "./image.png"
asc iap review-screenshots create --iap-id "IAP_ID" --file "./screenshot.png"
# Availability
asc iap availability get --iap-id "IAP_ID"
asc iap availability set --iap-id "IAP_ID" --territories "USA,GBR,JPN"
# Price points and schedules
asc iap price-points list --iap-id "IAP_ID"
asc iap price-schedules get --iap-id "IAP_ID"
asc iap price-schedules create --iap-id "IAP_ID" --base-territory "USA" --prices "PRICE_POINT_ID"# App-level performance metrics
asc performance metrics list --app "APP_ID"
asc performance metrics list --app "APP_ID" --metric-type "LAUNCH,HANG" --platform IOS
# Build-level performance metrics
asc performance metrics get --build "BUILD_ID"
asc performance metrics get --build "BUILD_ID" --metric-type "BATTERY,MEMORY"
# Diagnostic signatures for a build
asc performance diagnostics list --build "BUILD_ID"
asc performance diagnostics list --build "BUILD_ID" --diagnostic-type "DISK_WRITES,HANGS"
# Diagnostic logs for a signature
asc performance diagnostics get --id "SIGNATURE_ID"
# Download metrics or diagnostics
asc performance download --app "APP_ID" --output "./metrics.json"
asc performance download --build "BUILD_ID" --output "./build-metrics.json"
asc performance download --diagnostic-id "SIGNATURE_ID" --output "./diagnostic.json"# List webhooks for an app
asc webhooks list --app "APP_ID"
# Get a webhook by ID
asc webhooks get --webhook-id "WEBHOOK_ID"
# Create a webhook
asc webhooks create --app "APP_ID" --name "Build Notifications" --url "https://example.com/webhook" --secret "my-secret" --events "BUILD_CREATED,BUILD_UPDATED" --enabled true
# Update a webhook
asc webhooks update --webhook-id "WEBHOOK_ID" --enabled false
asc webhooks update --webhook-id "WEBHOOK_ID" --events "BUILD_CREATED"
# Delete a webhook
asc webhooks delete --webhook-id "WEBHOOK_ID" --confirm
# Webhook deliveries
asc webhooks deliveries --webhook-id "WEBHOOK_ID" --created-after "2025-01-01"
# Redeliver a failed delivery
asc webhooks deliveries redeliver --delivery-id "DELIVERY_ID"
# Ping a webhook
asc webhooks ping --webhook-id "WEBHOOK_ID"# Upload and distribute to TestFlight in one step
asc publish testflight --app "APP_ID" --ipa "app.ipa" --group "Beta Testers"
# With multiple groups and notification
asc publish testflight --app "APP_ID" --ipa "app.ipa" --group "Internal,External" --notify --wait
# With "What to Test" notes
asc publish testflight --app "APP_ID" --ipa "app.ipa" --group "Beta" --test-notes "Test login flow" --locale "en-US" --wait
# Upload and submit to App Store in one step
asc publish appstore --app "APP_ID" --ipa "app.ipa" --submit --confirm --waitNotes:
--versionand--build-numberare auto-extracted from the IPA if not provided- Default timeout is 30 minutes; override with
--timeout
# List App Clips for an app
asc app-clips list --app "APP_ID"
# Get App Clip details
asc app-clips get --id "APP_CLIP_ID"
# Default experiences
asc app-clips default-experiences list --app-clip-id "APP_CLIP_ID"
asc app-clips default-experiences get --experience-id "EXP_ID"
asc app-clips default-experiences create --app-clip-id "APP_CLIP_ID" --action OPEN
asc app-clips default-experiences update --experience-id "EXP_ID" --action VIEW
asc app-clips default-experiences delete --experience-id "EXP_ID" --confirm
# Advanced experiences
asc app-clips advanced-experiences list --app-clip-id "APP_CLIP_ID"
asc app-clips advanced-experiences create --app-clip-id "APP_CLIP_ID" --link "https://example.com/clip" --default-language en --is-powered-by true
asc app-clips advanced-experiences update --experience-id "EXP_ID" --removed true
asc app-clips advanced-experiences delete --experience-id "EXP_ID" --confirm
# Header images
asc app-clips header-images create --localization-id "LOC_ID" --file "header.png"
asc app-clips header-images get --id "IMAGE_ID"
asc app-clips header-images delete --id "IMAGE_ID" --confirm
# Beta invocations (for testing)
asc app-clips invocations list --build-bundle-id "BUNDLE_ID"
asc app-clips invocations create --build-bundle-id "BUNDLE_ID" --url "https://example.com/clip"
asc app-clips invocations delete --invocation-id "INVOCATION_ID" --confirm
# Domain status
asc app-clips domain-status cache --build-bundle-id "BUNDLE_ID"
asc app-clips domain-status debug --build-bundle-id "BUNDLE_ID"# List encryption declarations for an app
asc encryption declarations list --app "APP_ID"
# Get a declaration by ID
asc encryption declarations get --id "DECLARATION_ID"
# Create an encryption declaration
asc encryption declarations create --app "APP_ID" --app-description "Uses HTTPS only" --contains-proprietary-cryptography false --contains-third-party-cryptography false --available-on-french-store true
# Assign builds to a declaration
asc encryption declarations assign-builds --id "DECLARATION_ID" --build "BUILD_ID1,BUILD_ID2"
# Upload an encryption document
asc encryption documents upload --declaration "DECLARATION_ID" --file "./encryption-doc.pdf"
# Get a document
asc encryption documents get --id "DOC_ID"# List screenshots for a version localization
asc assets screenshots list --version-localization "LOC_ID"
# Upload screenshots
asc assets screenshots upload --version-localization "LOC_ID" --path "./screenshots/" --device-type IPHONE_65
# Delete a screenshot
asc assets screenshots delete --id "SCREENSHOT_ID" --confirm
# List and upload previews
asc assets previews list --version-localization "LOC_ID"
asc assets previews upload --version-localization "LOC_ID" --path "./previews/" --device-type IPHONE_65
asc assets previews delete --id "PREVIEW_ID" --confirm# List background assets for an app
asc background-assets list --app "APP_ID"
asc background-assets list --app "APP_ID" --archived false
# Create and manage background assets
asc background-assets get --id "ASSET_ID"
asc background-assets create --app "APP_ID" --asset-pack-identifier "com.example.assets.pack1"
asc background-assets update --id "ASSET_ID" --archived true
# Manage versions
asc background-assets versions list --background-asset-id "ASSET_ID"
asc background-assets versions create --background-asset-id "ASSET_ID"
# Upload files
asc background-assets upload-files list --version-id "VERSION_ID"
asc background-assets upload-files create --version-id "VERSION_ID" --file "./asset.bin" --asset-type ASSET# Get routing app coverage for a version
asc routing-coverage get --version-id "VERSION_ID"
# Upload routing app coverage
asc routing-coverage create --version-id "VERSION_ID" --file "./routing.geojson"
# Get by ID
asc routing-coverage info --id "COVERAGE_ID"
# Delete routing coverage
asc routing-coverage delete --id "COVERAGE_ID" --confirm# Send a Slack notification
asc notify slack --webhook "https://hooks.slack.com/services/..." --message "Build deployed!"
# Send to a specific channel
asc notify slack --webhook "https://hooks.slack.com/services/..." --message "v1.0.0 live" --channel "#releases"Notes:
- Set
ASC_SLACK_WEBHOOKenv var to avoid passing--webhookeach time - Webhook URL must target
hooks.slack.comover HTTPS
# List apps (useful for finding app IDs)
asc apps
# Sort apps by name or bundle ID
asc apps --sort name
asc apps --sort -bundleId
# Fetch all apps (all pages)
asc apps --paginate
# List builds for an app
asc builds list --app "123456789"
# Sort builds by upload date (newest first)
asc builds list --app "123456789" --sort -uploadedDate
# Fetch all builds (all pages)
asc builds list --app "123456789" --paginate
# Build details
asc builds info --build "BUILD_ID"
# Expire a build (irreversible)
asc builds expire --build "BUILD_ID" --confirm
# Expire builds in bulk (use --dry-run to preview)
asc builds expire-all --app "123456789" --older-than 90d --dry-run
asc builds expire-all --app "123456789" --older-than 90d --confirm
# Upload a build
asc builds upload --app "123456789" --ipa "app.ipa"
# Upload a macOS build
asc builds upload --app "123456789" --pkg "app.pkg" --version "1.0.0" --build-number "123"
# Upload with concurrent chunk uploads
asc builds upload --app "123456789" --ipa "app.ipa" --concurrency 4
# Upload and verify checksums
asc builds upload --app "123456789" --ipa "app.ipa" --checksum
# Upload and wait for build processing
asc builds upload --app "123456789" --ipa "app.ipa" --wait
# Upload with "What to Test" notes
asc builds upload --app "123456789" --ipa "app.ipa" --test-notes "Test the new login flow" --locale "en-US" --wait
# Dry run (reserve upload operations only)
asc builds upload --app "123456789" --ipa "app.ipa" --dry-run
# Manage build uploads
asc builds uploads list --app "123456789"
asc builds uploads get --id "UPLOAD_ID"
asc builds uploads delete --id "UPLOAD_ID" --confirm
asc builds uploads files list --upload "UPLOAD_ID"
# Get the latest build for an app
asc builds latest --app "123456789"
asc builds latest --app "123456789" --version "1.0.0" --platform IOS
# Manage build test notes (What to Test)
asc builds test-notes list --build "BUILD_ID"
asc builds test-notes get --id "LOCALIZATION_ID"
asc builds test-notes create --build "BUILD_ID" --locale "en-US" --whats-new "Test the new login flow"
asc builds test-notes update --id "LOCALIZATION_ID" --whats-new "Updated test notes"
asc builds test-notes delete --id "LOCALIZATION_ID" --confirm
# Manage individual testers on a build
asc builds individual-testers list --build "BUILD_ID"
asc builds individual-testers add --build "BUILD_ID" --tester "TESTER_ID"
asc builds individual-testers remove --build "BUILD_ID" --tester "TESTER_ID"
# Add/remove beta groups from a build
asc builds add-groups --build "BUILD_ID" --group "GROUP_ID"
asc builds remove-groups --build "BUILD_ID" --group "GROUP_ID" --confirm
# Build relationships and related resources
asc builds app get --build "BUILD_ID"
asc builds pre-release-version get --build "BUILD_ID"
asc builds icons list --build "BUILD_ID"
asc builds beta-app-review-submission get --build "BUILD_ID"
asc builds build-beta-detail get --build "BUILD_ID"
asc builds relationships get --build "BUILD_ID" --type "app"
# Build metrics
asc builds metrics beta-usages --build "BUILD_ID"# Set bundle ID and primary locale
asc app-setup info set --app "APP_ID" --primary-locale "en-US" --bundle-id "com.example.app"
# Set localized app info
asc app-setup info set --app "APP_ID" --locale "en-US" --name "My App" --subtitle "Great app"
# Set categories
asc app-setup categories set --app "APP_ID" --primary GAMES --secondary ENTERTAINMENT
# Set availability
asc app-setup availability set --app "APP_ID" --territory "USA,GBR" --available true --available-in-new-territories true
# Set pricing
asc app-setup pricing set --app "APP_ID" --price-point "PRICE_POINT_ID" --base-territory "USA"
# Upload localizations
asc app-setup localizations upload --version "VERSION_ID" --path "./localizations"# List one-time use offer code batches for a subscription offer
asc offer-codes list --offer-code "OFFER_CODE_ID"
# Fetch all offer code batches (all pages)
asc offer-codes list --offer-code "OFFER_CODE_ID" --paginate
# Get an offer code by ID
asc offer-codes get --offer-code-id "OFFER_CODE_ID"
# Create an offer code
asc offer-codes create --subscription-id "SUB_ID" --name "Holiday" --customer-eligibilities "NEW,EXISTING" --offer-eligibility "ONCE" --duration "ONE_MONTH" --offer-mode "PAY_AS_YOU_GO" --number-of-periods 3 --prices "USA:PRICE_POINT_ID"
# Update an offer code
asc offer-codes update --offer-code-id "OFFER_CODE_ID" --active false
# Generate one-time use offer codes
asc offer-codes generate --offer-code "OFFER_CODE_ID" --quantity 10 --expiration-date "2026-02-01"
# Download one-time use offer codes to a file
asc offer-codes values --id "ONE_TIME_USE_CODE_ID" --output "./offer-codes.txt"
# Manage custom (vanity) codes
asc offer-codes custom-codes list --offer-code-id "OFFER_CODE_ID"
asc offer-codes custom-codes create --offer-code-id "OFFER_CODE_ID" --custom-code "HOLIDAY2026"
asc offer-codes custom-codes update --id "CUSTOM_CODE_ID" --active false
# List offer code prices
asc offer-codes prices list --offer-code-id "OFFER_CODE_ID"# List all App Store categories
asc categories list
asc categories list --output table
# Set primary and secondary categories for an app
asc categories set --app "123456789" --primary GAMES
asc categories set --app "123456789" --primary GAMES --secondary ENTERTAINMENT# List App Store versions
asc versions list --app "123456789"
# Fetch all versions (all pages)
asc versions list --app "123456789" --paginate
# Get version details
asc versions get --version-id "VERSION_ID"
# Create a new App Store version
asc versions create --app "123456789" --version "1.0.0"
asc versions create --app "123456789" --version "2.0.0" --platform IOS --release-type MANUAL
# Update a version
asc versions update --version-id "VERSION_ID" --version "1.0.1"
# Delete a version
asc versions delete --version-id "VERSION_ID" --confirm
# Attach a build to a version
asc versions attach-build --version-id "VERSION_ID" --build "BUILD_ID"
# Release a pending developer release version
asc versions release --version-id "VERSION_ID" --confirm
# Manage phased release
asc versions phased-release get --version-id "VERSION_ID"
asc versions phased-release create --version-id "VERSION_ID"
asc versions phased-release update --id "PHASED_ID" --state PAUSED
asc versions phased-release delete --id "PHASED_ID" --confirm
# Create a version promotion (create-only in API spec; treatment required)
asc versions promotions create --version-id "VERSION_ID" --treatment-id "TREATMENT_ID"# Get App Store metadata for the latest version
asc app-info get --app "123456789"
# Get metadata for a specific version
asc app-info get --app "123456789" --version "1.2.3" --platform IOS
# Include related resources
asc app-info get --app "123456789" --include "ageRatingDeclaration,territoryAgeRatings"
# Update metadata for a locale
asc app-info set --app "123456789" --locale "en-US" --whats-new "Bug fixes"
asc app-info set --app "123456789" --locale "en-US" --description "My app description" --keywords "app,tool" --support-url "https://example.com/support"
asc app-info set --app "123456789" --locale "en-US" --promotional-text "Now with dark mode!" --marketing-url "https://example.com"# List pre-release versions for an app
asc pre-release-versions list --app "123456789"
# Filter by platform or version
asc pre-release-versions list --app "123456789" --platform IOS
asc pre-release-versions list --app "123456789" --version "1.0.0"
# Fetch all pre-release versions (all pages)
asc pre-release-versions list --app "123456789" --paginate
# Get pre-release version details
asc pre-release-versions get --id "PRERELEASE_ID"# List version localizations
asc localizations list --version "VERSION_ID"
# List app info localizations
asc localizations list --app "APP_ID" --type app-info
# Fetch all localizations (all pages)
asc localizations list --version "VERSION_ID" --paginate
# Download/upload localization files
asc localizations download --version "VERSION_ID" --path "./localizations"
asc localizations upload --version "VERSION_ID" --path "./localizations"# List build release notes localizations
asc build-localizations list --build "BUILD_ID"
# Fetch all build localizations (all pages)
asc build-localizations list --build "BUILD_ID" --paginate
# Create/update/delete release notes
asc build-localizations create --build "BUILD_ID" --locale "en-US" --whats-new "Bug fixes"
asc build-localizations update --id "LOCALIZATION_ID" --whats-new "New features"
asc build-localizations delete --id "LOCALIZATION_ID" --confirm
# Fetch a localization by ID
asc build-localizations get --id "LOCALIZATION_ID"Validate and migrate metadata between ASC's .strings format and Fastlane directory structure.
# Validate metadata against App Store Connect character limits (offline)
asc migrate validate --fastlane-dir ./metadata
# Import metadata from fastlane format to App Store Connect
asc migrate import --app "123456789" --version-id "VERSION_ID" --fastlane-dir ./metadata
# Export metadata from App Store Connect to fastlane format
asc migrate export --app "123456789" --version-id "VERSION_ID" --output-dir ./exported-metadataCharacter limits validated:
| Field | Limit |
|---|---|
| Description | 4000 chars |
| Keywords | 100 chars |
| What's New | 4000 chars |
| Promotional Text | 170 chars |
| Name | 30 chars |
| Subtitle | 30 chars |
# Submit a build for review
asc submit create --app "123456789" --version "1.0.0" --build "BUILD_ID" --confirm
# Check submission status
asc submit status --id "SUBMISSION_ID"
asc submit status --version-id "VERSION_ID"
# Cancel a submission
asc submit cancel --id "SUBMISSION_ID" --confirm
asc submit cancel --version-id "VERSION_ID" --confirm# Print version information
asc version
asc --version| Format | Flag | Use Case |
|---|---|---|
| JSON (minified) | default | Scripting, automation |
| Table | --output table |
Terminal display |
| Markdown | --output markdown |
Documentation |
Note: When using --paginate, the response links field is cleared to avoid confusion about additional pages.
# Check authentication status
asc auth status
asc auth status --verbose
asc auth status --validate
# Diagnose authentication issues
asc auth doctor
asc auth doctor --output json --pretty
asc auth doctor --fix --confirm
# Logout
asc auth logout
asc auth logout --all
asc auth logout --name "MyApp"# Good - self-documenting
asc reviews --app "MyApp" --stars 1
# Avoid - cryptic flags (hypothetical, not supported)
# asc reviews -a "MyApp" -s 1All commands output minified JSON by default for easy parsing:
asc feedback --app "123456789" | jq '.data[].attributes.comment'JSON is minified (one line) by default. Use --output table or --output markdown for human-readable output.
Everything is flag-based for automation:
# Non-interactive (good for CI/CD and scripts)
asc feedback --app "123456789"
# No prompts, no waiting# Add tap and install
brew tap rudrankriyam/tap
brew install rudrankriyam/tap/ascgit clone https://github.com/rudrankriyam/App-Store-Connect-CLI.git
cd App-Store-Connect-CLI
make build
make install # Installs to /usr/local/bin- CLAUDE.md - Development guidelines for AI assistants
- CONTRIBUTING.md - Contribution guidelines
- docs/openapi/README.md - Offline OpenAPI snapshot + update steps
make tools # installs gofumpt + golangci-lint (required for make format)
make format
make lint
make test
make build
./asc --help- Credentials stored in the system keychain when available
- Local config fallback with restricted permissions
- Private key content never stored, only path reference
- Environment variables as fallback
Contributions are welcome! Please read CONTRIBUTING.md for details.
MIT License - see LICENSE for details.
Primarily Built with Cursor and GPT-5.2 Codex Extra High