App Store Connect APIキー(.p8)の作成と使い方
著者:Mehdi Azizi
公開・10 分
App Store Connect APIキー(.p8)のダウンロードは一度だけです。ロール、Issuer ID、Key ID、無効化、Expo・fastlane・スクリプトでの使い方を解説します。
App Store Connect APIキーを使うと、EAS、fastlane、RevenueCat、自作スクリプトなどのツールが、パスワードも2ファクタ認証もなしにあなたのアカウントを操作できます。公開鍵はAppleが保管し、秘密鍵である.p8ファイルはあなたが一度だけダウンロードします。 このファイルとIssuer ID、Key IDを使って、ほとんどのリクエストで最大20分有効なトークンに署名します。
僕はTradaZenやNoleraなどのiOSアプリをExpoで公開しています。App Managerロールのチームキーを1つ作り、RevenueCat、Expoのビルド、ストアページを編集するコマンドラインツールで使っています。このガイドは、2026年11月3日に読み直したApple、Expo、fastlaneのページに基づいています。アプリのコードに埋め込むサービスのキーとは別物なので注意してください。そちらはExpoアプリの秘密APIキーで扱っています。
App Store Connect APIキーでできること
Appleのドキュメントによると、App Store Connect APIはリクエストごとにJWTトークンを必要とします。トークンは秘密鍵で生成・署名します。このキーはこのAPI専用で、Appleの他のサービスには使えません。
メリットは一言で言えます。接続を承認する人が不要になることです。 Apple IDでのログインは2ファクタ認証で止まるので、自動化ができません。Expoアプリの提出で何が変わるかは、EAS Submit iOSのガイドで紹介しています。
最初に:APIへのアクセスを申請する
最初のキーはすぐには作れません。App Store Connectヘルプにはっきり書かれています。まずAccount HolderがAPIへのアクセスを申請する必要があります。 Users and Accessを開き、Integrationsをクリックし、Request Accessをクリックします。Appleは申請を個別に審査します。
Account Holderは、アカウントを登録した人です。初心者ならあなた自身です。登録の詳細はAppleデベロッパーアカウントのガイドにあります。
チームキーか個人キーか
Appleには2種類のキーがあります。ドキュメントとApp Store Connectヘルプから違いをまとめました。
| 項目 | チームキー | 個人キー |
|---|---|---|
| 生成できる人 | Account HolderまたはAdmin | ほぼすべてのユーザー |
| アクセスできるアプリ | 例外なくすべて | そのユーザーのアプリ |
| 権限 | 選んだロール | そのユーザーの権限 |
| キーの数 | 複数 | 1人につき有効なもの1つ |
| 証明書とプロファイル | 可(ロールによる) | 不可 |
| 売上、財務、notaryTool | ロールによる | 不可 |
| トークンのフィールド | iss = Issuer ID | sub = user |
Appleによると「ほぼすべてのユーザー」とは、Account Holder、Admin、App Manager、Customer Support、Developer、Marketingのことです。ただし、AdminまたはAccount Holderが個人キーの生成権限を外した場合は除きます。
Expoやfastlaneで使うなら、チームキーを選んでください。 個人キーは、証明書やプロファイルを作成するプロビジョニング系のエンドポイントにアクセスできません。fastlaneのドキュメントでも、プロビジョニング関連のアクセスにはチームキーが必要だと確認できます。
キーに付けるロール
チームキーは、ロールに関係なくアカウントのすべてのアプリにアクセスできます。何ができるかはロールで決まります。AppleはAdminキーがユーザーの作成・削除までできると警告しています。 用途をカバーする最小のロールを付けましょう。以下の権限はAppleのロール一覧によるものです。
| キーの用途 | 可能なロール |
|---|---|
| ビルドのアップロード | Admin, App Manager, Developer |
| TestFlightビルドの管理 | Admin, App Manager |
| 証明書とプロファイルの作成 | Admin, App Manager |
| アプリの審査提出 | Admin, App Manager |
| 商品と価格のインポート(RevenueCat) | 最低でもApp Manager |
| 他のチームキーの生成 | Admin |
RevenueCatの行は同社のドキュメントによるものです。一方、ExpoのガイドはキーにAdminロールを付けています。僕のアプリではApp Managerロールで十分です。EASはこれで配布用プロファイルを作成し、RevenueCatは商品をインポートしています。
キーを生成した後は、名前もロールも変更できません。変えたい場合は、無効化して新しく生成する必要があります。
チームキーの作り方(ステップごと)
AdminまたはAccount Holderのアカウントが必要です。Appleの手順は次のとおりです。
- Users and Accessを開き、Integrationsタブを選びます。
- 左の列でApp Store Connect APIを選び、Team Keysタブを開きます。
- Generate API Keyをクリックします(または+ボタン)。
- キーに名前を付けます。 名前は自分用で、キーの一部ではありません。使うツールの名前にしておきましょう。
- Accessでロールを選び、Generateをクリックします。
- Download API Keyのリンクで秘密鍵をダウンロードします。
ファイルをダウンロードするとリンクはすぐに消え、Appleはコピーを一切保管しません。ページを閉じる前に
.p8を保管してください。
次に2つのIDを控えます。トークンに関するAppleのページによると、Issuer IDはIntegrationsページの上部にCopyボタンと一緒に表示されます。Key IDは有効なキーの一覧にあり、マウスを乗せるとCopy Key IDが出ます。Issuer IDはアカウントのすべてのチームキーで共通です。Key IDはキーごとに異なります。
個人キーはもっと簡単です。自分のユーザープロフィールを開き、Individual API Keyまでスクロールして、Generate API Keyをクリックします。こちらもダウンロードは一度きりです。
.p8ファイルの保管
Appleはキーをパスワードと同じように扱うよう求めています。共有しない、コードリポジトリに置かない、アプリのコードに絶対に組み込まない。 僕のやり方はこうです。
- プロジェクト外のフォルダ、またはCIツールのシークレット管理に置く。
- キーのフォルダを
.gitignoreに入れる(提出の間だけファイルをプロジェクト内に置く場合)。 - 権限を厳しくする。 App Store Connect用のあるコマンドラインツールは、
.p8が他のアカウントから読める状態だと受け付けませんでした。chmod 600で解決しました。 - ツールごとに1つのキー。 Appleでは好きなロールで複数のキーを生成できます。
最後の点は、最初は守っていませんでした。僕のApp Managerキーは、RevenueCat、ビルド、ストアページ用ツールのすべてで使われています。無効化すれば3つのツールが同時に止まります。やり直せるなら、ツールごとにキーを作ります。 そうすれば他に影響を与えず1つだけ止められます。
Expoで使う
EASにキーを渡す方法は3つです。
- EASに管理を任せる。
eas credentials --platform iosでキーを作成し、Expoのサーバーに保管できます。一番簡単な方法です。 eas.jsonに書く。submitプロファイルはascApiKeyPath、ascApiKeyIssuerId、ascApiKeyIdを受け付けます。eas.jsonのリファレンスによると、これらのフィールドには$ASC_API_KEY_PATHのような環境変数も使えます。- 環境変数で渡す。 EAS CLIのリポジトリには
EXPO_ASC_API_KEY_PATH、EXPO_ASC_KEY_ID、EXPO_ASC_ISSUER_IDが記載されています。個人キーの場合はIssuer IDを省きます。
ビルドで知っておくべき制限があります。Expoによると、公式APIではApp Group、Merchant ID、CloudKitコンテナを関連付けられません。その場合はローカルでApple IDによるログインが必要です。僕はNoleraのウィジェットのApp Groupでこれを経験しました。キーでCapabilityは有効になりましたが、グループは関連付けられませんでした。関連付けはAppleのデベロッパーポータルで行いました。Capabilityの同期で詰まったら、EXPO_NO_CAPABILITY_SYNC=1で無効化できます。 その場合はApp IDでCapabilityを自分で有効にします。ビルドの署名についてはiOSの証明書とプロビジョニングプロファイルで詳しく説明しています。
fastlaneで使う
fastlaneはJSONファイルからキーを読み込みます。key_id、issuer_id、key(.p8の中身)は必須です。durationとin_houseは任意です。ダミーの値で示します。
{
"key_id": "XXXXXXXXXX",
"issuer_id": "your-issuer-id",
"key": "-----BEGIN PRIVATE KEY-----\nMIGT...\n-----END PRIVATE KEY-----",
"duration": 1200,
"in_house": false
}
このファイルをアクションに渡します。たとえばfastlane pilot distribute --api_key_path fastlane/cle.jsonです。Fastfileでは、app_store_connect_api_keyアクションがkey_id、issuer_id、key_filepathを受け取ります。セッションの長さは最大1,200秒、つまり20分です。すべてのアクションが対応しているわけではありません。たとえばproduceとpemはAPIキーでは動かないとfastlaneは明記しています。
自作スクリプトで使う
ツールなしなら、トークンを自分で作ります。Appleが手順を定めています。
- ヘッダー:
algはES256、kidはKey ID、typはJWT。 - ペイロード(チームキー):
issはIssuer ID、iatは作成時刻、expは有効期限、audはappstoreconnect-v1。 - ペイロード(個人キー):
issの代わりにsubをuserにします。 - 有効期間:20分を超えると、ほとんどのリクエストでAppleはトークンを拒否します。
Pythonでは、PyJWTライブラリと暗号化の依存関係を使います。ドキュメントによるとpip install pyjwt[crypto]でインストールします。Macのターミナルではpip install "pyjwt[crypto]"のように引用符で囲んでください。そうしないとzshが角括弧を受け付けません。
import time
import jwt
KEY_ID = "XXXXXXXXXX"
ISSUER_ID = "your-issuer-id"
with open("AuthKey_XXXXXXXXXX.p8") as f:
private_key = f.read()
now = int(time.time())
token = jwt.encode(
{"iss": ISSUER_ID, "iat": now, "exp": now + 20 * 60, "aud": "appstoreconnect-v1"},
private_key,
algorithm="ES256",
headers={"kid": KEY_ID, "typ": "JWT"},
)
print(token)
あとはAppleの例と同じように、Authorizationヘッダーで送ります。
curl -H "Authorization: Bearer $TOKEN" "https://api.appstoreconnect.apple.com/v1/apps"
2026年11月3日に、自分のマシンで生成した使い捨てキーでこのスクリプトを実行しました。トークンのヘッダーとペイロードはAppleのページと一致し、ES256署名も検証できました。このテストキーはApple側に存在しないので、AppleのAPIには送っていません。有効期間中は同じトークンを使い回しましょう。 パフォーマンスのためにAppleが推奨しています。
キーを無効化する
紛失したとき、漏えいしたとき、ツールで使わなくなったときは、すぐにキーを無効化してください。App Store Connectヘルプによると、Account HolderまたはAdminのアカウントで次のように行います。
- Users and Accessを開き、Integrationsを選びます。
- Team KeysまたはIndividual Keysを選び、Editをクリックします。
- 無効化するキーにチェックを入れ、Revoke Keyをクリックします。
- Revokeで確定します。
無効化したキーは二度と有効に戻せません。 Appleは30日間、Revokedの下に表示します。それを使っていたツールはすべて認証に失敗します。Expoでは「App Store Connect rejected the API authentication credentials」というメッセージが出ます。このメッセージやその他の提出エラーは、EASでの提出エラーと対処法で解説しています。漏えいしていないなら、古いキーを止める前に新しいキーを準備しましょう。漏えいした場合は、すぐに無効化するようAppleは求めています。
自分の個人キーの場合は、プロフィール、Individual API Key、Revokeの順です。
僕の.p8キーのチェックリスト
- Account HolderがAPIへのアクセスを申請した。
- ビルドやプロファイルに使うなら、チームキーにした。
- ロールは用途をカバーする最小のもので、名前で使うツールがわかる。
.p8はリポジトリ外にあり、権限が厳しく、暗号化したバックアップがある。- Issuer IDとKey IDはファイルとは別に控えてある。
- ツールごとにキーがあり、1つだけ無効化できる。
キーを危険にさらさずに公開を自動化する
キーは全体の流れの一部にすぎません。iOS & Android Kitは、サブスクリプションを含む僕のアプリのスターターコードから始まり、App Storeまでの4ステップを自分のペースで進められます。このキーでRevenueCatを接続するなら、全体の構成はRevenueCatとiOSのアプリ内サブスクリプションにあります。
初めてのリリースを準備中なら、無料診断を受けてください。本当に詰まっている点がわかり、Appleのリジェクト対策チェックリストもお送りします。App Storeでアプリを公開するのページでは、ストアページから承認までの各ステップを解説しています。
よくある質問
App Store Connect APIキーはどうやって作りますか?
まずAccount HolderがAPIへのアクセスを申請します。次にAdminがUsers and Access、Integrationsタブ、App Store Connect API、Team Keysを開きます。Generate API Keyをクリックし、名前とロールを選んでキーを生成し、.p8ファイルをダウンロードします。
紛失した.p8キーは再ダウンロードできますか?
できません。ファイルのダウンロードは一度きりで、Appleはコピーを保管しません。紛失したキーを無効化し、新しいキーを生成して、それを使っていた各ツールを更新してください。
Issuer IDとKey IDはどこにありますか?
App Store ConnectのUsers and Accessメニュー、Integrationsタブです。Issuer IDはページ上部に表示されます。Key IDは有効なキーの一覧にあります。個人キーはIssuer IDを使いません。
Expoで使うキーにはどのロールを付けるべきですか?
ExpoのガイドはAdminロールを付けています。Appleのロール一覧によると、ビルドのアップロードと証明書・プロファイルの作成にはApp Managerで十分です。僕がExpoのビルドで使っているキーもこのロールです。
APIキーのロールは変更できますか?
できません。Appleでは作成後にキーの名前もロールも変更できません。無効化して、正しいロールで新しく生成してください。
App Store Connect APIキーに有効期限はありますか?
Appleのページにはキーの有効期限についての記載はなく、無効化についてだけ書かれています。期限があるのはキーで署名したトークンのほうで、ほとんどのリクエストでは最大20分です。

