# Klucz API App Store Connect (.p8): jak go utworzyć i używać

> Klucz API App Store Connect (.p8) pobierzesz tylko raz. Rola, Issuer ID, Key ID, unieważnianie i użycie z Expo, fastlane lub własnym skryptem.

Oryginalna strona: [Klucz API App Store Connect (.p8): jak go utworzyć i używać](https://devoria.fr/pl/blog/klucz-api-app-store-connect-p8)
Autor: [Mehdi Azizi](https://devoria.fr/pl/mehdi-azizi)
Publikacja: 2026-11-04
Ostatnia aktualizacja treści: 2026-11-04


Klucz API App Store Connect pozwala narzędziu, takiemu jak EAS, fastlane, RevenueCat czy twój własny skrypt, działać na twoim koncie bez hasła i bez weryfikacji dwuetapowej. **Apple przechowuje publiczną połowę klucza, a ty pobierasz prywatną połowę, plik `.p8`, tylko raz.** Za pomocą tego pliku, Issuer ID i Key ID podpisujesz tokeny ważne maksymalnie 20 minut dla większości żądań.

Publikuję swoje aplikacje iOS, w tym TradaZen i Nolera, przez Expo. Jeden klucz zespołowy z rolą App Manager obsługuje RevenueCat, moje buildy Expo i narzędzie wiersza poleceń, którym edytuję strony aplikacji. Ten poradnik opiera się na stronach Apple, Expo i fastlane przeczytanych ponownie 3 listopada 2026. Nie myl go z kluczami usług wstawianymi do kodu aplikacji: o nich piszę w artykule [tajny klucz API w aplikacji Expo](https://devoria.fr/pl/blog/klucz-api-aplikacja-expo-co-chronic).

## Do czego służy klucz API App Store Connect

Według [dokumentacji Apple](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) API App Store Connect wymaga tokenu JWT przy każdym żądaniu. Generujesz go i podpisujesz swoim kluczem prywatnym. Klucz działa wyłącznie z tym API: nie użyjesz go do innych usług Apple.

Jego zaleta mieści się w jednym zdaniu: **nikt nie musi zatwierdzać logowania.** Twój Apple ID zatrzymuje się na weryfikacji dwuetapowej, co blokuje każdą automatyzację. Poradnik [EAS Submit iOS](https://devoria.fr/pl/blog/eas-submit-ios-publikacja-aplikacji-expo-app-store) pokazuje, co to zmienia przy wysyłce aplikacji Expo.

## Najpierw: poproś o dostęp do API

Pierwszego klucza nie utworzysz od razu. [Pomoc App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api) mówi jasno: **Account Holder musi najpierw poprosić o dostęp do API.** Otwiera Users and Access, klika Integrations, a potem Request Access. Apple rozpatruje każdy wniosek indywidualnie.

Account Holder to osoba, która zarejestrowała konto. Jeśli zaczynasz, to ty: poradnik [konto dewelopera Apple](https://devoria.fr/pl/blog/konto-deweloperskie-apple-cena) opisuje rejestrację krok po kroku.

## Klucz zespołowy czy indywidualny

Apple oferuje dwa typy kluczy. Oto różnice, zebrane z [dokumentacji](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) i [pomocy App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api):

| Kryterium                     | Klucz zespołowy          | Klucz indywidualny                  |
| ----------------------------- | ------------------------ | ----------------------------------- |
| Kto może go wygenerować       | Account Holder lub Admin | Prawie każdy użytkownik             |
| Dostępne aplikacje            | Wszystkie, bez wyjątku   | Te, do których ma dostęp użytkownik |
| Uprawnienia                   | Wybrana rola             | Uprawnienia użytkownika             |
| Liczba kluczy                 | Wiele                    | Jeden aktywny na osobę              |
| Certyfikaty i profile         | Tak, zależnie od roli    | Nie                                 |
| Sprzedaż, finanse, notaryTool | Zależnie od roli         | Nie                                 |
| Pole w tokenie                | `iss` = Issuer ID        | `sub` = `user`                      |

„Prawie każdy użytkownik” oznacza według Apple: Account Holder, Admin, App Manager, Customer Support, Developer i Marketing, chyba że Admin lub Account Holder odebrał im prawo do generowania klucza indywidualnego.

**Do Expo lub fastlane wybierz klucz zespołowy.** Klucz indywidualny nie ma dostępu do endpointów provisioningu, czyli tych, które tworzą certyfikaty i profile. [Dokumentacja fastlane](https://docs.fastlane.tools/app-store-connect-api/) to potwierdza: klucze zespołowe są wymagane do wszystkiego, co dotyczy provisioningu.

## Jaką rolę nadać kluczowi

Klucz zespołowy ma dostęp do wszystkich aplikacji na koncie, niezależnie od roli. Rola decyduje o tym, co może robić. **Apple ostrzega, że klucz Admin może tworzyć i usuwać użytkowników**: nadaj najmniejszą rolę, która pokrywa twoje potrzeby. Uprawnienia poniżej pochodzą z [tabeli ról Apple](https://developer.apple.com/help/account/access/roles/).

| Zastosowanie klucza                   | Role, które na to pozwalają   |
| ------------------------------------- | ----------------------------- |
| Wysyłanie buildów                     | Admin, App Manager, Developer |
| Zarządzanie buildami TestFlight       | Admin, App Manager            |
| Tworzenie certyfikatów i profili      | Admin, App Manager            |
| Wysyłanie aplikacji do recenzji       | Admin, App Manager            |
| Import produktów i cen (RevenueCat)   | Co najmniej App Manager       |
| Generowanie innych kluczy zespołowych | Admin                         |

Wiersz o RevenueCat pochodzi z [jego dokumentacji](https://www.revenuecat.com/docs/service-credentials/itunesconnect-app-specific-shared-secret/app-store-connect-api-key-configuration). Poradnik Expo z kolei [nadaje kluczowi rolę Admin](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md). W moich aplikacjach rola App Manager wystarcza: EAS tworzy z nią profile dystrybucyjne, a RevenueCat importuje produkty.

Po wygenerowaniu klucza [nie możesz już zmienić ani jego nazwy, ani roli](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api). Żeby coś zmienić, musisz go unieważnić i wygenerować nowy.

## Tworzenie klucza zespołowego krok po kroku

Potrzebujesz konta Admin lub Account Holder. Według [Apple](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api):

1. **Otwórz Users and Access**, a potem zakładkę Integrations.
2. **Wybierz App Store Connect API** w lewej kolumnie, a potem zakładkę Team Keys.
3. **Kliknij Generate API Key** albo przycisk +.
4. **Nadaj kluczowi nazwę.** Służy tylko tobie, nie jest częścią klucza. Nazwij go od narzędzia, które będzie go używać.
5. **Wybierz rolę** w sekcji Access, a potem kliknij Generate.
6. **Pobierz klucz prywatny** linkiem Download API Key.

> Link do pobrania znika, gdy tylko pobierzesz plik, a Apple nie zachowuje żadnej kopii. Schowaj `.p8`, zanim zamkniesz stronę.

Następnie zapisz oba identyfikatory. Według [strony Apple o tokenach](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests) **Issuer ID wyświetla się u góry strony Integrations**, z przyciskiem Copy. Key ID znajdziesz na liście aktywnych kluczy: najedź na niego kursorem, a pojawi się Copy Key ID. Issuer ID jest taki sam dla wszystkich kluczy zespołowych na koncie. Key ID jest unikalny dla każdego klucza.

W przypadku klucza indywidualnego jest krócej: otwórz swój profil użytkownika, przewiń do Individual API Key i kliknij Generate API Key. Tu również pobierasz plik tylko raz.

## Przechowywanie pliku .p8

Apple każe traktować klucz jak hasło: **nie udostępniaj go, nie trzymaj go w repozytorium kodu, nigdy nie wstawiaj go do kodu aplikacji.** Moja rutyna:

- **Folder poza projektem** albo menedżer sekretów twojego narzędzia CI.
- **Folder z kluczami w `.gitignore`**, jeśli plik musi na czas wysyłki leżeć w projekcie.
- **Restrykcyjne uprawnienia.** Pewne narzędzie wiersza poleceń do App Store Connect odrzucało mój `.p8`, dopóki plik był czytelny dla innych kont. `chmod 600` rozwiązał problem.
- **Jeden klucz na narzędzie.** Apple pozwala [wygenerować wiele kluczy](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) z wybranymi rolami.

Tego ostatniego punktu na początku nie zastosowałem. Mój klucz App Manager obsługuje jednocześnie RevenueCat, moje buildy i narzędzie do stron aplikacji. Jeśli będę musiał go unieważnić, padną trzy narzędzia naraz. **Gdybym robił to od nowa, utworzyłbym jeden klucz na narzędzie**, żeby móc wyłączyć jeden bez ruszania pozostałych.

## Użycie z Expo

Trzy sposoby na przekazanie klucza do EAS:

- **Zostawić zarządzanie EAS.** `eas credentials --platform ios` może utworzyć klucz i przechowywać go na serwerach Expo. To najprostsza droga.
- **Zadeklarować go w `eas.json`.** Profil `submit` przyjmuje `ascApiKeyPath`, `ascApiKeyIssuerId` i `ascApiKeyId`. Według [dokumentacji eas.json](https://docs.expo.dev/eas/json/) te pola przyjmują zmienne środowiskowe, np. `$ASC_API_KEY_PATH`.
- **Przekazać go przez środowisko.** [Repozytorium EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/README.md) dokumentuje `EXPO_ASC_API_KEY_PATH`, `EXPO_ASC_KEY_ID` i `EXPO_ASC_ISSUER_ID`. Przy kluczu indywidualnym pomijasz Issuer ID.

Jedno ograniczenie przy buildach: [Expo zaznacza](https://docs.expo.dev/build-reference/ios-capabilities/), że oficjalne API nie potrafi przypisać App Group, Merchant ID ani kontenera CloudKit. Potrzebne jest wtedy lokalne logowanie Apple ID. Przerobiłem to na Nolerze z grupą aplikacji dla jej widżetu: klucz włączał capability, ale nie przypisywał grupy. Przypisanie zrobiłem w portalu deweloperskim Apple. **Jeśli synchronizacja capabilities się blokuje, `EXPO_NO_CAPABILITY_SYNC=1` ją wyłącza**, a capability włączasz sam na identyfikatorze aplikacji. Podpisywanie buildów opisuję w artykule [certyfikat i provisioning profile iOS](https://devoria.fr/pl/blog/certyfikat-dewelopera-ios-provisioning-profile-expo).

## Użycie z fastlane

[fastlane](https://docs.fastlane.tools/app-store-connect-api/) odczytuje klucz z pliku JSON. Pola `key_id`, `issuer_id` i `key`, czyli zawartość `.p8`, są obowiązkowe. `duration` i `in_house` są opcjonalne. Przykładowe wartości:

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

Następnie przekazujesz ten plik do akcji, np. `fastlane pilot distribute --api_key_path fastlane/cle.json`. W Fastfile akcja `app_store_connect_api_key` przyjmuje `key_id`, `issuer_id` i `key_filepath`. Czas sesji nie przekracza 1200 sekund, czyli 20 minut. Nie wszystkie akcje to obsługują: fastlane podaje na przykład, że `produce` i `pem` nie działają z kluczem API.

## Użycie we własnym skrypcie

Bez narzędzia budujesz token sam. [Apple określa przepis](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests):

- **Nagłówek**: `alg` to `ES256`, `kid` to twój Key ID, `typ` to `JWT`.
- **Treść, klucz zespołowy**: `iss`, twój Issuer ID; `iat`, czas utworzenia; `exp`, czas wygaśnięcia; `aud`, równe `appstoreconnect-v1`.
- **Treść, klucz indywidualny**: `sub` równe `user` zamiast `iss`.
- **Czas ważności**: powyżej 20 minut Apple odrzuca token dla większości żądań.

W Pythonie użyj biblioteki PyJWT z zależnością kryptograficzną, instalowanej przez `pip install pyjwt[crypto]` według [jej dokumentacji](https://pyjwt.readthedocs.io/en/stable/installation.html). W terminalu na Macu dodaj cudzysłowy: `pip install "pyjwt[crypto]"`, inaczej zsh odrzuci nawiasy kwadratowe.

```python
import time
import jwt

KEY_ID = "XXXXXXXXXX"
ISSUER_ID = "twoj-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)
```

Potem wysyłasz go w nagłówku `Authorization`, jak w przykładzie Apple:

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

Uruchomiłem ten skrypt 3 listopada 2026 z jednorazowym kluczem wygenerowanym na moim komputerze: nagłówek i treść tokenu zgadzają się ze stroną Apple, a podpis ES256 się weryfikuje. Nie wysłałem go do API Apple z tym testowym kluczem, który u Apple nie istnieje. **Używaj tego samego tokenu, dopóki jest ważny**: Apple zaleca to dla lepszej wydajności.

## Unieważnianie klucza

Unieważnij klucz, gdy tylko zostanie zgubiony, skompromitowany albo gdy żadne narzędzie już go nie używa. Według [pomocy App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api), z konta Account Holder lub Admin:

1. Otwórz Users and Access, a potem Integrations.
2. Wybierz Team Keys lub Individual Keys, a potem kliknij Edit.
3. Zaznacz klucze do unieważnienia, a potem Revoke Key.
4. Potwierdź przyciskiem Revoke.

**Unieważnionego klucza nigdy nie da się przywrócić.** [Apple wyświetla go](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) przez 30 dni w sekcji Revoked. Każde narzędzie, które go używało, przestaje się uwierzytelniać. W Expo komunikat brzmi „[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)”. Ten komunikat i inne błędy wysyłki wyjaśniam w artykule [błędy wysyłki z EAS i jak je naprawić](https://devoria.fr/pl/blog/eas-submit-ios-bledy-naprawa). Jeśli klucz nie jest skompromitowany, przygotuj nowy, zanim wyłączysz stary. Jeśli jest, Apple każe unieważnić go natychmiast.

Dla twojego własnego klucza indywidualnego: twój profil, Individual API Key, potem Revoke.

## Moja checklista klucza .p8

- Account Holder poprosił o dostęp do API.
- Klucz jest zespołowy, jeśli służy do buildów lub profili.
- Jego rola jest najmniejszą, która pokrywa zastosowanie, a nazwa mówi, które narzędzie go używa.
- `.p8` leży poza repozytorium, z restrykcyjnymi uprawnieniami i zaszyfrowaną kopią zapasową.
- Issuer ID i Key ID są zapisane osobno, bez pliku.
- Każde narzędzie ma swój klucz, żeby można było unieważnić tylko jeden.

## Automatyzuj publikację, nie zostawiając w niej klucza

Klucz to tylko jeden element całej drogi. [iOS & Android Kit](https://devoria.fr/pl/kits/ios) startuje od kodu bazowego moich aplikacji, razem z subskrypcjami, i prowadzi przez cztery etapy aż do App Store, w twoim tempie. Jeśli podłączasz RevenueCat tym kluczem, pełną konfigurację znajdziesz w artykule [RevenueCat i subskrypcja in-app na iOS](https://devoria.fr/pl/blog/revenuecat-subskrypcja-in-app-ios).

Jeśli przygotowujesz swoją pierwszą premierę, [zrób darmową diagnozę](https://devoria.fr/pl/diagnostic): powie ci, co naprawdę cię blokuje, i wyśle ci moją checklistę przeciw odrzuceniom przez Apple. Strona [publikacja aplikacji w App Store](https://devoria.fr/pl/expertise/publikacja-aplikacji-w-app-store) omawia każdy etap, od strony aplikacji po zatwierdzenie.

## Najczęściej zadawane pytania

### Jak utworzyć klucz API App Store Connect?

Account Holder najpierw prosi o dostęp do API. Następnie Admin otwiera Users and Access, zakładkę Integrations, App Store Connect API, Team Keys. Klika Generate API Key, wybiera nazwę i rolę, generuje klucz, a potem pobiera plik `.p8`.

### Czy można ponownie pobrać zgubiony klucz .p8?

Nie. Plik pobierasz tylko raz, a Apple nie zachowuje żadnej kopii. Unieważnij zgubiony klucz, wygeneruj nowy i zaktualizuj każde narzędzie, które go używało.

### Gdzie znaleźć Issuer ID i Key ID?

W App Store Connect, w menu Users and Access, zakładka Integrations. Issuer ID wyświetla się u góry strony. Key ID jest na liście aktywnych kluczy. Klucz indywidualny nie używa Issuer ID.

### Jaką rolę nadać kluczowi używanemu przez Expo?

Poradnik Expo podaje rolę Admin. Według tabeli ról Apple App Manager wystarcza do wysyłania buildów oraz tworzenia certyfikatów i profili. Taką rolę ma mój klucz, używany do moich buildów Expo.

### Czy można zmienić rolę klucza API?

Nie. Apple nie pozwala zmienić ani nazwy, ani roli klucza po jego utworzeniu. Unieważnij go i wygeneruj nowy z właściwą rolą.

### Czy klucz API App Store Connect wygasa?

Strony Apple nie wspominają o wygasaniu klucza, tylko o jego unieważnieniu. Wygasają tokeny nim podpisane, po maksymalnie 20 minutach dla większości żądań.


## Twój projekt

[Review Kit](https://devoria.fr/pl/kits/app-review): Moja checklista do App Store Review, poprawione odrzucenia od Apple, checklista do Google Play i trzy skille Claude Code. 219 zł.

[iOS & Android Kit](https://devoria.fr/pl/kits/ios): Stwórz swoją aplikację na iPhone'a i Androida z Claude Code: kod startowy moich aplikacji, droga aż do sklepów i wszystkie kity. 439 zł.

[Diagnoza: co dzieli cię od twojej aplikacji na iPhone'a](https://devoria.fr/pl/diagnostic): 7 pytań, 60 sekund: wiesz, co naprawdę blokuje publikację twojej aplikacji na iPhone'a, masz plan w 4 krokach i kit dopasowany do ciebie.
