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

# Monetization & Pricing

> In-app purchases, subscriptions, price schedules, and territory availability

Create and manage in-app purchases, auto-renewable subscriptions, app pricing, and territory availability.

<Note>
  All endpoints require [App Store Connect authentication](/docs/app-store-connect-overview#authentication). Price-schedule replacements are destructive and require an explicit confirmation flag.
</Note>

***

## In-App Purchases (v2)

### List / Get / Create / Update

```
GET   /v1/connect/apps/:appId/iaps?type=CONSUMABLE&state=...
POST  /v1/connect/apps/:appId/iaps
GET   /v1/connect/iaps/:iapId
PATCH /v1/connect/iaps/:iapId
```

### Create Body

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "name": "500 Coins",
  "productId": "com.example.coins500",
  "inAppPurchaseType": "CONSUMABLE",
  "reviewNote": "Grants 500 coins",
  "familySharable": false
}
```

`inAppPurchaseType` is one of `CONSUMABLE`, `NON_CONSUMABLE`, `NON_RENEWING_SUBSCRIPTION`. Territory availability is managed separately via [App Availability](#app--territory-availability) — Apple no longer accepts an `availableInAllTerritories` attribute.

### IAP Localizations

```
GET   /v1/connect/iaps/:iapId/localizations
POST  /v1/connect/iaps/:iapId/localizations
Body: { "locale": "de-DE", "name": "500 Münzen", "description": "..." }
PATCH /v1/connect/iap-localizations/:localizationId
```

### IAP Pricing

```
GET  /v1/connect/iaps/:iapId/price-points?territory=USA
GET  /v1/connect/iaps/:iapId/price-schedule
POST /v1/connect/iaps/:iapId/price-schedule
```

Replacing a price schedule **overwrites all manual prices**, so it requires `confirmReplaceAll: true`:

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "baseTerritory": "USA",
  "confirmReplaceAll": true,
  "prices": [
    { "territory": "USA", "pricePointId": "eyJzIjoi..." }
  ]
}
```

The base-territory price without a `startDate` is the current price. Get `pricePointId` values from the price-points endpoint.

***

## Subscriptions

### Groups

```
GET  /v1/connect/apps/:appId/subscription-groups
POST /v1/connect/apps/:appId/subscription-groups
Body: { "referenceName": "Premium" }
```

### Subscriptions in a Group

```
GET   /v1/connect/subscription-groups/:groupId/subscriptions
POST  /v1/connect/subscription-groups/:groupId/subscriptions
GET   /v1/connect/subscriptions/:subscriptionId
PATCH /v1/connect/subscriptions/:subscriptionId
```

### Create Body

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "name": "Premium Monthly",
  "productId": "com.example.premium.monthly",
  "subscriptionPeriod": "ONE_MONTH",
  "groupLevel": 1,
  "familySharable": false,
  "reviewNote": "Unlocks all tape styles"
}
```

`subscriptionPeriod`: `ONE_WEEK`, `ONE_MONTH`, `TWO_MONTHS`, `THREE_MONTHS`, `SIX_MONTHS`, `ONE_YEAR`.

### Subscription Localizations

```
GET   /v1/connect/subscriptions/:subscriptionId/localizations
POST  /v1/connect/subscriptions/:subscriptionId/localizations
PATCH /v1/connect/subscription-localizations/:localizationId
```

### Subscription Pricing

```
GET  /v1/connect/subscriptions/:subscriptionId/price-points?territory=USA
POST /v1/connect/subscriptions/:subscriptionId/prices
```

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "territory": "USA",
  "pricePointId": "eyJzIjoi...",
  "startDate": "2026-08-01",
  "preserveCurrentPrice": true,
  "confirm": true
}
```

`preserveCurrentPrice: true` keeps the old price for existing subscribers (grandfathering). Omit `startDate` to change the price as soon as possible.

***

## App & Territory Availability

### Get Availability

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

Returns `availableInNewTerritories` plus the first 50 territory availabilities (Apple's include cap).

### Update Defaults

```
PATCH /v1/connect/availabilities/:availabilityId
Body: { "availableInNewTerritories": true, "confirm": true }
```

<Note>
  Apple's v2 availability resource has no direct PATCH — Appeeky reads your current per-territory configuration and POSTs a full replacement that preserves it, changing only `availableInNewTerritories`. The availability ID equals the app ID.
</Note>

### Toggle One Territory

```
PATCH /v1/connect/territory-availabilities/:territoryAvailabilityId
Body: { "available": false, "confirm": true }
```

Territory availability IDs come from the Get Availability response.

***

## App Pricing

```
GET  /v1/connect/apps/:appId/price-points?territory=USA
GET  /v1/connect/apps/:appId/price-schedule
POST /v1/connect/apps/:appId/price-schedule
```

Replacing the app price schedule uses the same body shape as IAP price schedules (`baseTerritory`, `prices`, `confirmReplaceAll: true`).

```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
# Find the price point for $2.99 in the US
curl -X GET "https://api.appeeky.com/v1/connect/apps/6759740679/price-points?territory=USA" \
  -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"
```

***

## Role Requirements

| Action                           | Minimum Role |
| -------------------------------- | ------------ |
| IAPs, subscriptions (read/write) | App Manager  |
| Price schedules                  | App Manager  |
| Availability                     | App Manager  |

<Tip>
  For revenue **analytics** (MRR, churn, ARPU), see [Subscription Metrics](/docs/app-store-connect-subscription-metrics) — synced daily from your connected account with no extra credentials per call.
</Tip>
