Get started with the App Store Connect CLI in minutes
This guide walks you through your first asc commands, from authentication to making your first API call.
Before starting, make sure you have:
- [x] Installed
asc(Installation guide) - [x] Generated App Store Connect API credentials (Authentication guide)
- [x] A
.p8private key file from App Store Connect
Store your API credentials using asc auth login:
asc auth login \
--name "MyApp" \
--key-id "ABC123DEFG" \
--issuer-id "12345678-abcd-1234-abcd-123456789012" \
--private-key ~/.asc/AuthKey_ABC123.p8Expected output:
```
Credential storage: System Keychain
Location: system keychain
Stored credentials:
Name Key ID Default Stored In
MyApp ABC123DEFG yes keychain
```
Fetch all apps associated with your account:
asc apps listSample output (interactive terminal):
┌────────────┬──────────────┬─────────────────┬────────────────┐
│ ID │ Name │ Bundle ID │ SKU │
├────────────┼──────────────┼─────────────────┼────────────────┤
│ 123456789 │ My Great App │ com.example.app │ MY_GREAT_APP_1 │
│ 987654321 │ Another App │ com.example.two │ ANOTHER_APP_2 │
└────────────┴──────────────┴─────────────────┴────────────────┘
asc apps list --output json --prettyOutput:
{
"data": [
{
"id": "123456789",
"type": "apps",
"attributes": {
"name": "My Great App",
"bundleId": "com.example.app",
"sku": "MY_GREAT_APP_1",
"primaryLocale": "en-US"
}
}
]
}Use the app ID from the previous step to view detailed information:
asc apps view --id "123456789" --output json --prettyA default app helps with commands that accept --app:
export ASC_APP_ID="123456789"
asc apps info view # Uses ASC_APP_ID automaticallyOr add to your shell profile (~/.bashrc, ~/.zshrc, etc.):
echo 'export ASC_APP_ID="123456789"' >> ~/.zshrcList recent builds for your app:
asc builds list --app "123456789" --sort -uploadedDate --limit 5Sample output:
┌─────────────┬─────────┬──────────┬─────────────────────┬──────────────────┐
│ ID │ Version │ Build │ Uploaded │ Processing State │
├─────────────┼─────────┼──────────┼─────────────────────┼──────────────────┤
│ abc123 │ 1.2.3 │ 45 │ 2026-03-04 10:30:00 │ VALID │
│ def456 │ 1.2.2 │ 44 │ 2026-03-03 15:20:00 │ VALID │
│ ghi789 │ 1.2.1 │ 43 │ 2026-03-02 09:15:00 │ VALID │
└─────────────┴─────────┴──────────┴─────────────────────┴──────────────────┘
View feedback from beta testers:
asc testflight feedback list --app "123456789" --limit 10asc testflight crashes list --app "123456789" --sort -createdDate --limit 5asc builds upload \
--app "123456789" \
--ipa "/path/to/MyApp.ipa"asc testflight groups list --app "123456789"asc builds add-groups \
--build-id "abc123" \
--group "def456"Before submitting for review:
asc validate --app "123456789" --version "1.2.3"asc publish appstore --app "123456789" --ipa "./MyApp.ipa" --version "1.2.3" --submit --confirmasc is self-documenting. Use --help at any level:
asc builds --helpasc builds list --helpSample --help output:
USAGE
asc builds list [flags]
FLAGS
--app string App ID (required)
--sort string Sort results (e.g., -uploadedDate)
--limit int Limit results (default: 20)
--paginate Fetch all pages
--output string Output format: table, json, markdown
--pretty Pretty-print JSON output
EXAMPLES
asc builds list --app "123456789"
asc builds list --app "123456789" --sort -uploadedDate --limit 10
asc builds list --app "123456789" --paginate --output json
asc supports multiple output formats:
Human-readable tabular output with borders.
Minified JSON for machine parsing.
Indented JSON for readability.
Markdown-formatted tables.
export ASC_DEFAULT_OUTPUT=json
asc apps list # Always outputs JSONExplicit flags always override defaults:
ASC_DEFAULT_OUTPUT=json asc apps list --output tableasc uses standard exit codes:
0: Success1: Runtime error (API failure, network issue, etc.)2: Usage error (invalid flags, missing arguments)
if asc apps view --id "123456789" > /dev/null 2>&1; then
echo "App found"
else
echo "Error: $?"
fi# Extract app names
asc apps list --output json | jq -r '.data[].attributes.name'
# Filter by bundle ID
asc apps list --output json | jq '.data[] | select(.attributes.bundleId == "com.example.app")'
# Count builds
asc builds list --app "123456789" --output json | jq '.data | length'Manual pagination:
# First page
asc builds list --app "123456789" --limit 20
# Next page (use the 'next' link from JSON output)
asc builds list --app "123456789" --limit 20 --next "CURSOR_VALUE"Automatic pagination:
asc builds list --app "123456789" --paginateCommon environment variables for convenience:
export ASC_APP_ID="123456789" # Default app ID
export ASC_DEFAULT_OUTPUT="json" # Default output format
export ASC_TIMEOUT="90s" # Request timeout
export ASC_DEBUG="api" # Enable API debug loggingSee Environment Variables Reference for the complete list.
Browse all available commands and flags Automate workflows in GitHub Actions, GitLab CI, and more Create multi-step automation with `asc workflow` Real-world examples for common tasks Ensure `asc` is in your `PATH`:```bash theme={null}
which asc
```
If empty, add the installation directory to your shell profile:
```bash theme={null}
export PATH="$HOME/.local/bin:$PATH"
```
```bash theme={null}
asc auth status --validate
```
Run the doctor to diagnose issues:
```bash theme={null}
asc auth doctor
```
* Reduce request frequency
* Use `--limit` to fetch fewer results
* Cache API responses locally
The CLI automatically retries rate-limited requests with exponential backoff.
```bash theme={null}
export ASC_TIMEOUT="120s"
asc builds upload --app "123456789" --ipa large.ipa
```
For uploads, use `ASC_UPLOAD_TIMEOUT`:
```bash theme={null}
export ASC_UPLOAD_TIMEOUT="300s"
```
- Built-in docs:
asc --helporasc <command> --help - GitHub Issues: Report bugs or request features
- Discussions: Ask questions and share workflows