App Store Connect API anahtarı (.p8): oluşturma ve kullanma
Yazan: Mehdi Azizi
tarihinde yayınlandı, 10 dk.
App Store Connect API anahtarı (.p8) yalnızca bir kez indirilir. Rol, Issuer ID, Key ID, iptal ve Expo, fastlane ya da kendi script'inle kullanımı.
App Store Connect API anahtarı, EAS, fastlane, RevenueCat ya da kendi script'in gibi bir aracın şifren ve iki adımlı doğrulama olmadan hesabında işlem yapmasını sağlar. Anahtarın açık yarısı Apple'da kalır, özel yarısını, yani bir .p8 dosyasını ise yalnızca bir kez indirirsin. Bu dosya, Issuer ID ve Key ID ile çoğu istek için en fazla 20 dakika geçerli token'lar imzalarsın.
TradaZen ve Nolera dahil iOS uygulamalarımı Expo ile yayınlıyorum. App Manager rolündeki bir ekip anahtarını RevenueCat, Expo build'lerim ve mağaza sayfalarımı düzenleyen bir komut satırı aracı için kullanıyorum. Bu rehber, 3 Kasım 2026'da tekrar okuduğum Apple, Expo ve fastlane sayfalarına dayanıyor. Bunu bir uygulamanın koduna gömülen servis anahtarlarıyla karıştırma: onları Expo uygulamasında gizli API anahtarı yazısında ele alıyorum.
App Store Connect API anahtarı ne işe yarar
Apple'ın dokümantasyonuna göre App Store Connect API her istek için bir JWT token ister. Bu token'ı sen üretir, özel anahtarınla imzalarsın. Anahtar yalnızca bu API için geçerlidir: Apple'ın başka servislerinde kullanamazsın.
Faydası tek cümleye sığıyor: bağlantıyı onaylayacak bir insana gerek kalmaz. Apple kimliğin iki adımlı doğrulamaya takılır ve bu da her türlü otomasyonu engeller. EAS Submit iOS rehberi bunun bir Expo uygulamasını göndermede neyi değiştirdiğini gösteriyor.
Her şeyden önce: API erişimi iste
İlk anahtar hemen oluşturulamaz. App Store Connect yardım sayfası net: önce Account Holder'ın API erişimi istemesi gerekir. Users and Access'i açar, Integrations'a, ardından Request Access'e tıklar. Apple talebi tek tek inceler.
Account Holder, hesabı kaydeden kişidir. Yeni başlıyorsan bu sensin: kayıt adımları Apple geliştirici hesabı rehberinde.
Ekip anahtarı mı, bireysel anahtar mı
Apple iki tür anahtar sunuyor. Dokümantasyondan ve App Store Connect yardım sayfasından derlediğim farklar:
| Kriter | Ekip anahtarı | Bireysel anahtar |
|---|---|---|
| Kim oluşturabilir | Account Holder veya Admin | Neredeyse her kullanıcı |
| Erişilebilen uygulamalar | İstisnasız hepsi | Kullanıcının uygulamaları |
| Yetkiler | Seçilen rol | Kullanıcının yetkileri |
| Anahtar sayısı | Birden fazla | Kişi başı bir aktif anahtar |
| Sertifikalar ve profiller | Evet, role göre | Hayır |
| Satışlar, finans, notaryTool | Role göre | Hayır |
| Token alanı | iss = Issuer ID | sub = user |
Apple'a göre "neredeyse her kullanıcı" şu demek: Account Holder, Admin, App Manager, Customer Support, Developer ve Marketing; tabii bir Admin ya da Account Holder onlardan bireysel anahtar oluşturma yetkisini almadıysa.
Expo ya da fastlane için ekip anahtarı seç. Bireysel anahtar, sertifika ve profil oluşturan provisioning uç noktalarına erişemez. fastlane dokümantasyonu da bunu doğruluyor: provisioning ile ilgili her erişim için ekip anahtarı gerekir.
Anahtarına hangi rolü vermelisin
Ekip anahtarı, rolü ne olursa olsun hesaptaki tüm uygulamalara erişir. Ne yapabileceğine rol karar verir. Apple, Admin anahtarının kullanıcı oluşturup silebileceği konusunda uyarıyor: kullanımını karşılayan en düşük rolü ver. Aşağıdaki yetkiler Apple'ın rol tablosundan geliyor.
| Anahtarın kullanımı | İzin veren roller |
|---|---|
| Build göndermek | Admin, App Manager, Developer |
| TestFlight build'lerini yönetmek | Admin, App Manager |
| Sertifika ve profil oluşturmak | Admin, App Manager |
| Uygulamayı incelemeye göndermek | Admin, App Manager |
| Ürün ve fiyatları içe aktarmak (RevenueCat) | En az App Manager |
| Başka ekip anahtarları oluşturmak | Admin |
RevenueCat satırı kendi dokümantasyonundan geliyor. Expo'nun rehberi ise anahtara Admin rolünü veriyor. Benim uygulamalarımda App Manager rolü yetiyor: EAS dağıtım profillerini onunla oluşturuyor, RevenueCat de ürünleri içe aktarıyor.
Anahtar oluşturulduktan sonra ne adını ne de rolünü değiştirebilirsin. Değiştirmek için iptal edip yenisini oluşturman gerekir.
Adım adım ekip anahtarı oluşturmak
Admin ya da Account Holder hesabı gerekir. Apple'a göre:
- Users and Access'i aç, ardından Integrations sekmesine geç.
- Sol sütunda App Store Connect API'yi seç, sonra Team Keys sekmesine geç.
- Generate API Key'e ya da + düğmesine tıkla.
- Anahtara bir ad ver. Bu ad yalnızca senin içindir, anahtarın parçası değildir. Onu kullanacak aracın adını ver.
- Access altında rolü seç, sonra Generate'e tıkla.
- Özel anahtarı Download API Key bağlantısıyla indir.
İndirme bağlantısı dosyayı indirdiğin anda kaybolur ve Apple hiçbir kopyasını saklamaz. Sayfayı kapatmadan önce
.p8dosyasını güvenli bir yere koy.
Sonra iki kimliği not al. Apple'ın token sayfasına göre Issuer ID, Integrations sayfasının üstünde bir Copy düğmesiyle görünür. Key ID aktif anahtarlar listesinde yer alır: Copy Key ID'nin çıkması için üzerine gel. Issuer ID hesaptaki tüm ekip anahtarları için aynıdır. Key ID her anahtara özgüdür.
Bireysel anahtar için süreç daha kısa: kullanıcı profilini aç, Individual API Key'e in ve Generate API Key'e tıkla. Burada da indirme tek seferlik.
.p8 dosyasını saklamak
Apple anahtara bir şifre gibi davranmanı istiyor: paylaşma, bir kod deposunda tutma, asla bir uygulamanın koduna gömme. Benim rutinim:
- Projenin dışında bir klasör, ya da sürekli entegrasyon aracının gizli bilgi yöneticisi.
- Anahtar klasörü
.gitignoredosyanda, dosyanın bir gönderim süresince projede durması gerekiyorsa. - Sıkı izinler. App Store Connect için bir komut satırı aracı, dosya başka hesaplar tarafından okunabildiği sürece
.p8dosyamı reddetti. Birchmod 600sorunu çözdü. - Her araca bir anahtar. Apple, istediğin rollerle birden fazla anahtar oluşturmana izin veriyor.
Bu son maddeyi başta uygulamadım. App Manager anahtarım hem RevenueCat'te, hem build'lerimde, hem de mağaza sayfası aracımda kullanılıyor. İptal etmem gerekirse üç araç birden çöker. Baştan yapsaydım her araç için bir anahtar oluştururdum, böylece birini diğerlerine dokunmadan kapatabilirdim.
Expo ile kullanmak
Anahtarı EAS'e vermenin üç yolu var:
- EAS'in yönetmesine bırakmak.
eas credentials --platform iosbir anahtar oluşturup Expo sunucularında saklayabilir. En kolay yol bu. eas.jsoniçinde tanımlamak.submitprofiliascApiKeyPath,ascApiKeyIssuerIdveascApiKeyIdalanlarını kabul eder. eas.json referansına göre bu alanlar$ASC_API_KEY_PATHgibi ortam değişkenlerini de kabul ediyor.- Ortam değişkenleriyle vermek. EAS CLI deposu
EXPO_ASC_API_KEY_PATH,EXPO_ASC_KEY_IDveEXPO_ASC_ISSUER_IDdeğişkenlerini belgeliyor. Bireysel anahtarda Issuer ID atlanır.
Build'ler için bilmen gereken bir sınır var: Expo'nun belirttiğine göre resmi API bir App Group, Merchant ID ya da CloudKit container bağlayamıyor. Bu durumda yerelde Apple kimliğinle giriş yapman gerekir. Bunu Nolera'da widget'ının app group'uyla yaşadım: anahtar capability'yi etkinleştirdi ama grubu bağlamadı. Bağlamayı Apple'ın geliştirici portalında yaptım. Capability senkronizasyonu takılırsa EXPO_NO_CAPABILITY_SYNC=1 onu devre dışı bırakır, sen de capability'yi uygulama kimliğinde kendin etkinleştirirsin. Build imzalama iOS sertifikası ve provisioning profile yazısında ayrıntılı anlatılıyor.
fastlane ile kullanmak
fastlane anahtarı bir JSON dosyasından okur. key_id, issuer_id ve .p8 içeriği olan key alanları zorunludur. duration ve in_house isteğe bağlıdır. Sahte değerlerle:
{
"key_id": "XXXXXXXXXX",
"issuer_id": "senin-issuer-id",
"key": "-----BEGIN PRIVATE KEY-----\nMIGT...\n-----END PRIVATE KEY-----",
"duration": 1200,
"in_house": false
}
Sonra bu dosyayı bir action'a verirsin, örneğin fastlane pilot distribute --api_key_path fastlane/cle.json. Bir Fastfile içinde app_store_connect_api_key action'ı key_id, issuer_id ve key_filepath alır. Oturum süresi 1.200 saniyeyi, yani 20 dakikayı geçemez. Her action bunu desteklemiyor: fastlane örneğin produce ve pem action'larının API anahtarıyla çalışmadığını belirtiyor.
Kendi script'inde kullanmak
Araç olmadan token'ı kendin üretirsin. Tarifi Apple belirliyor:
- Header:
algdeğeriES256,kiddeğeri Key ID'n,typdeğeriJWT. - Payload, ekip anahtarı:
iss, Issuer ID'n;iat, oluşturulma zamanı;exp, son kullanma zamanı;aud, değeriappstoreconnect-v1. - Payload, bireysel anahtar:
issyerinesubdeğeriuser. - Süre: 20 dakikayı aşarsa Apple çoğu istekte token'ı reddeder.
Python'da, dokümantasyonuna göre pip install pyjwt[crypto] ile kurulan PyJWT kütüphanesi ve kriptografi bağımlılığıyla. Mac terminalinde tırnak kullan: pip install "pyjwt[crypto]", yoksa zsh köşeli parantezleri kabul etmez.
import time
import jwt
KEY_ID = "XXXXXXXXXX"
ISSUER_ID = "senin-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)
Ardından Apple'ın örneğindeki gibi Authorization header'ında gönderirsin:
curl -H "Authorization: Bearer $TOKEN" "https://api.appstoreconnect.apple.com/v1/apps"
Bu script'i 3 Kasım 2026'da kendi makinemde oluşturduğum tek kullanımlık bir anahtarla çalıştırdım: token'ın header'ı ve payload'ı Apple'ın sayfasıyla uyuşuyor, ES256 imzası da doğrulanıyor. Apple'da var olmayan bu test anahtarıyla token'ı Apple'ın API'sine göndermedim. Geçerli olduğu sürece aynı token'ı tekrar kullan: Apple daha iyi performans için bunu öneriyor.
Anahtarı iptal etmek
Bir anahtar kaybolduğu, ele geçirildiği ya da bir araç onu artık kullanmadığı anda iptal et. App Store Connect yardım sayfasına göre, Account Holder ya da Admin hesabıyla:
- Users and Access'i, ardından Integrations'ı aç.
- Team Keys ya da Individual Keys'i seç, sonra Edit'e tıkla.
- İptal edilecek anahtarları işaretle, sonra Revoke Key.
- Revoke ile onayla.
İptal edilen bir anahtar asla yeniden etkinleştirilemez. Apple onu 30 gün boyunca Revoked altında gösterir. Onu kullanan her araç kimlik doğrulamada başarısız olur. Expo'da mesaj şu: "App Store Connect rejected the API authentication credentials". Bu mesaj ve diğer gönderim hataları EAS gönderim hataları ve çözümleri yazısında açıklanıyor. Anahtar ele geçirilmediyse eskisini kapatmadan önce yenisini hazırla. Ele geçirildiyse Apple hemen iptal etmeni istiyor.
Kendi bireysel anahtarın için: profilin, Individual API Key, ardından Revoke.
.p8 anahtarı için kontrol listem
- Account Holder API erişimi istedi.
- Build'ler ya da profiller için kullanılıyorsa anahtar bir ekip anahtarı.
- Rolü, kullanımı karşılayan en düşük rol ve adı onu hangi aracın kullandığını söylüyor.
.p8depo dışında, sıkı izinlerle ve şifreli bir yedekle saklanıyor.- Issuer ID ve Key ID, dosyadan ayrı olarak not edilmiş.
- Her aracın kendi anahtarı var, böylece yalnızca birini iptal edebilirsin.
Anahtarını riske atmadan yayınını otomatikleştir
Anahtar, sürecin yalnızca bir parçası. iOS & Android Kit, abonelikler dahil uygulamalarımın Starter Code'undan başlıyor ve App Store'a kadar dört adımı kendi hızında izlemeni sağlıyor. RevenueCat'i bu anahtarla bağlıyorsan, kurulumun tamamı RevenueCat ve iOS uygulama içi abonelik yazısında.
İlk yayınına hazırlanıyorsan ücretsiz teşhisini yap: seni gerçekten neyin engellediğini söyler ve Apple ret karşıtı kontrol listemi gönderir. App Store'da uygulama yayınlamak sayfası, mağaza sayfasından onaya kadar her adımı ele alıyor.
Sık sorulan sorular
App Store Connect API anahtarı nasıl oluşturulur?
Önce Account Holder API erişimi ister. Ardından bir Admin Users and Access'i, Integrations sekmesini, App Store Connect API'yi, Team Keys'i açar. Generate API Key'e tıklar, bir ad ve rol seçer, anahtarı oluşturur ve .p8 dosyasını indirir.
Kaybolan bir .p8 anahtarı tekrar indirilebilir mi?
Hayır. Dosya yalnızca bir kez indirilir ve Apple hiçbir kopyasını saklamaz. Kaybolan anahtarı iptal et, yenisini oluştur ve onu kullanan her aracı güncelle.
Issuer ID ve Key ID nerede bulunur?
App Store Connect'te, Users and Access menüsünde, Integrations sekmesinde. Issuer ID sayfanın üstünde görünür. Key ID aktif anahtarlar listesinde yer alır. Bireysel anahtar Issuer ID kullanmaz.
Expo'nun kullandığı bir anahtara hangi rol verilmeli?
Expo'nun rehberi Admin rolünü veriyor. Apple'ın rol tablosuna göre build göndermek ve sertifika ile profil oluşturmak için App Manager yeterli. Expo build'lerimde kullandığım anahtarın rolü de bu.
Bir API anahtarının rolü değiştirilebilir mi?
Hayır. Apple, oluşturulduktan sonra bir anahtarın ne adını ne de rolünü değiştirmene izin veriyor. İptal et, sonra doğru rolle yenisini oluştur.
App Store Connect API anahtarının süresi dolar mı?
Apple'ın sayfaları anahtarın süresinin dolmasından hiç bahsetmiyor, yalnızca iptalinden bahsediyor. Süresi dolan, onunla imzalanan token'lar: çoğu istek için en fazla 20 dakika sonra.

