# App Store Connect API anahtarı (.p8): oluşturma ve kullanma

> 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ı.

Orijinal sayfa: [App Store Connect API anahtarı (.p8): oluşturma ve kullanma](https://devoria.fr/tr/blog/app-store-connect-api-anahtari-p8-olusturma)
Yazar: [Mehdi Azizi](https://devoria.fr/tr/mehdi-azizi)
Yayın: 2026-11-04
İçeriğin son gözden geçirilmesi: 2026-11-04


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ı](https://devoria.fr/tr/blog/expo-gizli-api-anahtari-koruma) yazısında ele alıyorum.

## App Store Connect API anahtarı ne işe yarar

[Apple'ın dokümantasyonuna](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) 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](https://devoria.fr/tr/blog/eas-submit-ios-expo-app-store-yayinlama) 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ı](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api) 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ı](https://devoria.fr/tr/blog/apple-gelistirici-hesabi-ucreti) rehberinde.

## Ekip anahtarı mı, bireysel anahtar mı

Apple iki tür anahtar sunuyor. [Dokümantasyondan](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) ve [App Store Connect yardım sayfasından](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api) 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](https://docs.fastlane.tools/app-store-connect-api/) 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](https://developer.apple.com/help/account/access/roles/) 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](https://www.revenuecat.com/docs/service-credentials/itunesconnect-app-specific-shared-secret/app-store-connect-api-key-configuration) geliyor. Expo'nun rehberi ise anahtara [Admin rolünü veriyor](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md). 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](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api). 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](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) göre:

1. **Users and Access'i aç**, ardından Integrations sekmesine geç.
2. **Sol sütunda App Store Connect API'yi seç**, sonra Team Keys sekmesine geç.
3. **Generate API Key'e** ya da + düğmesine tıkla.
4. **Anahtara bir ad ver.** Bu ad yalnızca senin içindir, anahtarın parçası değildir. Onu kullanacak aracın adını ver.
5. **Access altında rolü seç**, sonra Generate'e tıkla.
6. **Ö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 `.p8` dosyasını güvenli bir yere koy.

Sonra iki kimliği not al. [Apple'ın token sayfasına](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests) 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ü `.gitignore` dosyanda**, 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 `.p8` dosyamı reddetti. Bir `chmod 600` sorunu çözdü.
- **Her araca bir anahtar.** Apple, istediğin rollerle [birden fazla anahtar oluşturmana](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) 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 ios` bir anahtar oluşturup Expo sunucularında saklayabilir. En kolay yol bu.
- **`eas.json` içinde tanımlamak.** `submit` profili `ascApiKeyPath`, `ascApiKeyIssuerId` ve `ascApiKeyId` alanlarını kabul eder. [eas.json referansına](https://docs.expo.dev/eas/json/) göre bu alanlar `$ASC_API_KEY_PATH` gibi ortam değişkenlerini de kabul ediyor.
- **Ortam değişkenleriyle vermek.** [EAS CLI deposu](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/README.md) `EXPO_ASC_API_KEY_PATH`, `EXPO_ASC_KEY_ID` ve `EXPO_ASC_ISSUER_ID` değ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](https://docs.expo.dev/build-reference/ios-capabilities/) 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](https://docs.fastlane.tools/app-store-connect-api/) 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:

```json
{
  "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](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests):

- **Header**: `alg` değeri `ES256`, `kid` değeri Key ID'n, `typ` değeri `JWT`.
- **Payload, ekip anahtarı**: `iss`, Issuer ID'n; `iat`, oluşturulma zamanı; `exp`, son kullanma zamanı; `aud`, değeri `appstoreconnect-v1`.
- **Payload, bireysel anahtar**: `iss` yerine `sub` değeri `user`.
- **Süre**: 20 dakikayı aşarsa Apple çoğu istekte token'ı reddeder.

Python'da, [dokümantasyonuna](https://pyjwt.readthedocs.io/en/stable/installation.html) 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.

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

```bash
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](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api) göre, Account Holder ya da Admin hesabıyla:

1. Users and Access'i, ardından Integrations'ı aç.
2. Team Keys ya da Individual Keys'i seç, sonra Edit'e tıkla.
3. İptal edilecek anahtarları işaretle, sonra Revoke Key.
4. Revoke ile onayla.

**İptal edilen bir anahtar asla yeniden etkinleştirilemez.** [Apple onu](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) 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](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts)". 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.
- `.p8` depo 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](https://devoria.fr/tr/kits/ios), 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](https://devoria.fr/tr/blog/revenuecat-ios-uygulama-ici-abonelik-kurulumu) yazısında.

İlk yayınına hazırlanıyorsan [ücretsiz teşhisini yap](https://devoria.fr/tr/diagnostic): seni gerçekten neyin engellediğini söyler ve Apple ret karşıtı kontrol listemi gönderir. [App Store'da uygulama yayınlamak](https://devoria.fr/tr/expertise/app-storeda-uygulama-yayinlama) 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.


## Projen

[Review Kit](https://devoria.fr/tr/kits/app-review): App Store inceleme kontrol listem, düzelttiğim Apple retlerim, Google Play kontrol listesi ve üç Claude Code skill'i. ₺2.699.

[iOS & Android Kit](https://devoria.fr/tr/kits/ios): Claude Code ile iPhone ve Android uygulamanı yap: uygulamalarımın başlangıç kodu, mağazalara kadar giden yol ve tüm kitler. ₺5.499.

[Analiz: Seni iPhone uygulamandan ayıran ne?](https://devoria.fr/tr/diagnostic): 7 soru, 60 saniye: iPhone uygulamanı yayınlamanı asıl neyin engellediğini, 4 adımlık yolunu ve sana uygun kiti öğren.
