2025-10-05 23:16:54 +00:00
# App Store Connect Service (ASConnectService)
2026-03-26 01:07:23 +00:00
A Swift client library for the App Store Connect API, generated from the official OpenAPI specification.
## Overview
2026-10-25 17:44:37 +01:00
`ASConnectService` exposes every endpoint of Apple's App Store Connect API as a Swift method with typed requests and responses. It's generated from the official OpenAPI specification with [Swift OpenAPI Generator ](https://github.com/apple/swift-openapi-generator ).
2026-03-26 01:07:23 +00:00
## Installation
Add `ASConnectService` as a dependency in your `Package.swift` file:
```swift
dependencies : [
. package ( url : "https://github.com/rock-n-code/asconnect-service.git" , from : "1.0.0" )
]
```
Then add it to your target dependencies:
```swift
. target (
name : "YourTarget" ,
dependencies : [
"ASConnectService"
]
)
```
## Usage
### Creating a Client
2026-10-25 17:44:37 +01:00
Create a `Client` with a server URL, a transport, and a `BearerAuthMiddleware` that authenticates each request with a JSON Web Token (JWT). To get a token, create an API key in App Store Connect and sign a JWT with its key ID, issuer ID, and private key:
2026-03-26 01:07:23 +00:00
```swift
import ASConnectService
import OpenAPIURLSession
let client = Client (
2026-10-25 17:05:15 +01:00
serverURL : try Servers . Server1 . url (),
2026-03-26 01:07:23 +00:00
transport : URLSessionTransport (),
middlewares : [
BearerAuthMiddleware ( token : yourJWTToken )
]
)
```
2026-10-25 18:11:51 +01:00
Tokens expire after 20 minutes at most. For longer-lived clients, use `APIKeyTokenProvider` , which signs new ones with your API key as needed:
2026-10-25 17:04:01 +01:00
```swift
2026-10-25 18:11:51 +01:00
let tokenProvider = try APIKeyTokenProvider (
issuerID : yourIssuerID ,
keyID : yourKeyID ,
privateKey : yourP8FileContents
)
2026-10-25 17:04:01 +01:00
BearerAuthMiddleware {
2026-10-25 18:11:51 +01:00
try await tokenProvider . token ()
2026-10-25 17:04:01 +01:00
}
```
2026-03-26 01:07:23 +00:00
### Making API Calls
2026-10-25 17:18:52 +01:00
Each endpoint is a method on `Client` , declared by `APIProtocol` . It returns an `Output` enum with a case for each documented response:
2026-03-26 01:07:23 +00:00
```swift
2026-10-25 17:18:52 +01:00
let response = try await client . appsGetCollection ( query : . init ( limit : 10 ))
let apps = try response . ok . body . json . data
2026-03-26 01:07:23 +00:00
```
2026-10-25 17:18:52 +01:00
The `ok` property throws for any other response. To handle those, switch over the `Output` cases, such as `.unauthorized` or `.undocumented(statusCode:_:)` .
2026-10-25 17:37:05 +01:00
### Fetching More Pages
Lists are paged. Pass a page's `links.nextCursor` as the `cursor` of the next request:
```swift
var apps : [ Components . Schemas . App ] = []
var cursor : String ?
repeat {
let page = try await client . appsGetCollection ( query : . init ( limit : 200 , cursor : cursor )). ok . body . json
apps += page . data
cursor = page . links . nextCursor
} while cursor != nil
```
2026-10-25 18:14:19 +01:00
### Handling Rate Limits
Add `RateLimitMiddleware` before the authentication middleware to retry `429 Too Many Requests` responses:
```swift
middlewares : [
RateLimitMiddleware (),
BearerAuthMiddleware { try await tokenProvider . token () }
]
```
2026-03-26 01:07:23 +00:00
## Supported Platforms
2026-10-25 18:11:51 +01:00
- iOS 14.0+
- macOS 11.0+
- tvOS 14.0+
2026-03-26 01:07:23 +00:00
- visionOS 1.0+
2026-10-25 18:11:51 +01:00
- watchOS 7.0+
2026-03-26 01:07:23 +00:00
## Development
### Building
```bash
make lib-build
```
### Testing
```bash
make lib-test
```
### Generating Documentation
```bash
# Generate documentation archive (for Xcode)
make doc-generate-archive
# Generate documentation for static hosting (e.g. GitHub Pages)
make doc-generate-github
# Preview documentation locally in Safari
make doc-preview
```
2026-10-25 17:44:37 +01:00
### Updating the API
The generated code is committed in `Sources/ASConnectService/Sources/Public/Generated` , so consumers don't run the generator.
```bash
# Update to the latest specification
make oas-download
# Regenerate the code only
make oas-generate
```
2026-03-26 01:07:23 +00:00
## Dependencies
- [swift-openapi-runtime ](https://github.com/apple/swift-openapi-runtime )
- [swift-openapi-urlsession ](https://github.com/apple/swift-openapi-urlsession )
2026-10-25 17:44:37 +01:00
Development only:
- [swift-openapi-generator ](https://github.com/apple/swift-openapi-generator ), in `Tools`
2026-03-26 01:07:23 +00:00
- [swift-docc-plugin ](https://github.com/swiftlang/swift-docc-plugin )
## License
Licensed under the Apache License, Version 2.0. See [LICENSE ](LICENSE ) for details.
## Contributing
See [CONTRIBUTORS ](CONTRIBUTORS ) for the list of project authors.