Overhauled the library with several new features (#5)

## Summary

Updates the library to v4.5.1 of the App Store Connect API, and ships it as a breaking 2.0.0 release with pagination, API key authentication, rate limiting, and a lighter install for consumers.

## Breaking changes

- **Minimum platforms:** iOS 14, macOS 11, tvOS 14, watchOS 7, and visionOS 1.
- **Toolchain:** Swift 6.0+ (Xcode 16+). The package builds in the Swift 6 language mode.
- **Runtime:** requires `swift-openapi-runtime` 1.11.0 or later.

## Changes

- **API:** updated the OpenAPI specification to v4.5.1, covering 1,303 operations and 1,473 schemas.
- **Pagination:** the spec patch adds the undocumented `cursor` query parameter to the 465 paged operations. `PagedDocumentLinks.nextCursor` reads the cursor from a page, and `PagedSequence` iterates every page.
- **Authentication:** `APIKeyTokenProvider` signs ES256 tokens from an API key and reuses each one until a minute before it expires. `BearerAuthMiddleware` now accepts a token provider.
- **Rate limiting:** `RateLimitMiddleware` retries `429` responses, waiting for `Retry-After` or backing off exponentially.
- **Generated code:** committed to `Sources/ASConnectService/Sources/Public/Generated` instead of generated by a build plugin. Consumers now resolve 4 packages instead of 12, and Xcode no longer asks to trust a plugin.
- **Tooling:**
  - `make oas-download` now downloads, patches, generates, and checks the docs in one go.
  - New `make oas-generate`, `make oas-validate`, and `make doc-check` targets.
  - The generator is pinned in `Tools/`, and the DocC plugin is only resolved by the documentation targets.
- **Documentation:** the DocC catalog now lists every operation and schema in the spec, and the catalog and README are rewritten for the new APIs.
- **Housekeeping:** Apache 2.0 license headers on every Swift file, including `Package.swift` and the tests.

Reviewed-on: #5
Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
This commit was merged in pull request #5.
This commit is contained in:
javier authored and Javier Cicchelli committed 2026-10-25 17:52:37 +00:00
1 parent 3aaf5cd7a5
commit 0431fb5133
27 files changed
+1046471 -284

No files matched your search

@@ -1,20 +1,28 @@
# ``APIProtocol``
A protocol defining the available operations for the App Store Connect API.
The operations of the App Store Connect API.
## Overview
The ``APIProtocol`` protocol declares the complete set of operations available through the App Store Connect API. Each method corresponds to an HTTP endpoint and follows a consistent naming pattern:
Each method calls one endpoint, and is named after its resource followed by its action:
- `<resource>GetCollection` — List resources (HTTP `GET` on a collection)
- `<resource>CreateInstance` — Create a resource (HTTP `POST`)
- `<resource>GetInstance` — Get a single resource by ID (HTTP `GET`)
- `<resource>UpdateInstance` — Update a resource (HTTP `PATCH`)
- `<resource>DeleteInstance` — Delete a resource (HTTP `DELETE`)
- `<resource>GetToManyRelated` — Fetch related resources
- `<resource>GetToOneRelated` — Fetch a related resource
| Suffix | HTTP method | Action |
| --- | --- | --- |
| `GetCollection` | `GET` | List resources |
| `GetInstance` | `GET` | Get a resource by ID |
| `CreateInstance` | `POST` | Create a resource |
| `UpdateInstance` | `PATCH` | Update a resource |
| `DeleteInstance` | `DELETE` | Delete a resource |
| `GetToOneRelated`, `GetToManyRelated` | `GET` | Get related resources |
| `GetToOneRelationship`, `GetToManyRelationship` | `GET` | Get the IDs of related resources |
| `CreateToManyRelationship` | `POST` | Add relationships |
| `UpdateToOneRelationship`, `ReplaceToManyRelationship` | `PATCH` | Replace relationships |
| `DeleteToManyRelationship` | `DELETE` | Remove relationships |
| `GetMetrics` | `GET` | Get metrics |
The ``Client`` type conforms to this protocol and provides the concrete implementation for making HTTP requests.
For example, ``appsGetCollection(_:)`` lists apps, and ``appsBuildsGetToManyRelated(_:)`` lists the builds of an app.
Every method also has an overload that takes the `path`, `query`, `headers`, and `body` of its `Input` as separate arguments. ``Client`` provides the implementation.
## Topics
@@ -106,6 +114,9 @@ The ``Client`` type conforms to this protocol and provides the concrete implemen
- ``appsSubscriptionGracePeriodGetToOneRelated(_:)``
- ``appsSubscriptionGroupsGetToManyRelated(_:)``
- ``appsWebhooksGetToManyRelated(_:)``
- ``appsAssetLibraryGetToOneRelationship(_:)``
- ``appsAssetLibraryGetToOneRelated(_:)``
- ``appsPerformanceOverviewsGetToManyRelated(_:)``
- ``appInfosGetInstance(_:)``
- ``appInfosUpdateInstance(_:)``
- ``appInfosAgeRatingDeclarationGetToOneRelated(_:)``
@@ -207,6 +218,8 @@ The ``Client`` type conforms to this protocol and provides the concrete implemen
- ``appStoreVersionLocalizationsSearchKeywordsCreateToManyRelationship(_:)``
- ``appStoreVersionLocalizationsSearchKeywordsDeleteToManyRelationship(_:)``
- ``appStoreVersionLocalizationsSearchKeywordsGetToManyRelated(_:)``
- ``appStoreVersionLocalizationsPlacementsGetToManyRelationship(_:)``
- ``appStoreVersionLocalizationsPlacementsGetToManyRelated(_:)``
- ``appStoreVersionPhasedReleasesCreateInstance(_:)``
- ``appStoreVersionPhasedReleasesUpdateInstance(_:)``
- ``appStoreVersionPhasedReleasesDeleteInstance(_:)``
@@ -241,6 +254,8 @@ The ``Client`` type conforms to this protocol and provides the concrete implemen
- ``appStoreVersionExperimentTreatmentLocalizationsAppScreenshotSetsGetToManyRelated(_:)``
- ``appStoreVersionExperimentTreatmentLocalizationsAppPreviewSetsGetToManyRelationship(_:)``
- ``appStoreVersionExperimentTreatmentLocalizationsAppScreenshotSetsGetToManyRelationship(_:)``
- ``appStoreVersionExperimentTreatmentLocalizationsPlacementsGetToManyRelationship(_:)``
- ``appStoreVersionExperimentTreatmentLocalizationsPlacementsGetToManyRelated(_:)``
### App Custom Product Pages
@@ -267,6 +282,8 @@ The ``Client`` type conforms to this protocol and provides the concrete implemen
- ``appCustomProductPageLocalizationsSearchKeywordsCreateToManyRelationship(_:)``
- ``appCustomProductPageLocalizationsSearchKeywordsDeleteToManyRelationship(_:)``
- ``appCustomProductPageLocalizationsSearchKeywordsGetToManyRelated(_:)``
- ``appCustomProductPageLocalizationsPlacementsGetToManyRelationship(_:)``
- ``appCustomProductPageLocalizationsPlacementsGetToManyRelated(_:)``
### App Clips
@@ -322,6 +339,8 @@ The ``Client`` type conforms to this protocol and provides the concrete implemen
- ``appEventLocalizationsAppEventVideoClipsGetToManyRelated(_:)``
- ``appEventLocalizationsAppEventScreenshotsGetToManyRelationship(_:)``
- ``appEventLocalizationsAppEventVideoClipsGetToManyRelationship(_:)``
- ``appEventLocalizationsPlacementsGetToManyRelationship(_:)``
- ``appEventLocalizationsPlacementsGetToManyRelated(_:)``
- ``appEventScreenshotsCreateInstance(_:)``
- ``appEventScreenshotsGetInstance(_:)``
- ``appEventScreenshotsUpdateInstance(_:)``
@@ -358,6 +377,32 @@ The ``Client`` type conforms to this protocol and provides the concrete implemen
- ``routingAppCoveragesUpdateInstance(_:)``
- ``routingAppCoveragesDeleteInstance(_:)``
### App Asset Library
- ``appAssetLibrariesGetInstance(_:)``
- ``appAssetLibrariesImagesGetToManyRelationship(_:)``
- ``appAssetLibrariesImagesGetToManyRelated(_:)``
- ``appAssetLibrariesVideosGetToManyRelationship(_:)``
- ``appAssetLibrariesVideosGetToManyRelated(_:)``
- ``appAssetLibraryImagesCreateInstance(_:)``
- ``appAssetLibraryImagesGetInstance(_:)``
- ``appAssetLibraryImagesUpdateInstance(_:)``
- ``appAssetLibraryImagesDeleteInstance(_:)``
- ``appAssetLibraryImagesPlacementsGetToManyRelationship(_:)``
- ``appAssetLibraryImagesPlacementsGetToManyRelated(_:)``
- ``appAssetLibraryVideosCreateInstance(_:)``
- ``appAssetLibraryVideosGetInstance(_:)``
- ``appAssetLibraryVideosUpdateInstance(_:)``
- ``appAssetLibraryVideosDeleteInstance(_:)``
- ``appAssetLibraryVideosPlacementsGetToManyRelationship(_:)``
- ``appAssetLibraryVideosPlacementsGetToManyRelated(_:)``
- ``appAssetLibraryPlacementsCreateInstance(_:)``
- ``appAssetLibraryPlacementsGetInstance(_:)``
- ``appAssetLibraryPlacementsDeleteInstance(_:)``
- ``appAssetLibraryPlacementOrderingRequestsCreateInstance(_:)``
- ``appAssetLibraryRefDataGetCollection(_:)``
- ``appAssetLibraryRefDataGetInstance(_:)``
### App Encryption
- ``appEncryptionDeclarationsGetCollection(_:)``
@@ -581,15 +626,33 @@ The ``Client`` type conforms to this protocol and provides the concrete implemen
- ``inAppPurchasesV2OfferCodesGetToManyRelationship(_:)``
- ``inAppPurchasesV2PricePointsGetToManyRelationship(_:)``
- ``inAppPurchasesV2PromotedPurchaseGetToOneRelationship(_:)``
- ``inAppPurchasesV2VersionsGetToManyRelationship(_:)``
- ``inAppPurchasesV2VersionsGetToManyRelated(_:)``
- ``inAppPurchaseVersionsCreateInstance(_:)``
- ``inAppPurchaseVersionsGetInstance(_:)``
- ``inAppPurchaseVersionsImageGetToOneRelationship(_:)``
- ``inAppPurchaseVersionsImageGetToOneRelated(_:)``
- ``inAppPurchaseVersionsImagesGetToManyRelationship(_:)``
- ``inAppPurchaseVersionsImagesGetToManyRelated(_:)``
- ``inAppPurchaseVersionsLocalizationsGetToManyRelationship(_:)``
- ``inAppPurchaseVersionsLocalizationsGetToManyRelated(_:)``
- ``inAppPurchaseLocalizationsCreateInstance(_:)``
- ``inAppPurchaseLocalizationsGetInstance(_:)``
- ``inAppPurchaseLocalizationsUpdateInstance(_:)``
- ``inAppPurchaseLocalizationsDeleteInstance(_:)``
- ``inAppPurchaseLocalizationsV2CreateInstance(_:)``
- ``inAppPurchaseLocalizationsV2GetInstance(_:)``
- ``inAppPurchaseLocalizationsV2UpdateInstance(_:)``
- ``inAppPurchaseLocalizationsV2DeleteInstance(_:)``
- ``inAppPurchaseContentsGetInstance(_:)``
- ``inAppPurchaseImagesCreateInstance(_:)``
- ``inAppPurchaseImagesGetInstance(_:)``
- ``inAppPurchaseImagesUpdateInstance(_:)``
- ``inAppPurchaseImagesDeleteInstance(_:)``
- ``inAppPurchaseImagesV2CreateInstance(_:)``
- ``inAppPurchaseImagesV2GetInstance(_:)``
- ``inAppPurchaseImagesV2UpdateInstance(_:)``
- ``inAppPurchaseImagesV2DeleteInstance(_:)``
- ``inAppPurchaseAppStoreReviewScreenshotsCreateInstance(_:)``
- ``inAppPurchaseAppStoreReviewScreenshotsGetInstance(_:)``
- ``inAppPurchaseAppStoreReviewScreenshotsUpdateInstance(_:)``
@@ -660,6 +723,18 @@ The ``Client`` type conforms to this protocol and provides the concrete implemen
- ``subscriptionsSubscriptionAvailabilityGetToOneRelated(_:)``
- ``subscriptionsSubscriptionLocalizationsGetToManyRelated(_:)``
- ``subscriptionsWinBackOffersGetToManyRelated(_:)``
- ``subscriptionsPlanAvailabilitiesGetToManyRelationship(_:)``
- ``subscriptionsPlanAvailabilitiesGetToManyRelated(_:)``
- ``subscriptionsVersionsGetToManyRelationship(_:)``
- ``subscriptionsVersionsGetToManyRelated(_:)``
- ``subscriptionVersionsCreateInstance(_:)``
- ``subscriptionVersionsGetInstance(_:)``
- ``subscriptionVersionsImageGetToOneRelationship(_:)``
- ``subscriptionVersionsImageGetToOneRelated(_:)``
- ``subscriptionVersionsImagesGetToManyRelationship(_:)``
- ``subscriptionVersionsImagesGetToManyRelated(_:)``
- ``subscriptionVersionsLocalizationsGetToManyRelationship(_:)``
- ``subscriptionVersionsLocalizationsGetToManyRelated(_:)``
- ``subscriptionGroupsCreateInstance(_:)``
- ``subscriptionGroupsGetInstance(_:)``
- ``subscriptionGroupsUpdateInstance(_:)``
@@ -668,19 +743,37 @@ The ``Client`` type conforms to this protocol and provides the concrete implemen
- ``subscriptionGroupsSubscriptionsGetToManyRelationship(_:)``
- ``subscriptionGroupsSubscriptionGroupLocalizationsGetToManyRelated(_:)``
- ``subscriptionGroupsSubscriptionsGetToManyRelated(_:)``
- ``subscriptionGroupsVersionsGetToManyRelationship(_:)``
- ``subscriptionGroupsVersionsGetToManyRelated(_:)``
- ``subscriptionGroupVersionsCreateInstance(_:)``
- ``subscriptionGroupVersionsGetInstance(_:)``
- ``subscriptionGroupVersionsLocalizationsGetToManyRelationship(_:)``
- ``subscriptionGroupVersionsLocalizationsGetToManyRelated(_:)``
- ``subscriptionGroupLocalizationsCreateInstance(_:)``
- ``subscriptionGroupLocalizationsGetInstance(_:)``
- ``subscriptionGroupLocalizationsUpdateInstance(_:)``
- ``subscriptionGroupLocalizationsDeleteInstance(_:)``
- ``subscriptionGroupLocalizationsV2CreateInstance(_:)``
- ``subscriptionGroupLocalizationsV2GetInstance(_:)``
- ``subscriptionGroupLocalizationsV2UpdateInstance(_:)``
- ``subscriptionGroupLocalizationsV2DeleteInstance(_:)``
- ``subscriptionGroupSubmissionsCreateInstance(_:)``
- ``subscriptionLocalizationsCreateInstance(_:)``
- ``subscriptionLocalizationsGetInstance(_:)``
- ``subscriptionLocalizationsUpdateInstance(_:)``
- ``subscriptionLocalizationsDeleteInstance(_:)``
- ``subscriptionLocalizationsV2CreateInstance(_:)``
- ``subscriptionLocalizationsV2GetInstance(_:)``
- ``subscriptionLocalizationsV2UpdateInstance(_:)``
- ``subscriptionLocalizationsV2DeleteInstance(_:)``
- ``subscriptionImagesCreateInstance(_:)``
- ``subscriptionImagesGetInstance(_:)``
- ``subscriptionImagesUpdateInstance(_:)``
- ``subscriptionImagesDeleteInstance(_:)``
- ``subscriptionImagesV2CreateInstance(_:)``
- ``subscriptionImagesV2GetInstance(_:)``
- ``subscriptionImagesV2UpdateInstance(_:)``
- ``subscriptionImagesV2DeleteInstance(_:)``
- ``subscriptionAppStoreReviewScreenshotsCreateInstance(_:)``
- ``subscriptionAppStoreReviewScreenshotsGetInstance(_:)``
- ``subscriptionAppStoreReviewScreenshotsUpdateInstance(_:)``
@@ -689,6 +782,12 @@ The ``Client`` type conforms to this protocol and provides the concrete implemen
- ``subscriptionAvailabilitiesGetInstance(_:)``
- ``subscriptionAvailabilitiesAvailableTerritoriesGetToManyRelated(_:)``
- ``subscriptionAvailabilitiesAvailableTerritoriesGetToManyRelationship(_:)``
- ``subscriptionPlanAvailabilitiesCreateInstance(_:)``
- ``subscriptionPlanAvailabilitiesGetInstance(_:)``
- ``subscriptionPlanAvailabilitiesUpdateInstance(_:)``
- ``subscriptionPlanAvailabilitiesAvailableTerritoriesGetToManyRelationship(_:)``
- ``subscriptionPlanAvailabilitiesAvailableTerritoriesReplaceToManyRelationship(_:)``
- ``subscriptionPlanAvailabilitiesAvailableTerritoriesGetToManyRelated(_:)``
- ``subscriptionGracePeriodsGetInstance(_:)``
- ``subscriptionGracePeriodsUpdateInstance(_:)``
- ``subscriptionIntroductoryOffersCreateInstance(_:)``
@@ -713,6 +812,7 @@ The ``Client`` type conforms to this protocol and provides the concrete implemen
- ``subscriptionPricePointsGetInstance(_:)``
- ``subscriptionPricePointsEqualizationsGetToManyRelated(_:)``
- ``subscriptionPricePointsEqualizationsGetToManyRelationship(_:)``
- ``subscriptionPricePointsAdjustedEqualizationsGetToManyRelated(_:)``
- ``subscriptionPricesCreateInstance(_:)``
- ``subscriptionPricesDeleteInstance(_:)``
- ``subscriptionPromotionalOffersCreateInstance(_:)``
@@ -773,6 +873,9 @@ The ``Client`` type conforms to this protocol and provides the concrete implemen
- ``gameCenterDetailsGameCenterLeaderboardsV2ReplaceToManyRelationship(_:)``
- ``gameCenterDetailsLeaderboardReleasesGetToManyRelationship(_:)``
- ``gameCenterDetailsLeaderboardSetReleasesGetToManyRelationship(_:)``
- ``gameCenterDetailsBlockedPlayersGetToManyRelationship(_:)``
- ``gameCenterDetailsBlockedPlayersGetToManyRelated(_:)``
- ``gameCenterDetailPlayersUpdateInstance(_:)``
- ``gameCenterGroupsGetCollection(_:)``
- ``gameCenterGroupsCreateInstance(_:)``
- ``gameCenterGroupsGetInstance(_:)``
@@ -871,6 +974,9 @@ The ``Client`` type conforms to this protocol and provides the concrete implemen
- ``gameCenterLeaderboardsV2ChallengeUpdateToOneRelationship(_:)``
- ``gameCenterLeaderboardsV2VersionsGetToManyRelationship(_:)``
- ``gameCenterLeaderboardsV2VersionsGetToManyRelated(_:)``
- ``gameCenterLeaderboardsV2GameCenterScoreModerationsGetToManyRelationship(_:)``
- ``gameCenterLeaderboardsV2GameCenterScoreModerationsGetToManyRelated(_:)``
- ``gameCenterScoreModerationsUpdateInstance(_:)``
- ``gameCenterLeaderboardVersionsV2CreateInstance(_:)``
- ``gameCenterLeaderboardVersionsV2GetInstance(_:)``
- ``gameCenterLeaderboardVersionsV2LocalizationsGetToManyRelated(_:)``