App-Store-Connect-CLI README

The project's README from github.com/rorkai/App-Store-Connect-CLI. As one markdown file: README.md.

App Store Connect CLI

Latest Release GitHub Stars Go version from go.mod License Homebrew

asc -- 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

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

asc install-skills checks out reviewed commit f52c4f04323bb2dfb21ca8be82e6494e9cd0b4d8 and copies its 25 skills directly into the standard global agent-skills directory. It verifies the complete pack and every installed file before succeeding, preserves unrelated skills and unrelated lock entries, and pins the 25 ASC lock entries to the same reviewed commit so external checks cannot update them from a mutable branch. It rolls back the pack if any replacement fails. Only git is required; the command does not execute Node.js, npx, an npm package, or repository scripts.

git --version
asc install-skills

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 signed 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.

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 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:

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

WinGet

Authentication

Apple service health

Output

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

Wall of Apps

See the 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

# Monitor status after submission
asc status --app "123456789" --watch

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

Readiness validation also warns when localized app names, subtitles, descriptions, keywords, promotional text, or What's New copy still contains an unmistakable template marker such as Lorem ipsum, TODO, TBD, or FIXME. Lorem ipsum matches in any letter case. TODO, TBD, and FIXME match only in uppercase because their lowercase spellings can be ordinary product wording. The warning includes the locale, field, matched text, resource ID, and a remediation step. It is advisory by default and becomes blocking only with --strict:

asc validate --app "123456789" --version "1.2.3" --output json
asc validate --app "123456789" --version "1.2.3" --strict

Add the --deep mode when a release needs checks that Apple exposes only through its signed-in web app:

asc web auth login --apple-id "[email protected]"
asc validate --app "123456789" --version "1.2.3" --deep

Deep validation reuses the file-backed cache without opening a login, Keychain, password, or 2FA prompt. It checks App Privacy publication, relevant agreements, and the first auto-renewable subscription attachment; availability and required App Review fields still come from the public API. Paid-agreement relevance also uses the app's current public price so an upfront-paid app isn't mistaken for a free one. The private Apple endpoints can change without notice, so an unavailable or changed response is unverified, not a false blocker. Add --strict if CI must fail when a requested deep check can't be verified.

This lint intentionally does not judge platform names, roadmap language, or beta/demo wording because those phrases can be legitimate product copy and cannot be classified reliably offline. It also leaves shorter Lorem Ipsum product wording and ordinary localized TODO copy without marker punctuation unflagged; only template-like residue is reported.

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"
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 --app "123456789"

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 --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 Git repository. 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

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.

The asc xcode test command provides local unit/UI test execution with structured results and preserved .xcresult bundles; see the same workflow guide for an invocation.

asc workflow validate --output json
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 --dry-run testflight_beta VERSION:1.2.3
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 get --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 Retention Messaging

Retention Messaging uses 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 retention-messaging messages list --environment sandbox --output json
asc storekit retention-messaging endpoint view --environment production

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:

For full command families, flags, and discovery patterns, see:

Documentation

App-Store-Connect-CLI (rorkai/App-Store-Connect-CLI)

Searching Database…

这是什么?App Store Connect CLI(asc)是一款快速、可编写脚本的命令行工具,用于 App Store Connect API。你可以在终端、IDE 或 CI/CD 流水线中自动化处理 TestFlight、构建版本、提交、签名、数据分析、截图和订阅等操作。
这是命令行工具,还是包装了其他应用?它是一个独立的 Go 命令行二进制程序,直接与 Apple 的 App Store Connect API 通信;它还附带可安装的 'Agent Skills',供 AI 编程代理驱动发布流程。
我该怎么安装和设置?从 GitHub releases 下载已签名的发布版二进制文件(Windows 版尚待 WinGet 上架),或在 macOS 上通过 Homebrew 安装;发布版二进制文件是自包含的,无需安装 Go。然后使用 asc auth login,用 App Store Connect API 密钥完成身份验证。
使用它需要准备什么?你需要一个 App Store Connect API 密钥(个人密钥可以带或不带 issuer ID);如果是 CI 或没有钥匙串访问权限的无界面机器,可以使用基于配置文件的身份验证,而不是系统钥匙串。
深度发布验证总是可靠吗?深度验证依赖 Apple 的私有网页接口(需要登录),这些接口可能随时变更,因此接口不可用或返回内容有变化时,结果会被标记为未验证,而不是直接报错,除非你传入 --strict。
它能在 macOS、Windows 和 Linux 上运行,还是只支持 macOS?它可以在 macOS 和 Windows 上运行(可通过 Homebrew、WinGet 或 GitHub 发布版二进制文件安装);与签名相关的命令会使用临时的 macOS 钥匙串,这意味着签名流程仅限 macOS,而一般的命令行用法是跨平台的。
asc 会收集哪些遥测数据?我能关闭吗?asc 默认会发送与随机安装 ID 关联的假名化命令级使用遥测数据(包括 CLI 版本、操作系统/架构、命令路径、耗时和结果类别),但绝不会发送原始参数、凭据、API 密钥、应用及 bundle ID,也不会发送文件路径;可以通过设置 ASCTELEMETRYDISABLED=1 或 DONOTTRACK=1 将其关闭。
asc install-skills 命令是什么?我为什么要信任它?它会检出一个经过审核的特定 git 提交,并将 25 个经过审核的代理技能复制到标准的全局 agent-skills 目录中;它会校验每个文件,并将锁定条目固定到该提交,因此无法被悄悄更新。它只需要 git,不会执行 Node.js、npx 或仓库中的任何脚本。
asc 能处理从构建到提交 App Store 的完整发布流程吗?是的,它覆盖端到端的完整流程:使用 Xcode 构建和归档、上传到 TestFlight、运行就绪性验证、管理签名身份、同步元数据和截图,以及提交 App Review 审核。
asc 怎么发现我 App Store 元数据里遗留的占位文字?就绪性验证会标记本地化名称、描述和关键词中明显的模板标记,例如 'Lorem ipsum'、'TODO'、'TBD' 或 'FIXME',并报告对应的语言区域、字段和匹配的文本;默认仅作为提示,使用 --strict 时则会阻止提交。
asc 也能管理 Apple Ads 和订阅消息吗?能。它使用独立的 OAuth 凭据来管理 Apple Ads 广告系列,并使用专用的 In-App Purchase API 密钥来支持 StoreKit Retention Messaging,每项都有各自的文档指南。
Creator
rorkai
Size
101 MB
Stars
8K
Age
8mo
Commits · 90 Days