◉RORK LABJP
●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SONNET 4.5 — Retires on the Claude API on 11/30, 27 days left. If your app calls it, check the migration target●SDK 58 — Moves to React Native 0.88. R8 is now on by default in Android release builds, and iOS prebuild generates a SceneDelegate●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SONNET 4.5 — Retires on the Claude API on 11/30, 27 days left. If your app calls it, check the migration target●SDK 58 — Moves to React Native 0.88. R8 is now on by default in Android release builds, and iOS prebuild generates a SceneDelegate●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…
Articles/Business
⟐ Business/2026-06-15Advanced

Managing Store Metadata as Code with the App Store Connect API — Turning Manual Edits into a Monthly System

As the apps you ship with Rork pile up, the time spent hand-editing store descriptions and prices stops being negligible. This walks through managing metadata as code with the App Store Connect API and rolling it out across a dozen apps, including the authentication pitfalls.

App Store Connect17API7Operations7Automation8App Business

✦ Premium Article

Back when I was running about ten apps in parallel, I once burned half a day adding a seasonal campaign line to every app's description. Open App Store Connect, pick the app, switch between each language tab, add a sentence at a fixed spot in the description, save. Repeat for every language, for every app. It is not just tedious; a missed paste or a typo always slips in somewhere.

Once a generative tool like Rork lets you mass-produce apps, this "post-launch operation" becomes the bottleneck. Building got fast, but growing them stayed manual. Here I share a design that manages store metadata as code with the App Store Connect API, turning manual edits into a monthly system.

The boundary where manual edits break down

For two or three apps, by hand is fine. The problem is that as the count grows, the work scales as the product of app count and language count. Run five apps in two languages and one wording change means ten edits.

In my experience, past five apps the manual route stops being worth it. And not only on time. Manual work breeds mistakes, and mistakes become review rejections or broken layouts that steal even more time in the end. So systematizing this is less an efficiency play than an investment in accident prevention.

The first wall of the App Store Connect API is authentication

Almost everyone trips on auth first. The App Store Connect API authenticates with a JWT (JSON Web Token), and the way you build that JWT has fine rules; miss one and you get a 401 with no clue why.

Three points to nail. The token expiry is at most 20 minutes, and a longer value is rejected instantly. The aud (audience) is fixed to appstoreconnect-v1. And swap the issuer ID and key ID and it will not pass.

import jwt from "jsonwebtoken";
import fs from "node:fs";
 
// Issue the .p8 private key under "Users and Access > Keys" in App Store Connect
const privateKey = fs.readFileSync(process.env.ASC_KEY_PATH, "utf8");
 
export function makeToken() {
  const now = Math.floor(Date.now() / 1000);
  return jwt.sign(
    {
      iss: process.env.ASC_ISSUER_ID,   // Issuer ID (the team-wide UUID)
      iat: now,
      exp: now + 19 * 60,               // 19 minutes, margin under the 20-min cap
      aud: "appstoreconnect-v1",
    },
    privateKey,
    {
      algorithm: "ES256",              // Not RS256. Must be ES256
      header: { kid: process.env.ASC_KEY_ID, typ: "JWT" },
    }
  );
}

I set exp to 19 minutes to avoid the accident of crossing 20 minutes in the slim gap between generation and the request landing. I myself set it to exactly 20 and spent half a day on intermittent 401s that appeared only on slow-network days. Forgetting to set the algorithm to ES256 is another classic pitfall. The .p8 key is an elliptic-curve key, so specifying RS256 fails at the signing stage.

✦

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
✦The expiry and scope pitfalls of App Store Connect API JWT auth that trip nearly everyone, with the code that avoids them
✦A minimal-script design that holds descriptions, keywords, and prices in one JSON source and pushes only the diff to a dozen apps
✦Criteria for staged rollout and pre-production verification so a bulk push does not break every app at once
Secure payment via Stripe · Cancel anytime
✦

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

Related Articles

⟐ Business2026-10-28
If You Want to Rename an App After Release, Sort What the Store Keeps From What You Redo. Before Choosing a Name, Look at a Trademark Search
Being able to save a name in App Store Connect is not the same as being allowed to use it. Here is what Apple and Google Play documentation actually says about renaming after release, a small script that finds the old name left inside your project, and the order I check things before settling on a name.
⟐ Business2026-10-25
It Looks Opaque, but App Store Connect Says the Icon Has an Alpha Channel — Checking the PNG Before You Upload
ITMS-90717 (Invalid large app icon) can fire on an icon that shows no transparency at all, because an alpha channel is enough. I built six sample PNGs to tell the cases apart, and share a stdlib-only checker and a flatten step.
⟐ Business2026-10-08
Before You Build a Client's App in Rork, Decide Who Owns the Store Account
When you hand a Rork-built app to someone else, the first decision is which developer account publishes it. A walk through Apple's and Google's official transfer rules: what must be true before a transfer, what carries over, what disappears, plus a small script that lists the settings in your project tied to your own name.