> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appeeky.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Release Management

> Screenshots, builds, App Review details, review submission, and phased release — ship a version end-to-end

Manage the full App Store release pipeline: upload screenshots, attach a build, fill in App Review contact details, submit for review, and control the phased rollout — all without opening App Store Connect.

<Note>
  All endpoints require [App Store Connect authentication](/docs/app-store-connect-overview#authentication) (your own ASC API key via headers, or a connected account). Destructive operations require `"confirm": true` in the request body.
</Note>

***

## Screenshots

Screenshots live in **screenshot sets**, one set per device display type per locale.

### Supported Display Types

| Display Type            | Devices                   | Accepted Sizes (portrait)       |
| ----------------------- | ------------------------- | ------------------------------- |
| `APP_IPHONE_67`         | iPhone 16/15/14 Pro Max   | 1320x2868, 1290x2796, 1260x2736 |
| `APP_IPHONE_65`         | iPhone 11 Pro Max, XS Max | 1284x2778, 1242x2688            |
| `APP_IPHONE_61`         | iPhone 16/15 Pro, 14, 13  | 1206x2622, 1179x2556            |
| `APP_IPAD_PRO_3GEN_129` | iPad Pro 12.9" / 13"      | 2064x2752, 2048x2732            |
| `APP_IPAD_PRO_3GEN_11`  | iPad Pro 11"              | 1668x2388, 1640x2360            |

Landscape variants (width/height swapped) are also accepted. Dimensions are validated **before** upload so you get a clear error instead of a stuck asset.

### List Screenshot Sets

```
GET /v1/connect/localizations/:localizationId/screenshot-sets?displayType=APP_IPHONE_67
```

Use the localization ID from [List Localizations](/docs/app-store-connect-metadata#list-localizations). `displayType` is optional.

### Create Screenshot Set

```
POST /v1/connect/localizations/:localizationId/screenshot-sets
Body: { "displayType": "APP_IPHONE_67" }
```

### List Screenshots in a Set

```
GET /v1/connect/screenshot-sets/:screenshotSetId/screenshots
```

### Upload Screenshot

```
POST /v1/connect/screenshot-sets/:screenshotSetId/screenshots
```

Two ways to provide the image:

1. **Multipart upload** — send the file in a `screenshot` form field (PNG, JPEG, or WebP; max 10 MB)
2. **Public URL** — JSON body `{ "imageUrl": "https://...", "fileName": "01-hero.png" }` (HTTPS only, max 20 MB)

The image is normalized to opaque PNG (alpha removed) and its dimensions validated against the set's display type. Appeeky then performs Apple's full 3-step upload for you: asset reservation, chunked byte upload, and MD5-verified commit.

```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
# Upload from a public URL
curl -X POST "https://api.appeeky.com/v1/connect/screenshot-sets/SET_ID/screenshots" \
  -H "X-API-Key: YOUR_APEEKY_KEY" \
  -H "X-ASC-Issuer-Id: YOUR_ISSUER_ID" \
  -H "X-ASC-Key-Id: YOUR_KEY_ID" \
  -H "X-ASC-Private-Key: YOUR_PRIVATE_KEY" \
  -H "Content-Type: application/json" \
  -d '{"imageUrl": "https://cdn.example.com/shots/de-01.png", "fileName": "de-01.png"}'
```

### Reorder Screenshots

```
PATCH /v1/connect/screenshot-sets/:screenshotSetId/screenshots/order
Body: { "screenshotIds": ["id-1", "id-2", "id-3"] }
```

### Delete Screenshot

```
DELETE /v1/connect/screenshots/:screenshotId
Body: { "confirm": true }
```

***

## Builds

### List Builds

```
GET /v1/connect/apps/:appId/builds
```

| Query Param         | Description                                |
| ------------------- | ------------------------------------------ |
| `limit`             | Max results (default 50, max 200)          |
| `version`           | Filter by build number                     |
| `preReleaseVersion` | Filter by marketing version (e.g. `1.4.0`) |
| `processingState`   | `PROCESSING`, `FAILED`, `INVALID`, `VALID` |
| `expired`           | `true` / `false`                           |
| `cursor`            | Pagination cursor                          |

### Get Build / Version Build

```
GET /v1/connect/builds/:buildId
GET /v1/connect/versions/:versionId/build
```

### Attach Build to Version

```
PATCH /v1/connect/versions/:versionId/build
Body: { "buildId": "BUILD_ID" }
```

### Detach Build

```
DELETE /v1/connect/versions/:versionId/build
Body: { "confirm": true }
```

***

## App Review Details

Contact info, demo account, and notes shown to Apple's review team.

```
GET   /v1/connect/versions/:versionId/review-detail
POST  /v1/connect/versions/:versionId/review-detail
PATCH /v1/connect/review-details/:reviewDetailId
```

### Attributes

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "attributes": {
    "contactFirstName": "Eren",
    "contactLastName": "Arica",
    "contactPhone": "+1 555 000 0000",
    "contactEmail": "review@example.com",
    "demoAccountRequired": true,
    "demoAccountName": "demo@example.com",
    "demoAccountPassword": "secret",
    "notes": "Tap the tape icon to start recording."
  }
}
```

If `demoAccountRequired` is `true`, `demoAccountName` and `demoAccountPassword` are validated as required.

***

## Review Submission

Uses Apple's current **reviewSubmissions** flow (the legacy `appStoreVersionSubmissions` resource was removed by Apple).

### Get Open Submissions

```
GET /v1/connect/versions/:versionId/submission
```

Returns the app's open review submissions (`READY_FOR_REVIEW`, `WAITING_FOR_REVIEW`, `IN_REVIEW`, `UNRESOLVED_ISSUES`) with their items.

### Submit for Review

```
POST /v1/connect/versions/:versionId/submission
Body: { "confirm": true }
```

Behind the scenes this: verifies the version is `PREPARE_FOR_SUBMISSION` or `DEVELOPER_REJECTED`, reuses or creates a review submission, adds the version as a submission item, and marks the submission as submitted. Returns `409 ASC_SUBMISSION_ALREADY_IN_REVIEW` if another submission is already in flight.

### Cancel Submission

```
DELETE /v1/connect/submissions/:submissionId
Body: { "confirm": true }
```

Cancels a submitted review submission (sets `canceled: true` on Apple's side).

***

## Phased Release

Gradual rollout to users with automatic updates enabled over 7 days (1% → 2% → 5% → 10% → 20% → 50% → 100%).

```
GET    /v1/connect/versions/:versionId/phased-release
POST   /v1/connect/versions/:versionId/phased-release
PATCH  /v1/connect/phased-releases/:phasedReleaseId
DELETE /v1/connect/phased-releases/:phasedReleaseId
```

### Update State

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{ "state": "PAUSED" }
```

| State      | Effect                                                       |
| ---------- | ------------------------------------------------------------ |
| `ACTIVE`   | Resume rollout                                               |
| `PAUSED`   | Pause rollout (max 30 days total)                            |
| `COMPLETE` | Release to 100% immediately — **requires** `"confirm": true` |
| `INACTIVE` | Only valid before release                                    |

Delete requires `"confirm": true` and only works before the rollout begins.

***

## Typical Release Workflow

```
1. GET  /connect/apps/:appId/builds?processingState=VALID     → pick latest build
2. PATCH /connect/versions/:versionId/build                    → attach build
3. POST /connect/localizations/:locId/screenshot-sets          → per locale + device
4. POST /connect/screenshot-sets/:setId/screenshots            → upload images
5. POST /connect/versions/:versionId/review-detail             → review contact info
6. POST /connect/versions/:versionId/phased-release            → optional staged rollout
7. POST /connect/versions/:versionId/submission {confirm:true} → submit to Apple
```

## Role Requirements

| Action                              | Minimum Role |
| ----------------------------------- | ------------ |
| Screenshots, builds, review details | App Manager  |
| Submit / cancel review submission   | App Manager  |
| Phased release                      | App Manager  |
