How to List Owned Purchases Using IPATool: CLI and Go Guide
IPATool stores Apple App Store credentials in a local keychain and exposes a list-purchases command that queries private DAAP endpoints to retrieve paginated lists of apps owned by the authenticated account.
The majd/ipatool repository provides a command-line interface for interacting with the Apple App Store. After authenticating with ipatool auth login, you can list owned purchases using IPATool to view all apps associated with your Apple ID. This functionality abstracts the complex DAAP protocol and SAP signing process behind a simple interface.
Understanding the list-purchases Implementation
Command Layer in cmd/purchases.go
According to the source code in cmd/purchases.go, the list-purchases command implements a five-step workflow. First, it validates flags to ensure the requested page number and maximum results per page fall within the allowed range (≥ 1 and ≤ appstore.MaxOwnedAppsLimit of 100).
The command then calls AppStore.AccountInfo() to retrieve the current Apple ID, password token, and other required authentication fields. If the stored password token has expired, the implementation automatically re-authenticates using the stored email and password before proceeding.
Core Logic in appstore_owned_apps.go
The actual data retrieval occurs in pkg/appstore/appstore_owned_apps.go through the AppStore.OwnedApps() method. This function communicates with private "purchase" DAAP endpoints, signs requests using a SAP action signer, parses the DMAP response, and returns a paginated slice of App objects sorted by purchase date. Each App object contains the ID, bundle ID, name, version, and purchase date.
How to List Owned Purchases Using the IPATool CLI
Before retrieving your purchase history, authenticate once per machine:
ipatool auth login
Execute the list-purchases command with optional pagination controls:
# Default: first page with 10 results per page
ipatool list-purchases
# Request a specific page with custom page size (max 100)
ipatool list-purchases --page 2 --max-results 20
# Output structured JSON for scripting
ipatool list-purchases --format json
The CLI validates that your --max-results value does not exceed 100 and logs the total count, page information, and app details (ID, bundle ID, name, version, purchase date) through the built-in logger.
Programmatic Usage in Go
You can also list owned purchases using IPATool as a Go library. Import the appstore package and use the OwnedAppsInput struct to configure pagination:
import (
"github.com/majd/ipatool/v2/pkg/appstore"
)
func example() error {
// Assume you have a configured *appstore.AppStore instance
client := /* obtain client */
// Retrieve account info (may trigger automatic re-authentication)
info, err := client.AccountInfo()
if err != nil {
return err
}
// List owned apps with pagination parameters
out, err := client.OwnedApps(appstore.OwnedAppsInput{
Account: info.Account,
Page: 1,
Limit: 10,
})
if err != nil {
return err
}
for _, app := range out.Results {
fmt.Printf("%d – %s (%s) purchased on %s\n",
app.ID, app.Name, app.BundleID, app.PurchaseDate.Format(time.RFC3339))
}
return nil
}
Summary
- IPATool stores Apple App Store credentials locally in the system keychain and handles the DAAP protocol complexity internally
- The
list-purchasescommand validates pagination parameters againstappstore.MaxOwnedAppsLimit(100) before querying - Source files
cmd/purchases.goandpkg/appstore/appstore_owned_apps.gohandle the CLI interface and core retrieval logic respectively - Automatic token refresh occurs when stored credentials expire during the
AccountInfo()retrieval phase - Both CLI and Go API return structured data including app ID, bundle ID, name, version, and purchase date sorted chronologically
Frequently Asked Questions
What authentication is required before listing owned purchases?
You must run ipatool auth login at least once to store your Apple ID credentials in the local keychain. When you subsequently run list-purchases, the command retrieves these credentials automatically via AppStore.AccountInfo() and handles token refresh if the password token has expired.
What is the maximum number of owned apps I can retrieve per request?
According to the source code constant appstore.MaxOwnedAppsLimit, the maximum is 100 results per page. The CLI in cmd/purchases.go validates that your --max-results flag falls between 1 and 100 before executing the query.
How does IPATool communicate with Apple's servers to fetch purchase history?
The tool uses the AppStore.OwnedApps() method which communicates with private "purchase" DAAP endpoints. It signs requests using a SAP action signer, parses DMAP responses, and returns sorted App objects containing metadata like bundle ID and purchase date.
Can I use IPATool as a library in my own Go applications?
Yes. Import github.com/majd/ipatool/v2/pkg/appstore and create an OwnedAppsInput struct with your account details, page number, and limit. Call client.OwnedApps() to receive paginated results without manually managing the DAAP protocol or SAP request signing.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →