The App Store Connect API lets you automate tasks you normally do in App Store Connect: list your apps, manage versions, update metadata (description, keywords, what’s new), and download analytics or sales reports.
You provide your own App Store Connect API key via request headers. Appeeky proxies your requests to Apple’s API—your private key never leaves your request and is not stored.
Authentication
All App Store Connect endpoints require these headers in addition to your Appeeky API key:
| Header | Required | Description |
|---|
X-ASC-Issuer-Id | Yes | Your Issuer ID (UUID from Users and Access > Keys) |
X-ASC-Key-Id | Yes | Your Key ID (e.g. Y38QBZP2W9) |
X-ASC-Private-Key | Yes* | Your private key (PEM format, including -----BEGIN PRIVATE KEY----- and -----END PRIVATE KEY-----) |
X-ASC-Private-Key-B64 | Yes* | Base64-encoded private key (alternative to X-ASC-Private-Key) |
* Provide either X-ASC-Private-Key or X-ASC-Private-Key-B64
Creating API Keys
- Go to App Store Connect → Users and Access → Keys
- Create a new key with the required roles (e.g. Admin for full access, App Manager for app/version management)
- Download the
.p8 file once — you cannot download it again
- Note your Issuer ID and Key ID from the Keys page
cURL Example
curl -X GET "https://api.appeeky.com/v1/connect/apps?bundleId=app.taperecord" \
-H "X-API-Key: YOUR_APEEKY_KEY" \
-H "X-ASC-Issuer-Id: 2a40fc77-6d22-4bbd-8dad-28de4f304383" \
-H "X-ASC-Key-Id: Y38QBZP2W9" \
-H "X-ASC-Private-Key: -----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQg...
-----END PRIVATE KEY-----"
If sending the private key in JSON or a tool that escapes newlines, you can use \n instead of actual line breaks. The API normalizes both formats.
Endpoint Summary
Typical Workflow
1. Find your app
GET /v1/connect/apps?bundleId=app.taperecord
→ Returns app ID (e.g. 6759740679)
GET /v1/connect/apps/6759740679/versions
→ Returns version IDs (e.g. c2db5998-ac17-47b5-a61a-3658540592f8)
GET /v1/connect/versions/c2db5998.../localizations
→ Returns localization IDs with description, keywords, whatsNew, etc.
PATCH /v1/connect/localizations/e3c96adf...
Body: { "attributes": { "keywords": "record, voice, audio, tape" } }
GET /v1/connect/apps/6759740679/app-infos
GET /v1/connect/app-infos/:appInfoId/localizations
PATCH /v1/connect/app-info-localizations/:localizationId
Body: { "attributes": { "subtitle": "Audio recording & a retro VHS" } }
4. Get analytics
GET /v1/connect/apps/6759740679/analytics/report-requests
→ Create one if empty: POST /v1/connect/apps/6759740679/analytics/report-requests
GET /v1/connect/analytics/report-requests/:id/reports
→ Pick a report (e.g. App Downloads Standard)
GET /v1/connect/analytics/reports/:reportId/instances
GET /v1/connect/analytics/report-instances/:instanceId/segments
→ Each segment has a URL to download the data (gzip TSV)
Error Codes
| Status | Code | When |
|---|
| 400 | ASC_CREDENTIALS_REQUIRED | Missing X-ASC-Issuer-Id, X-ASC-Key-Id, or X-ASC-Private-Key |
| 400 | INVALID_APP_ID | App ID missing or invalid |
| 401 | (from Apple) | Invalid or expired API key |
| 403 | (from Apple) | Key lacks required role |
| 404 | (from Apple) | Resource not found |
| 502 | ASC_API_ERROR | Apple API returned an error |
Role Requirements
| Action | Minimum Role |
|---|
| List apps, get app | App Manager |
| Versions (create, update) | App Manager |
| Metadata (localizations) | App Manager |
| Analytics reports | Admin, Finance, or Sales and Reports |
| Sales reports | Admin, Finance, or Sales and Reports (Team key required) |
Individual Apple Developer accounts cannot use Sales and Trends reports—only Team (Organization) keys.