Skip to main content
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:
HeaderRequiredDescription
X-ASC-Issuer-IdYesYour Issuer ID (UUID from Users and Access > Keys)
X-ASC-Key-IdYesYour Key ID (e.g. Y38QBZP2W9)
X-ASC-Private-KeyYes*Your private key (PEM format, including -----BEGIN PRIVATE KEY----- and -----END PRIVATE KEY-----)
X-ASC-Private-Key-B64Yes*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

  1. Go to App Store ConnectUsers and AccessKeys
  2. Create a new key with the required roles (e.g. Admin for full access, App Manager for app/version management)
  3. Download the .p8 file once — you cannot download it again
  4. 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)

2. Get versions and metadata

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.

3. Update metadata (description, keywords)

PATCH /v1/connect/localizations/e3c96adf...
Body: { "attributes": { "keywords": "record, voice, audio, tape" } }

3b. Update App Information subtitle/name

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

StatusCodeWhen
400ASC_CREDENTIALS_REQUIREDMissing X-ASC-Issuer-Id, X-ASC-Key-Id, or X-ASC-Private-Key
400INVALID_APP_IDApp 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
502ASC_API_ERRORApple API returned an error

Role Requirements

ActionMinimum Role
List apps, get appApp Manager
Versions (create, update)App Manager
Metadata (localizations)App Manager
Analytics reportsAdmin, Finance, or Sales and Reports
Sales reportsAdmin, Finance, or Sales and Reports (Team key required)
Individual Apple Developer accounts cannot use Sales and Trends reports—only Team (Organization) keys.