Why updating an iOS listing requires patching both `appInfoLocalizations` and `appStoreVersionLocalizations`
Developers writing their first App Store Connect API script are often surprised to discover that `title` (`name`) and `subtitle` do not live on the same endpoint as `keywords` and `description`. Apple splits localized store metadata across two distinct REST resources ([`connect.ts`](file:///Users/tarik/Desktop/TengrX-SEO/packages/core/src/aso/connect.ts#L156-L216)):
| App Store Connect Resource | Endpoint Path | Attributes Patched | Scope in App Store Connect |
|---|---|---|---|
| App Info Localizations | PATCH /v1/appInfoLocalizations/{id} |
name (Title, 30 chars)subtitle (Subtitle, 30 chars) |
Attached to the editable `appInfos` record (`PREPARE_FOR_SUBMISSION` state). |
| App Store Version Localizations | PATCH /v1/appStoreVersionLocalizations/{id} |
keywords (100 UTF-8 bytes)promotionalText (170 chars)description (4,000 chars)whatsNew (4,000 chars) |
Attached to the specific iOS `appStoreVersions` record for that release. |
When you click Push to App Store Connect in Searchbop, the client resolves the matching locale (or creates the localization record if that language hasn’t been added to the version yet) and updates both resources in a single coordinated flow.
02 / VERSION STATE MACHINEHow Searchbop handles live, editable, and in-review versions
Apple only allows editing `name`, `subtitle`, `keywords`, and `description` when an app version sits in one of five editable states (`EDITABLE_STATES`):
PREPARE_FOR_SUBMISSIONDEVELOPER_REJECTEDREJECTEDMETADATA_REJECTEDINVALID_BINARY
What happens if your app’s only version is `1.2.0` in `READY_FOR_SALE` (live on the store)? Searchbop’s [`nextVersion()`](file:///Users/tarik/Desktop/TengrX-SEO/packages/core/src/aso/connect.ts#L79-L85) helper automatically computes `1.2.1`, sends `POST /v1/appStoreVersions` with `platform: "IOS"` and `versionString: "1.2.1"`, and writes your new metadata into that fresh `PREPARE_FOR_SUBMISSION` draft. Conversely, if you already have a newer version sitting in `WAITING_FOR_REVIEW` or `IN_REVIEW` (`blocking`), Searchbop warns you immediately and refuses to overwrite or corrupt your in-flight review.
03 / TEAM VS. INDIVIDUAL .P8 KEYSSupporting both Team API keys (`iss`) and Individual keys (`sub: "user"`)
Apple’s App Store Connect API uses 15-minute `ES256` JSON Web Tokens (`aud: "appstoreconnect-v1"`). While company developer accounts issue Team keys that include an Issuer ID (`iss`), solo indie developers on Individual Apple Developer accounts often generate Individual API keys that have no Issuer ID and require `sub: "user"` in the JWT payload instead:
export function connectToken(c: ConnectCredentials, now = Date.now()): string {
const seconds = Math.floor(now / 1000);
// Team keys include Issuer ID (iss); Individual keys omit iss and use sub: "user"
const claims = c.issuerId ? { iss: c.issuerId } : { sub: "user" };
const header = { alg: "ES256", kid: c.keyId, typ: "JWT" };
const payload = { ...claims, iat: seconds, exp: seconds + 900, aud: "appstoreconnect-v1" };
// Signed locally with your .p8 private key using SHA256 + ieee-p1363 DSA encoding
}
How `draftListing()` turns your chosen keywords into compliant copy
When your connected AI model drafts a listing ([`listing.ts`](file:///Users/tarik/Desktop/TengrX-SEO/packages/core/src/aso/listing.ts)), Searchbop passes your current App Store listing, your selected high-opportunity keywords (sorted by Popularity and Difficulty), and the storefront’s language. It instructs the model to treat all store text strictly as data (preventing prompt injection from scraped store descriptions), bans unverifiable `#1 / best / free` claims in Title and Subtitle, and trims the comma-separated `keywords` list to fit inside `100` UTF-8 bytes (`fitKeywords()`).
Honest boundaries: You always click Submit in App Store Connect
No automatic submission to Apple Review: Searchbop prepares the draft version and writes the text fields in App Store Connect, then gives you a direct deep link (`https://appstoreconnect.apple.com/apps/{appId}/distribution/ios/version/inflight`). Attaching an Xcode build (if required for a new version) and clicking Add for Review always remains in your hands.
Research context & search queries covered on this page Connect API Workflow · P1
Cluster & intent: app-store-connect-api (Commercial / Technical · P1) · Target queries: app store connect api metadata, prepare for submission app store connect api, ai app store optimization tool, app store listing generator, byok aso tool.