Two Hours Lost to a Silent 401: Submitting 12 iOS Apps to the App Store With No Human in the Loop (Part 1) A developer who rebuilt his income around an autonomous Claude Code environment reports monthly revenue surpassing ¥1.2M after being laid off. He details how an App Store Connect API key enables fully automated app submissions without human interaction, eliminating the 2FA bottleneck. The key technical challenge is correctly generating an ES256 JWT with raw r||s encoding, as Python's default DER encoding causes silent 401 errors. I went from earning about ¥100,000 a month as a university student to ¥600,000 by stacking side gigs — then got laid off and dropped straight back to zero. Six months later, after rebuilding everything around an autonomous Claude Code environment, monthly revenue is past ¥1.2M. The piece of that environment I want to open up here is the one that lets apps go into App Store review without a human ever logging into App Store Connect. When you try to ship iOS apps in volume, the bottleneck isn't development — it's submission. Open Xcode, click Archive, log into App Store Connect, wait for the 2FA SMS, pick a build, hit "Submit for Review." For a single app it's no big deal. Once you're managing five or ten at once, that sequence becomes pure recurring labor, every week. There's a more fundamental problem too: anything that depends on 2FA can't be handed to a bot . fastlane's deliver is convenient, but every time the session cookie expires, an interactive auth prompt fires. On CI, that's a dead end. An App Store Connect API key the .p8 file removes the problem at the root. Issue the key once and you can hit the API without two-factor authentication . There's no expiration either — it lives until you explicitly revoke it. Which means that in an environment where this key is present, Claude Code can autonomously run "submit for review" at 2 a.m. Right now I manage 12 apps. Some of them ship a new version on the same day. The hours a human can sit in front of a screen are finite, but the API can be hit in parallel . Once a loop like for app id in $ cat app ids.txt ; do python3 ~/.appstoreconnect/asc.py submit "$app id"; done is running, every app gets submitted while I'm drinking coffee. "Open Xcode every time" is a task. "Anyone or anything with the API key can submit" is an environment. Grinding through tasks caps your income at the number of hours you have. Build the environment and the system runs while you sleep. Most of the reason revenue is 12× what it was in my university days isn't that I increased my own workload — it's that I increased the number of things that work in my place . The ASC API key is one emblematic example. "With an API key, you just generate a JWT and call the API" is technically correct — but if the implementation is off by one step, you get 401 forever. Apple's ES256 JWT requires the raw r‖s encoding defined by RFC 7518 . Python's crypto library returns DER by default, so using it as-is guarantees a broken JWT. On first encounter, the cause is completely invisible, because the error comes back as "401 Unauthorized" rather than "Invalid signature." In the next section I'll get concrete about what this trap actually is, and about the code I'm really using. Start with the big picture. From binary generation to App Store review submission, my environment splits into three layers. ┌─────────────────────────────────────────────────────────┐ │ Layer 1: バイナリ生成 │ │ xcodebuild archive tools/archive.sh │ │ または eas build --local Expo系アプリ │ └──────────────────┬──────────────────────────────────────┘ │ .ipa ▼ ┌─────────────────────────────────────────────────────────┐ │ Layer 2: バイナリ転送 │ │ eas submit Transporter相当・クラウド枠消費ゼロ │ └──────────────────┬──────────────────────────────────────┘ │ processingState: VALID ▼ ┌─────────────────────────────────────────────────────────┐ │ Layer 3: 状態確認 / メタ編集 / 審査提出 │ │ python3 ~/.appstoreconnect/asc.py {apps|status|submit}│ │ 2FA不要・JWT認証・アカウント横断で使える │ └─────────────────────────────────────────────────────────┘ Layer 3 is the topic here. asc.py is only 272 lines, but it covers nearly every operation the review lifecycle needs. 全アプリ一覧 python3 ~/.appstoreconnect/asc.py apps 特定アプリの審査状態・ビルド状態を確認 python3 ~/.appstoreconnect/asc.py status