需先在 App Store Connect 生成 API Key 并准备 AuthKey.p8 才能认证;CI 或无钥匙串环境要加 --bypass-keychain 或设 ASC_BYPASS_KEYCHAIN=1;默认开启匿名命令级遥测,敏感场景需留意
App-Store-Connect-CLI
rorkaiMIT活跃维护用 Go 写的 App Store Connect 命令行工具,把 TestFlight、构建、提审、签名、订阅和截图等操作脚本化,方便接进 CI/CD 自动跑。
Fast, scriptable CLI for the App Store Connect API. Automate TestFlight, builds, submissions, signing, analytics, screenshots, subscriptions, and more
brew install asc
curl -fsSL https://asccli.sh/install | bashREADME 未说明;发布二进制自包含,无需安装 Go,用 Go 1.27 构建的版本要求 macOS 13 Ventura 或更高
用命令行脚本化 App Store Connect 全流程,替代手工点网页发布 iOS 应用
用 Go 写的 App Store Connect 命令行工具,把 TestFlight、构建、提审、签名、订阅和截图等操作脚本化,方便接进 CI/CD 自动跑。
核心能力
- 用 asc builds upload 上传 ipa/pkg 并等待处理完成
- 用 asc publish appstore 一条命令完成上传、挂载与提交审核
- 用 asc validate 检查元数据占位符与跨平台措辞
- 用 asc screenshots plan/apply 批量规划并应用截图
- 用 asc auth login 管理多套 API Key 与 CI 无钥匙串认证
容易踩的坑
- 6.6.0最新正式版2026-11-09 · 2026-11-09 18:48 UTC
What's Changed
- feat(assets): add --no-wait to screenshots upload by @AfeiFun in https://github.com/rorkai/App-Store-Connect-CLI/pull/3401
- fix(storekit): request linkage for promoted purchase scope checks by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3404
- fix(analytics): handle unpublished sales reports with allow-missing by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3403
- fix(analytics): stop download instance paging after a match by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3405
- fix(reviews): preserve partial storefront lookup errors by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3406
- fix(analytics): stop targeted view paging after an instance match by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3407
- fix(assets): reuse settled screenshot status on resume by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3408
- fix(auth): use the uploaded build ID in doctor guidance by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3409
- fix(localizations): verify ownership of explicit app info IDs by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3410
- fix(builds): start the processing deadline after upload commit by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3411
- fix(review): stop duplicate item lookup at the active match by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3412
- fix(assets): reuse ready asset library image commit responses by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3413
- fix(xcode): check wait credentials before direct upload by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3414
- fix(api): send documented query parameters on mutations by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3415
- fix(auth): sign with inline keys without a temp file by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3416
- fix(testflight): deduplicate groups when creating a beta tester by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3417
- fix(xcode): preserve existing archives until overwrite succeeds by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3418
- fix(submit): verify explicit app ownership before cancellation by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3419
- fix(metadata): verify explicit App Info ownership before push by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3420
- fix(cli): reject owner flags that pagination cursors override by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3421
- fix(testflight): skip unused beta group pages for exact IDs by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3422
- fix(release): reject internal-only builds before staging writes by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3423
- fix(status): omit review submission hints for internal-only builds by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3424
- fix(screenshots): recheck replacement dimensions before deleting assets by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3425
- fix(web): reject a different Apple Account during cached resume by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3426
- fix(versions): update version attributes and build together by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3427
- fix(versions): reject app scopes overridden by cursors by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3428
- fix(web): reject negative provider IDs before auth by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3429
- fix(screenshots): retry transient delivery statu
- 6.5.32026-11-07 · 2026-11-07 07:17 UTC
查看更新说明
What's Changed
- feat(assets): make concurrent asc uploads wait their turn and scale the upload deadline by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3399
Full Changelog: https://github.com/rorkai/App-Store-Connect-CLI/compare/6.5.2...6.5.3
- 6.5.22026-11-07 · 2026-11-07 03:07 UTC
查看更新说明
What's Changed
- chore(deps): bump apple-actions/import-codesign-certs from 7.1.0 to 7.2.0 by @dependabot[bot] in https://github.com/rorkai/App-Store-Connect-CLI/pull/3392
- chore(deps): bump actions/setup-python from 6 to 7 by @dependabot[bot] in https://github.com/rorkai/App-Store-Connect-CLI/pull/3394
- chore(deps): bump github.com/aws/aws-sdk-go-v2/service/secretsmanager from 1.50.6 to 1.50.8 by @dependabot[bot] in https://github.com/rorkai/App-Store-Connect-CLI/pull/3395
- chore(deps): bump github/codeql-action/init from dd677812177e0c29f9c970a6c58d8607ae1bfefd to 0911ee96d2d6c8def97122c36c5cadd93829a4b4 by @dependabot[bot] in https://github.com/rorkai/App-Store-Connect-CLI/pull/3391
- chore(deps): bump github.com/aws/aws-sdk-go-v2/credentials from 1.20.11 to 1.20.13 by @dependabot[bot] in https://github.com/rorkai/App-Store-Connect-CLI/pull/3396
- chore(deps): bump github.com/aws/aws-sdk-go-v2/config from 1.33.11 to 1.33.13 by @dependabot[bot] in https://github.com/rorkai/App-Store-Connect-CLI/pull/3397
- feat(auth): let asc use a short-lived token from ASC_BEARER_TOKEN instead of a private key by @LevanKvirkvelia in https://github.com/rorkai/App-Store-Connect-CLI/pull/3398
New Contributors
- @LevanKvirkvelia made their first contribution in https://github.com/rorkai/App-Store-Connect-CLI/pull/3398
Full Changelog: https://github.com/rorkai/App-Store-Connect-CLI/compare/6.5.1...6.5.2
- 6.5.12026-11-06 · 2026-11-06 12:11 UTC
查看更新说明
What's Changed
- apps wall: add Rindraw: Draw, Sketch & Paint by @sawirricardo in https://github.com/rorkai/App-Store-Connect-CLI/pull/3376
- apps wall: add BabyAnalytic: Baby Tracker by @sawirricardo in https://github.com/rorkai/App-Store-Connect-CLI/pull/3377
- apps wall: add CleanStorage – Swipe & Clean by @sawirricardo in https://github.com/rorkai/App-Store-Connect-CLI/pull/3378
- apps wall: add Math Daily: Mental Math Games by @sawirricardo in https://github.com/rorkai/App-Store-Connect-CLI/pull/3379
- apps wall: add Par: Financial Calculator RPN by @sawirricardo in https://github.com/rorkai/App-Store-Connect-CLI/pull/3380
- apps wall: add Pawlitics: Election Simulator by @sawirricardo in https://github.com/rorkai/App-Store-Connect-CLI/pull/3381
- apps wall: add Squishu: Squishy Dumpling Game by @sawirricardo in https://github.com/rorkai/App-Store-Connect-CLI/pull/3382
- fix: remove narrowing conversion from PKG plist allocation by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3385
- apps wall: add Water Tracker - IdroFlow by @federicotrevisani6 in https://github.com/rorkai/App-Store-Connect-CLI/pull/3384
- docs: move docs.asccli.sh to Astro Starlight by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3386
- docs: remove Mintlify by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3387
- apps wall: add Flashcard Maker & FSRS: Azri by @bootuz in https://github.com/rorkai/App-Store-Connect-CLI/pull/3389
- feat(assets): back off media processing polls and add --poll-interval by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3390
New Contributors
- @federicotrevisani6 made their first contribution in https://github.com/rorkai/App-Store-Connect-CLI/pull/3384
- @bootuz made their first contribution in https://github.com/rorkai/App-Store-Connect-CLI/pull/3389
Full Changelog: https://github.com/rorkai/App-Store-Connect-CLI/compare/6.5.0...6.5.1
- 6.5.02026-11-05 · 2026-11-05 12:16 UTC
查看更新说明
What's Changed
- apps wall: add Type Island: Text Widgets by @liloutest in https://github.com/rorkai/App-Store-Connect-CLI/pull/3346
- apps wall: add StoryRoom : Memory & Ideas by @liloutest in https://github.com/rorkai/App-Store-Connect-CLI/pull/3347
- docs: fix stale examples and cut duplicated prose by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3360
- test(artifacts): classify unsupported CMS-only Xcode packages by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3363
- chore: sync official App Store Connect OpenAPI 4.6 by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3362
- fix(analytics): warn that the INSTALLS sales report type is deprecated by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3364
- test: fold release, install, and output tests into tables by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3349
- test(cmdtest): share next-URL tables and fold a-f sibling tests by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3350
- test(cmdtest): fold s-z sibling tests into tables by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3352
- refactor(distribute): remove dead publish copy and fold snitch tests by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3353
- refactor(asc): decode attributes once and drop envelope round-trip tests by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3354
- refactor(web): drop duplicate helpers and help-prose tests by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3355
- refactor(cli): reuse flag helpers and fold catalog tests into tables by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3356
- refactor(cli): drop test-only helpers from catalog packages by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3357
- refactor(signing): drop impossible nil guards and merge output buffers by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3358
- feat(subscriptions): add retention offer commands by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3366
- refactor(xcode): merge duplicated helpers and drop test-only wrappers by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3359
- fix(xcode): prefer numeric xcresult test durations by @hiragram in https://github.com/rorkai/App-Store-Connect-CLI/pull/3361
- test(cmdtest): fold g-r sibling tests into tables by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3351
- fix(game-center): preserve nullable default images by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3368
- fix(game-center): use ${local-id} for inline initial versions by @kotaroyamazaki in https://github.com/rorkai/App-Store-Connect-CLI/pull/3365
- docs(analytics): explain deprecated INSTALLS reports by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3370
- feat(subscriptions): manage retention messages by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3367
- docs: reuse PR reviews when main advances by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3369
- docs: require only the final full-branch review by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3371
- feat(cli): accept 4.6 retention selectors on app and placement reads by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3372
- docs(subscriptions): document Apple's live retention messaging rules by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3373
- ci: remove redundant shipping validation by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3375
- test(artifacts): accept Xcode packages with unreadable PackageInfo encodings by @rudrankriyam in https://github.com/rorkai/App-Store-Connect-CLI/pull/3374
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
App Store Connect CLI
A fast, lightweight, and scriptable CLI for the App Store Connect API. Automate iOS, macOS, tvOS, and visionOS release workflows from your terminal, IDE, or CI/CD pipeline.
Table of Contents
- asc skills
- Quick Start
- Troubleshooting
- Privacy and telemetry
- Support
- Wall of Apps
- Common Workflows
- Commands and Reference
- Documentation
- Acknowledgements
- Contributing
- License
asc skills
Agent Skills for automating asc workflows including builds, TestFlight, metadata sync, submissions, and signing:
https://github.com/rorkai/app-store-connect-cli-skills
Install them globally so they are available across projects:
asc install-skills
The command installs the 25 skills from pinned, reviewed commit
f52c4f04323bb2dfb21ca8be82e6494e9cd0b4d8 and requires only git; it runs no Node.js, npx, npm package, or repository script. See
Agent skills for what it verifies and changes.
Quick Start
If you want to confirm the binary works before configuring authentication:
asc version
asc --help
1. Install
# Homebrew (recommended)
brew install asc
# Install script (macOS/Linux)
curl -fsSL https://asccli.sh/install | bash
# Windows (WinGet, once the package is accepted)
winget install asc
# Exact fallback when scripting
winget install --id Rorkai.ASC --exact
The WinGet package is tracked in
GitHub Discussion #1552.
Until it appears in winget search asc, Windows users can download the
release binaries directly from the
GitHub releases page.
For source builds and contributor setup, see CONTRIBUTING.md.
Released binaries are self-contained and do not require a Go installation;
source builds use the toolchain version declared by go.mod.
Releases built with Go 1.27 require macOS 13 Ventura or later. On older Macs,
retain an older compatible release or upgrade macOS before updating asc.
2. Authenticate
asc auth login \
--name "MyApp" \
--key-id "ABC123" \
--issuer-id "DEF456" \
--private-key /path/to/AuthKey.p8 \
--network
Individual API keys have no issuer ID. Omit --issuer-id and pass --key-type individual:
asc auth login \
--name "MyIndividualKey" \
--key-id "ABC123" \
--key-type individual \
--private-key /path/to/AuthKey.p8
Generate API keys at: https://appstoreconnect.apple.com/access/integrations/api
If a service holds the private key and signs App Store Connect tokens for you, set ASC_BEARER_TOKEN to such a token instead of configuring a key; asc sends it until it expires (Apple's maximum is 20 minutes). See Authentication.
If you are running in CI, a headless shell, or a machine where keychain access is not available, use config-backed auth instead:
asc auth login \
--bypass-keychain \
--name "MyCIKey" \
--key-id "ABC123" \
--issuer-id "DEF456" \
--private-key /path/to/AuthKey.p8
3. Validate auth
asc auth status --validate
asc auth doctor
4. First command
asc apps list --output table
asc apps list --output json --pretty
Output defaults (TTY-aware)
asc chooses a default --output based on where stdout is connected:
- Interactive terminal (TTY):
table - Non-interactive output (pipes/files/CI):
json
You can still set a global preference:
export ASC_DEFAULT_OUTPUT=markdown
And explicit flags always win:
asc apps list --output json
Compatibility
Commands are supported as documented. Deprecation warnings identify the available migration path and the command's long-term replacement.
Troubleshooting
Homebrew
- Refresh Homebrew first:
brew update && brew upgrade asc - Check which binary you are running:
which asc - Confirm the installed version:
asc version - If Homebrew is behind the latest GitHub release, use the install script from
https://asccli.sh/install
WinGet
- Refresh WinGet sources first:
winget source update - Prefer the short install once available:
winget install asc - If the short name ever becomes ambiguous, use the package identifier:
winget install --id Rorkai.ASC --exact - Confirm the installed command resolves:
Get-Command ascandasc version
Authentication
- Validate the active profile:
asc auth status --validate - Run the auth health check:
asc auth doctor - If keychain access is blocked, retry with
ASC_BYPASS_KEYCHAIN=1or re-runasc auth login --bypass-keychain - Use
asc auth login --local --bypass-keychain ...when you want repo-local credentials in./.asc/config.json
Apple service health
- Check Apple's developer services without credentials:
asc system-status - Narrow unexpected API or upload failures:
asc system-status --service "App Store Connect" - Poll only when requested:
asc system-status --watch --poll-interval 30s - Use
--issues-onlyfor a concise incident view; summary counts still cover all matched services
Output
- Use an explicit format when scripting or sharing repro steps:
--output json,--output table, or--output markdown - Add
--prettyto JSON output for bug reports
Privacy and telemetry
asc sends pseudonymous command-level usage telemetry by default to help
maintainers understand which commands are used and where reliability work is
needed. Local events include a random installation ID, which lets events from
one installation be grouped over time; it is not derived from an Apple account
or machine identifier.
Telemetry includes the CLI version, operating system and architecture, registered command path, duration, runtime context, invocation source, a bounded outcome class, and the HTTP status when an API request fails. It may include a sanitized public flag name. It does not include raw arguments, stderr, error messages, flag values, response bodies, credentials, private keys, Apple account, team, or issuer IDs, app or bundle IDs, usernames, hostnames, repository names, or file paths.
Review or change telemetry at any time:
asc telemetry status
asc telemetry disable
asc telemetry reset-id
ASC_TELEMETRY_DISABLED=1 and DO_NOT_TRACK=1 also disable telemetry. See the
telemetry reference for the exact event payload,
runtime handling, collector endpoint, and all controls.
Support
- Use GitHub Discussions for install help, authentication setup, workflow advice, and "how do I...?" questions
- Use GitHub Issues for reproducible bugs and concrete feature requests
- See SUPPORT.md for the support policy and bug-report checklist
- Before filing an auth or API bug, retry with
ASC_BYPASS_KEYCHAIN=1; if it is safe to do so, include redacted output fromASC_DEBUG=api asc ...orasc --api-debug ...
Wall of Apps
Want to add yours?
asc apps wall submit --app "1234567890" --confirm
The command uses your authenticated gh session to fork the repo and open a pull request that updates docs/wall-of-apps.json.
It resolves the public App Store name, URL, and icon from the app ID automatically. For manual entries that are not on the public App Store yet, use --link with --name.
Use asc apps wall submit --dry-run to preview the fork, branch, and PR plan before creating anything.
Common Workflows
TestFlight feedback and crashes
asc testflight feedback list --app "123456789" --paginate
asc testflight crashes list --app "123456789" --sort -createdDate --limit 10
asc testflight crashes log --submission-id "SUBMISSION_ID"
Builds and distribution
asc builds upload --app "123456789" --ipa "/path/to/MyApp.ipa"
asc builds list --app "123456789" --output table
asc testflight groups list --app "123456789" --output table
For macOS TestFlight distribution, upload the exported .pkg first, then add
the processed build to a beta group:
asc builds upload --app "123456789" --pkg "./build/MyMacApp.pkg" --version "1.2.3" --build-number "42" --wait --output json
asc builds add-groups --app "123456789" --build-number "42" --version "1.2.3" --platform MAC_OS --group "Internal Testers"
--app is the App Store Connect app ID. If you use local Xcode build flags such
as --archive-path, also pass exactly one of --workspace or --project plus
--scheme; otherwise use a pre-exported .ipa or .pkg upload. Add
--submit --confirm to asc builds add-groups when distributing to an external
TestFlight group that needs beta app review submission.
Release (high-level App Store publish flow)
# Optional: preview the staging plan before submission
asc release stage --app "123456789" --version "1.2.3" --build-id "BUILD_ID" --copy-metadata-from "1.2.2" --dry-run
# Canonical upload + attach + submit command
asc publish appstore --app "123456789" --ipa "/path/to/MyApp.ipa" --version "1.2.3" --submit --confirm
# Wait for the App Review decision (exit 0 approved, 1 rejected, 7 still pending at --timeout)
asc status --app "123456789" --until review-done --timeout 2h
Lower-level submission lifecycle commands (for debugging or partial workflows):
# Canonical readiness check
asc validate --app "123456789" --version "1.2.3"
asc submit status --version-id "VERSION_ID"
asc submit cancel --version-id "VERSION_ID" --confirm
asc validate also flags placeholder text, other-platform and test-build
wording, and outdated copyright ranges in localized metadata. Warnings are
advisory unless you pass --strict:
asc validate --app "123456789" --version "1.2.3" --output json
asc validate --app "123456789" --version "1.2.3" --strict
Add --deep for the checks Apple exposes only through its signed-in web app
(App Privacy publication, agreements, and first-subscription attachment). It
reuses a cached web session and never prompts; a check it cannot verify reports
unverified, which fails only with --strict:
asc web auth login --apple-id "[email protected]"
asc validate --app "123456789" --version "1.2.3" --deep
macOS release builds support USB security keys for web login with
--two-factor-method security-key; see Security key login.
See commands/validate.mdx for every check and finding ID.
Review status and blockers
asc review status --app "123456789"
asc review doctor --app "123456789"
Metadata and localization
asc localizations list --app "123456789" --type app-info
asc metadata init --dir "./metadata" --version "1.2.3" --locale "en-US"
# Fill in the values to apply and delete keys to leave unchanged; empty values are rejected.
asc metadata apply --app "123456789" --version "1.2.3" --dir "./metadata" --dry-run
asc metadata keywords audit --app "123456789" --version "1.2.3" --blocked-terms-file "./blocked-terms.txt"
asc apps info view --app "123456789" --output json --pretty
Use asc metadata keywords audit before sync or apply when you want an ASO-focused
review of live keyword metadata across locales. It reports duplicate phrases, repeated
terms across locales, overlap with localized app name or subtitle, byte-budget usage,
and optional blocked terms from repeated --blocked-term flags or a text file.
Screenshots and media
asc screenshots plan --app "123456789" --version "1.2.3" --review-output-dir "./screenshots/review"
asc screenshots apply --app "123456789" --version "1.2.3" --review-output-dir "./screenshots/review" --confirm
asc screenshots list --version-localization "VERSION_LOCALIZATION_ID"
asc video-previews list --version-localization "VERSION_LOCALIZATION_ID"
Uploading screenshots for a single locale:
asc apps list
asc versions list --app "APP_ID"
asc localizations list --version "VERSION_ID" --output json --locale "en-US" | jsonpp
asc screenshots upload --version-localization "VERSION_LOCALIZATION_ID" --path "./screenshots/en-US" --device-type "IPHONE_65" --replace --confirm --max-screenshots 10
VERSION_LOCALIZATION_ID is the App Store version localization resource ID
from data[].id, not the locale code from attributes.locale.
For local capture coverage across multiple devices, locales, appearances, and content fixtures, use a matrix plan. Targets must already be booted simulators; the command writes raw artifacts and an offline review report, without uploading to App Store Connect:
asc screenshots matrix --plan .asc/screenshots-matrix.json --max-concurrency 2 --output json --pretty
See docs/design/screenshots-matrix.md for the JSONC schema, isolated output layout, retry behavior, and review contract.
Signing and bundle IDs
asc bundle-ids capabilities list --bundle "BUNDLE_ID"
asc signing fetch --bundle-id com.example.app --profile-type IOS_APP_STORE --output .asc/signing
asc signing sync pull --repo [email protected]:team/signing.git --password-file ~/.config/asc/signing-sync-password --output-dir .asc/signing/pulled
signing fetch downloads public certificates and provisioning profiles. A
usable signing identity also needs the matching private key; signing sync
can verify that local identity and share it through an encrypted store (Git by
default). When the team has no active certificate, signing fetch --create-missing --create-missing-certificate creates the key, certificate,
profile, and .p12 in one pass. signing keychain installs and manages a
dedicated keychain, and xcode signing plan --profile maps downloaded profiles
onto Xcode targets; docs/CI_CD.md lists the fresh-runner
sequence. For multi-target release testing, signing reconcile plans exact
device/profile changes. signing run provides a temporary macOS keychain only
for single-target archives. Multi-target exports must import the identity into
a job-scoped keychain and install every reconciled profile for the job-exclusive
macOS user. See the
signing guide for setup, CI, rotation, security
boundaries, and troubleshooting.
Workflow automation
asc workflow validate --output json
asc workflow run --dry-run testflight_beta VERSION:1.2.3
Raw API requests
asc api GET /v1/apps --query limit=5
asc api GET /v1/apps/APP_ID/relationships/builds --paginate
asc api PATCH /v1/apps/APP_ID --confirm --body-file update.json
Verified local Xcode -> TestFlight workflow
See docs/WORKFLOWS.md for local compile validation with
asc xcode build and a copyable .asc/deployment.json, .asc/workflow.json,
and ExportOptions.plist that use asc builds next-build-number,
asc xcode inject, asc xcode archive, asc xcode export --timeout 10m, and
asc publish testflight --group ... --wait. Add --submit --confirm when
distributing to an external TestFlight group that needs beta app review submission.
asc xcode test runs unit and UI tests with structured results and keeps the
.xcresult bundles; the same guide has an invocation.
asc xcode inject --manifest .asc/deployment.json --set version=1.2.3 --set build_number=42 --dry-run --output json
asc xcode build --project App.xcodeproj --scheme App --destination 'platform=iOS Simulator,name=iPhone 17 Pro Max,OS=27.0' --no-code-signing --output json
asc workflow run testflight_beta VERSION:1.2.3
Replace the example Xcode destination with a simulator installed on the host.
Xcode Cloud workflows and build runs
# Trigger from a pull request
asc xcode-cloud run --workflow-id "WORKFLOW_ID" --pull-request-id "PR_ID"
# Rerun from an existing build run with a clean build
asc xcode-cloud run --source-run-id "BUILD_RUN_ID" --clean
# Fetch a single build run by ID
asc xcode-cloud build-runs view --id "BUILD_RUN_ID"
Apple Ads campaign management
Apple Ads uses separate OAuth credentials from App Store Connect:
asc ads auth login --name "Marketing" --client-id "SEARCHADS_CLIENT_ID" --team-id "SEARCHADS_TEAM_ID" --key-id "KEY_ID" --private-key ./ads-key.pem --ad-account "987654"
asc ads auth discover --output json
asc ads campaigns find --ad-account "987654" --file query.json --output json
asc ads reports apps campaigns --ad-account "987654" --file report.json --output json
See guides/apple-ads-playbooks.mdx for operator playbooks covering credential safety, org inspection, read-only smoke tests, reporting, raw API usage, and guarded mutations.
StoreKit server APIs
The App Store Server API and Retention Messaging use a dedicated In-App Purchase API key, separate from App Store Connect API credentials:
asc storekit auth login --name Production --key-id "KEY_ID" --issuer-id "ISSUER_ID" --private-key ./SubscriptionKey.p8 --bundle-id com.example.app
asc storekit auth doctor --environment sandbox --network
asc storekit transactions history --transaction-id "2000000000000001" --environment production --paginate
asc storekit subscriptions status --transaction-id "2000000000000001" --environment production --output table
asc storekit notifications history --start 2026-09-01 --end 2026-09-08 --only-failures --environment production
asc storekit retention-messaging messages list --environment sandbox --output json
JSON output prints Apple's response unmodified. --decode adds decoded JWS
payloads without verifying Apple's signature, so don't grant entitlements from
decoded output alone.
See docs/architecture/storekit-retention-messaging.md for the endpoint map, message and image requirements, environment variables, and the full sandbox verification sequence.
Commands and Reference
Use built-in help as the source of truth:
asc --help
asc <command> --help
asc <command> <subcommand> --help
Reference hierarchy:
asc --help: authoritative command and flag surface- docs/COMMANDS.md: generated top-level taxonomy map
asc docs show workflows: curated workflow recipesasc docs show reference: repo-local quick reference template used byasc init
Documentation
- docs/CI_CD.md - CI/CD integration guides (GitHub Actions, GitLab, Bitrise, CircleCI)
- commands/signing.mdx - signing identities, encrypted sync, CI, and release-testing profiles
- docs/COMMANDS.md - Command families and reference navigation
- docs/PARITY.md - Remaining parity areas and intentional non-goals
- docs/WORKFLOWS.md - Reusable workflow patterns, including local Xcode to TestFlight
- docs/linux-ios.md - Portable Linux iOS builds and IPA packaging with xtool and rcodesign
- guides/apple-ads-playbooks.mdx - Apple Ads operator playbooks
- docs/architecture/storekit-retention-messaging.md - Retention Messaging setup and sandbox verification
- docs/API_NOTES.md - API quirks and behaviors
- docs/CONTRIBUTING.md - CLI development and testing notes
- docs/TESTING.md - Testing patterns and conventions
- docs/openapi/README.md - Offline OpenAPI snapshot + update flow
- CONTRIBUTING.md - Contribution guide
Acknowledgements
Local screenshot framing uses Koubou (pinned to 0.20.0) for deterministic device-frame rendering.
GitHub: https://github.com/bitomule/koubou
Simulator UI automation for screenshot capture and interactions uses AXe CLI. GitHub: https://github.com/cameroncooke/AXe
The keyword difficulty methodology used by asc optimize keywords score is adapted from semihcihan's App Store Optimization CLI (MIT licensed).
GitHub: https://github.com/semihcihan/App-Store-Optimization-CLI
Contributing
Contributions are welcome. See CONTRIBUTING.md for details.
License
MIT License - see LICENSE for details.