# API key App Store Connect (.p8): cara membuat dan memakainya

> API key App Store Connect (.p8) hanya bisa diunduh sekali. Role, Issuer ID, Key ID, pencabutan, dan pemakaiannya dengan Expo, fastlane, atau script.

Halaman asli: [API key App Store Connect (.p8): cara membuat dan memakainya](https://devoria.fr/id/blog/api-key-app-store-connect-p8)
Penulis: [Mehdi Azizi](https://devoria.fr/id/mehdi-azizi)
Terbit: 2026-11-04
Revisi konten terakhir: 2026-11-04


API key App Store Connect memungkinkan sebuah tool, seperti EAS, fastlane, RevenueCat, atau script buatanmu sendiri, bertindak atas akunmu tanpa password dan tanpa autentikasi dua faktor. **Apple menyimpan bagian publik key, dan kamu mengunduh bagian privatnya, sebuah file `.p8`, hanya sekali.** Dengan file ini, Issuer ID, dan Key ID, kamu menandatangani token yang berlaku paling lama 20 menit untuk sebagian besar request.

Aku memublikasikan app iOS-ku, termasuk TradaZen dan Nolera, dengan Expo. Satu team key dengan role App Manager kupakai untuk RevenueCat, build Expo-ku, dan sebuah tool command line yang mengedit halaman app-ku. Panduan ini mengikuti halaman Apple, Expo, dan fastlane yang kubaca ulang pada 3 November 2026. Jangan tertukar dengan key layanan yang diselipkan di kode app: yang itu dibahas di [API key rahasia di app Expo](https://devoria.fr/id/blog/kunci-api-rahasia-aplikasi-expo).

## Apa fungsi API key App Store Connect

Menurut [dokumentasi Apple](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), App Store Connect API mewajibkan token JWT untuk setiap request. Kamu membuat dan menandatanganinya dengan private key-mu. Key ini hanya untuk API tersebut: kamu tidak bisa memakainya untuk layanan Apple lain.

Kegunaannya bisa diringkas dalam satu kalimat: **tidak ada orang yang perlu menyetujui login.** Apple ID-mu terganjal autentikasi dua faktor, dan itu memblokir semua otomatisasi. Panduan [EAS Submit iOS](https://devoria.fr/id/blog/eas-submit-ios-publikasi-app-expo-app-store) menunjukkan dampaknya untuk pengiriman app Expo.

## Sebelum mulai: minta akses ke API

Key pertama tidak bisa langsung dibuat. [Bantuan App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api) jelas soal ini: **Account Holder harus lebih dulu meminta akses ke API.** Dia membuka Users and Access, klik Integrations, lalu Request Access. Apple meninjau permintaan itu kasus per kasus.

Account Holder adalah orang yang mendaftarkan akun. Kalau kamu pemula, itu kamu sendiri: panduan [akun developer Apple](https://devoria.fr/id/blog/biaya-akun-developer-apple-2026) menjelaskan pendaftarannya.

## Team key atau individual key

Apple menawarkan dua jenis key. Ini perbedaannya, diambil dari [dokumentasi](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) dan [bantuan App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api):

| Kriteria                        | Team key                  | Individual key         |
| ------------------------------- | ------------------------- | ---------------------- |
| Siapa yang bisa membuatnya      | Account Holder atau Admin | Hampir semua pengguna  |
| App yang bisa diakses           | Semua, tanpa kecuali      | App milik pengguna itu |
| Hak akses                       | Role yang dipilih         | Hak milik pengguna itu |
| Jumlah key                      | Beberapa                  | Satu aktif per orang   |
| Sertifikat dan profile          | Ya, tergantung role       | Tidak                  |
| Penjualan, keuangan, notaryTool | Tergantung role           | Tidak                  |
| Field token                     | `iss` = Issuer ID         | `sub` = `user`         |

"Hampir semua pengguna" artinya, menurut Apple: Account Holder, Admin, App Manager, Customer Support, Developer, dan Marketing, kecuali kalau Admin atau Account Holder mencabut hak mereka untuk membuat individual key.

**Untuk Expo atau fastlane, pilih team key.** Individual key tidak punya akses ke endpoint provisioning, yaitu yang membuat sertifikat dan profile. [Dokumentasi fastlane](https://docs.fastlane.tools/app-store-connect-api/) menegaskannya: team key wajib untuk semua akses yang berkaitan dengan provisioning.

## Role apa yang diberikan ke key-mu

Team key mengakses semua app di akun, apa pun role-nya. Role menentukan apa yang bisa dilakukannya. **Apple memperingatkan bahwa key Admin bisa membuat dan menghapus pengguna**: berikan role terkecil yang mencukupi kebutuhanmu. Hak akses di bawah ini diambil dari [tabel role Apple](https://developer.apple.com/help/account/access/roles/).

| Kegunaan key                            | Role yang mengizinkannya      |
| --------------------------------------- | ----------------------------- |
| Mengirim build                          | Admin, App Manager, Developer |
| Mengelola build TestFlight              | Admin, App Manager            |
| Membuat sertifikat dan profile          | Admin, App Manager            |
| Mengirim app untuk review               | Admin, App Manager            |
| Mengimpor produk dan harga (RevenueCat) | Minimal App Manager           |
| Membuat team key lain                   | Admin                         |

Baris RevenueCat berasal dari [dokumentasinya](https://www.revenuecat.com/docs/service-credentials/itunesconnect-app-specific-shared-secret/app-store-connect-api-key-configuration). Sementara panduan Expo [memberi role Admin](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md) ke key. Di app-ku, role App Manager sudah cukup: EAS membuat distribution profile dengannya, dan RevenueCat mengimpor produk.

Setelah key dibuat, [kamu tidak bisa lagi mengubah nama maupun role-nya](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api). Untuk mengubahnya, kamu harus mencabutnya lalu membuat yang baru.

## Membuat team key, langkah demi langkah

Kamu perlu akun Admin atau Account Holder. Menurut [Apple](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api):

1. **Buka Users and Access**, lalu tab Integrations.
2. **Pilih App Store Connect API** di kolom kiri, lalu tab Team Keys.
3. **Klik Generate API Key**, atau tombol +.
4. **Beri nama key.** Nama ini hanya untukmu, bukan bagian dari key. Namai sesuai tool yang akan memakainya.
5. **Pilih role** di bawah Access, lalu klik Generate.
6. **Unduh private key** lewat link Download API Key.

> Link unduhan hilang begitu kamu mengunduh file, dan Apple tidak menyimpan salinannya. Simpan `.p8` sebelum menutup halaman.

Lalu catat dua identifier. Menurut [halaman Apple soal token](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests), **Issuer ID tampil di bagian atas halaman Integrations**, dengan tombol Copy. Key ID muncul di daftar key aktif: arahkan kursor ke sana untuk memunculkan Copy Key ID. Issuer ID sama untuk semua team key di akun. Key ID unik untuk tiap key.

Untuk individual key, caranya lebih singkat: buka profil penggunamu, gulir ke Individual API Key, lalu klik Generate API Key. Unduhannya juga hanya sekali.

## Menyimpan file .p8

Apple meminta key diperlakukan seperti password: **jangan dibagikan, jangan disimpan di repository kode, jangan pernah dimasukkan ke kode app.** Rutinitasku:

- **Folder di luar project**, atau secret manager dari tool CI-mu.
- **Folder key di `.gitignore`-mu**, kalau file harus berada di project selama proses pengiriman.
- **Permission ketat.** Sebuah tool command line untuk App Store Connect menolak `.p8`-ku selama file itu masih bisa dibaca akun lain. `chmod 600` menyelesaikan masalahnya.
- **Satu key per tool.** Apple memungkinkan kamu [membuat beberapa key](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), dengan role pilihanmu.

Poin terakhir ini tidak kuterapkan di awal. Key App Manager-ku dipakai sekaligus untuk RevenueCat, build, dan tool halaman app-ku. Kalau aku harus mencabutnya, tiga tool mati bersamaan. **Kalau bisa mengulang, aku akan membuat satu key per tool**, supaya bisa mematikan satu tanpa mengganggu yang lain.

## Memakainya dengan Expo

Tiga cara memberikan key ke EAS:

- **Biarkan EAS yang mengelolanya.** `eas credentials --platform ios` bisa membuat key dan menyimpannya di server Expo. Ini jalan paling mudah.
- **Deklarasikan di `eas.json`.** Profile `submit` menerima `ascApiKeyPath`, `ascApiKeyIssuerId`, dan `ascApiKeyId`. Menurut [referensi eas.json](https://docs.expo.dev/eas/json/), field ini menerima environment variable, seperti `$ASC_API_KEY_PATH`.
- **Kirim lewat environment.** [Repository EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/README.md) mendokumentasikan `EXPO_ASC_API_KEY_PATH`, `EXPO_ASC_KEY_ID`, dan `EXPO_ASC_ISSUER_ID`. Untuk individual key, Issuer ID dihilangkan.

Ada satu batasan untuk build: [Expo menjelaskan](https://docs.expo.dev/build-reference/ios-capabilities/) bahwa API resmi tidak bisa menautkan App Group, Merchant ID, atau container CloudKit. Untuk itu kamu perlu login dengan Apple ID-mu, secara lokal. Aku mengalaminya di Nolera dengan app group untuk widget-nya: key mengaktifkan capability, tapi tidak menautkan grupnya. Aku melakukan penautan itu di portal developer Apple. **Kalau sinkronisasi capability macet, `EXPO_NO_CAPABILITY_SYNC=1` mematikannya**, dan kamu mengaktifkan capability sendiri di app identifier. Penandatanganan build dijelaskan di [sertifikat dan provisioning profile iOS](https://devoria.fr/id/blog/sertifikat-developer-ios-provisioning-profile-expo).

## Memakainya dengan fastlane

[fastlane](https://docs.fastlane.tools/app-store-connect-api/) membaca key dari file JSON. Field `key_id`, `issuer_id`, dan `key` (isi `.p8`) wajib ada. `duration` dan `in_house` opsional. Nilai contoh:

```json
{
  "key_id": "XXXXXXXXXX",
  "issuer_id": "your-issuer-id",
  "key": "-----BEGIN PRIVATE KEY-----\nMIGT...\n-----END PRIVATE KEY-----",
  "duration": 1200,
  "in_house": false
}
```

Lalu kamu berikan file ini ke sebuah action, misalnya `fastlane pilot distribute --api_key_path fastlane/cle.json`. Di Fastfile, action `app_store_connect_api_key` menerima `key_id`, `issuer_id`, dan `key_filepath`. Durasi sesi tidak lebih dari 1.200 detik, yaitu 20 menit. Tidak semua action mendukungnya: fastlane misalnya menyebutkan bahwa `produce` dan `pem` tidak berfungsi dengan API key.

## Memakainya di script buatanmu sendiri

Tanpa tool, kamu membuat token sendiri. [Apple menetapkan resepnya](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests):

- **Header**: `alg` bernilai `ES256`, `kid` bernilai Key ID-mu, `typ` bernilai `JWT`.
- **Payload, team key**: `iss`, Issuer ID-mu; `iat`, waktu pembuatan; `exp`, waktu kedaluwarsa; `aud`, yang bernilai `appstoreconnect-v1`.
- **Payload, individual key**: `sub` bernilai `user` sebagai ganti `iss`.
- **Durasi**: lebih dari 20 menit, Apple menolak token untuk sebagian besar request.

Di Python, dengan library PyJWT dan dependency kriptografinya, diinstal dengan `pip install pyjwt[crypto]` menurut [dokumentasinya](https://pyjwt.readthedocs.io/en/stable/installation.html). Di terminal Mac, pakai tanda kutip: `pip install "pyjwt[crypto]"`, kalau tidak zsh menolak tanda kurung siku.

```python
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)
```

Lalu kirim token di header `Authorization`, seperti contoh dari Apple:

```bash
curl -H "Authorization: Bearer $TOKEN" "https://api.appstoreconnect.apple.com/v1/apps"
```

Aku menjalankan script ini pada 3 November 2026 dengan key sekali pakai yang dibuat di komputerku: header dan payload token sesuai halaman Apple, dan tanda tangan ES256 terverifikasi. Aku tidak mengirimkannya ke API Apple dengan key tes ini, karena key itu tidak ada di Apple. **Pakai ulang token yang sama selama masih berlaku**: Apple menyarankannya demi performa yang lebih baik.

## Mencabut key

Cabut key begitu key hilang, bocor, atau tidak dipakai lagi oleh tool mana pun. Menurut [bantuan App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api), dengan akun Account Holder atau Admin:

1. Buka Users and Access, lalu Integrations.
2. Pilih Team Keys, atau Individual Keys, lalu klik Edit.
3. Centang key yang akan dicabut, lalu Revoke Key.
4. Konfirmasi dengan Revoke.

**Key yang sudah dicabut tidak bisa diaktifkan lagi.** [Apple menampilkannya](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) selama 30 hari di bawah Revoked. Setiap tool yang memakainya akan gagal autentikasi. Dengan Expo, pesannya "[App Store Connect rejected the API authentication credentials](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts)". Pesan ini dan kegagalan pengiriman lainnya dijelaskan di [error pengiriman dengan EAS dan cara memperbaikinya](https://devoria.fr/id/blog/error-eas-submit-ios-cara-memperbaiki). Kalau key tidak bocor, siapkan key baru sebelum mematikan yang lama. Kalau bocor, Apple meminta kamu mencabutnya segera.

Untuk individual key milikmu sendiri: profilmu, Individual API Key, lalu Revoke.

## Checklist key .p8-ku

- Account Holder sudah meminta akses ke API.
- Key-nya team key kalau dipakai untuk build atau profile.
- Role-nya yang terkecil yang mencukupi kebutuhan, dan namanya menyebut tool yang memakainya.
- `.p8` disimpan di luar repository, dengan permission ketat dan salinan cadangan terenkripsi.
- Issuer ID dan Key ID dicatat terpisah, tanpa file-nya.
- Tiap tool punya key sendiri, supaya bisa mencabut satu saja.

## Mengotomatiskan publikasi tanpa membahayakan key-mu

Key hanyalah satu bagian dari perjalanan. [iOS & Android Kit](https://devoria.fr/id/kits/ios) berangkat dari starter code app-ku, termasuk langganan, dan mengikuti empat tahap sampai ke App Store, sesuai ritmemu. Kalau kamu menyambungkan RevenueCat dengan key ini, setup lengkapnya ada di [RevenueCat dan langganan in-app iOS](https://devoria.fr/id/blog/revenuecat-langganan-in-app-ios).

Kalau kamu sedang menyiapkan rilis pertamamu, [ikuti diagnostik gratisnya](https://devoria.fr/id/diagnostic): diagnostik ini memberi tahu apa yang benar-benar menghambatmu dan mengirimkan checklist anti-penolakan Apple milikku. Halaman [memublikasikan aplikasi di App Store](https://devoria.fr/id/expertise/publikasi-aplikasi-di-app-store) membahas setiap tahap, dari halaman app sampai disetujui.

## Pertanyaan umum

### Bagaimana cara membuat API key App Store Connect?

Account Holder lebih dulu meminta akses ke API. Lalu seorang Admin membuka Users and Access, tab Integrations, App Store Connect API, Team Keys. Dia klik Generate API Key, memilih nama dan role, membuat key, lalu mengunduh file `.p8`.

### Apakah key .p8 yang hilang bisa diunduh ulang?

Tidak. File hanya bisa diunduh sekali, dan Apple tidak menyimpan salinannya. Cabut key yang hilang, lalu buat yang baru dan perbarui setiap tool yang memakainya.

### Di mana menemukan Issuer ID dan Key ID?

Di App Store Connect, menu Users and Access, tab Integrations. Issuer ID tampil di bagian atas halaman. Key ID ada di daftar key aktif. Individual key tidak memakai Issuer ID.

### Role apa yang diberikan ke key yang dipakai Expo?

Panduan Expo memberi role Admin. Menurut tabel role Apple, App Manager sudah cukup untuk mengirim build serta membuat sertifikat dan profile. Itu role key-ku, yang kupakai untuk build Expo-ku.

### Apakah role API key bisa diubah?

Tidak. Apple tidak mengizinkan perubahan nama maupun role key setelah dibuat. Cabut key itu, lalu buat yang baru dengan role yang tepat.

### Apakah API key App Store Connect bisa kedaluwarsa?

Halaman Apple tidak menyebutkan masa kedaluwarsa key, hanya pencabutannya. Yang kedaluwarsa adalah token yang ditandatangani dengannya, paling lama setelah 20 menit untuk sebagian besar request.


## Proyekmu

[Review Kit](https://devoria.fr/id/kits/app-review): Checklist review App Store saya, penolakan Apple yang sudah saya perbaiki, checklist Google Play, dan tiga skill Claude Code. Rp 999.000.

[iOS & Android Kit](https://devoria.fr/id/kits/ios): Bikin app iPhone dan Android kamu dengan Claude Code: kode awal dari app-app saya, langkah demi langkah sampai ke store, dan semua kit. Rp 1.999.000.

[Diagnosis: apa yang memisahkanmu dari app iPhone-mu](https://devoria.fr/id/diagnostic): 7 pertanyaan, 60 detik: kamu tahu apa yang benar-benar menghambatmu merilis app iPhone, jalurmu dalam 4 tahap, dan kit yang cocok untukmu.
