# App Store Connect API-Schlüssel (.p8) erstellen und nutzen

> Den App Store Connect API-Schlüssel (.p8) kannst du nur einmal herunterladen. Rolle, Issuer ID, Key ID, Widerruf und Nutzung mit Expo, fastlane oder Skript.

Originalseite: [App Store Connect API-Schlüssel (.p8) erstellen und nutzen](https://devoria.fr/de/blog/app-store-connect-api-schluessel-p8)
Autor: [Mehdi Azizi](https://devoria.fr/de/mehdi-azizi)
Veröffentlicht: 2026-11-04
Letzte inhaltliche Überarbeitung: 2026-11-04


Mit einem App Store Connect API-Schlüssel kann ein Tool wie EAS, fastlane, RevenueCat oder dein eigenes Skript auf deinem Account arbeiten, ohne dein Passwort und ohne Zwei-Faktor-Authentifizierung. **Apple behält die öffentliche Hälfte des Schlüssels, und du lädst die private Hälfte, eine `.p8`-Datei, genau einmal herunter.** Mit dieser Datei, der Issuer ID und der Key ID signierst du Tokens, die für die meisten Anfragen höchstens 20 Minuten gültig sind.

Ich veröffentliche meine iOS-Apps, darunter TradaZen und Nolera, mit Expo. Ein Team-Schlüssel mit der Rolle App Manager dient RevenueCat, meinen Expo-Builds und einem Kommandozeilen-Tool, das meine Store-Einträge bearbeitet. Dieser Guide folgt den Seiten von Apple, Expo und fastlane, Stand 3. November 2026. Verwechsle ihn nicht mit den Schlüsseln von Diensten, die im Code einer App landen: Die behandle ich in [geheimer API-Schlüssel in einer Expo-App](https://devoria.fr/de/blog/geheimer-api-schluessel-expo-app).

## Was ein App Store Connect API-Schlüssel macht

Laut [Apples Dokumentation](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) verlangt die App Store Connect API für jede Anfrage ein JWT-Token. Du erzeugst es und signierst es mit deinem privaten Schlüssel. Der Schlüssel funktioniert nur für diese API: Für andere Apple-Dienste kannst du ihn nicht verwenden.

Der Vorteil in einem Satz: **Niemand muss die Anmeldung bestätigen.** Deine Apple-ID scheitert an der Zwei-Faktor-Authentifizierung, und das blockiert jede Automatisierung. Der Guide zu [EAS Submit iOS](https://devoria.fr/de/blog/eas-submit-ios-expo-app-app-store-veroeffentlichen) zeigt, was das beim Hochladen einer Expo-App ändert.

## Zuerst: API-Zugang beantragen

Den ersten Schlüssel kannst du nicht sofort erstellen. [Die App Store Connect-Hilfe](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api) ist da eindeutig: **Der Account Holder muss zuerst den API-Zugang beantragen.** Er öffnet Users and Access, klickt auf Integrations und dann auf Request Access. Apple prüft jeden Antrag einzeln.

Der Account Holder ist die Person, die den Account registriert hat. Wenn du gerade anfängst, bist das du: Der Guide zum [Apple-Entwicklerkonto](https://devoria.fr/de/blog/apple-developer-account-kosten) erklärt die Registrierung.

## Team-Schlüssel oder individueller Schlüssel

Apple bietet zwei Arten von Schlüsseln an. Hier die Unterschiede laut [Dokumentation](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) und [App Store Connect-Hilfe](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api):

| Kriterium                      | Team-Schlüssel            | Individueller Schlüssel |
| ------------------------------ | ------------------------- | ----------------------- |
| Wer ihn erzeugen kann          | Account Holder oder Admin | Fast jeder Nutzer       |
| Zugängliche Apps               | Alle, ohne Ausnahme       | Die des Nutzers         |
| Rechte                         | Die gewählte Rolle        | Die des Nutzers         |
| Anzahl Schlüssel               | Mehrere                   | Einer aktiv pro Person  |
| Zertifikate und Profile        | Ja, je nach Rolle         | Nein                    |
| Verkäufe, Finanzen, notaryTool | Je nach Rolle             | Nein                    |
| Feld im Token                  | `iss` = Issuer ID         | `sub` = `user`          |

„Fast jeder Nutzer“ heißt laut Apple: Account Holder, Admin, App Manager, Customer Support, Developer und Marketing, außer ein Admin oder der Account Holder hat ihnen das Recht entzogen, einen individuellen Schlüssel zu erzeugen.

**Für Expo oder fastlane nimm einen Team-Schlüssel.** Ein individueller Schlüssel hat keinen Zugriff auf die Provisioning-Endpunkte, also die, die Zertifikate und Profile erstellen. [Die fastlane-Dokumentation](https://docs.fastlane.tools/app-store-connect-api/) bestätigt das: Team-Schlüssel sind für jeden Provisioning-Zugriff erforderlich.

## Welche Rolle dein Schlüssel bekommt

Ein Team-Schlüssel greift auf alle Apps des Accounts zu, egal welche Rolle er hat. Die Rolle entscheidet, was er tun darf. **Apple warnt, dass ein Admin-Schlüssel Nutzer anlegen und löschen kann**: Gib die kleinste Rolle, die deinen Einsatz abdeckt. Die Rechte unten stammen aus [Apples Rollentabelle](https://developer.apple.com/help/account/access/roles/).

| Einsatz des Schlüssels                       | Rollen, die das erlauben      |
| -------------------------------------------- | ----------------------------- |
| Builds hochladen                             | Admin, App Manager, Developer |
| TestFlight-Builds verwalten                  | Admin, App Manager            |
| Zertifikate und Profile erstellen            | Admin, App Manager            |
| App zur Prüfung einreichen                   | Admin, App Manager            |
| Produkte und Preise importieren (RevenueCat) | Mindestens App Manager        |
| Weitere Team-Schlüssel erzeugen              | Admin                         |

Die RevenueCat-Zeile stammt aus [deren Dokumentation](https://www.revenuecat.com/docs/service-credentials/itunesconnect-app-specific-shared-secret/app-store-connect-api-key-configuration). Der Expo-Guide dagegen [gibt dem Schlüssel die Rolle Admin](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md). Bei meinen Apps reicht App Manager: EAS erstellt damit die Distributionsprofile, und RevenueCat importiert die Produkte.

Sobald der Schlüssel erzeugt ist, [kannst du weder Namen noch Rolle ändern](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api). Willst du etwas ändern, musst du ihn widerrufen und einen neuen erzeugen.

## Einen Team-Schlüssel erstellen, Schritt für Schritt

Du brauchst einen Admin- oder Account-Holder-Account. Laut [Apple](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api):

1. **Öffne Users and Access**, dann den Tab Integrations.
2. **Wähle App Store Connect API** in der linken Spalte, dann den Tab Team Keys.
3. **Klicke auf Generate API Key** oder auf den Button +.
4. **Gib dem Schlüssel einen Namen.** Der ist nur für dich, er ist nicht Teil des Schlüssels. Benenne ihn nach dem Tool, das ihn nutzen wird.
5. **Wähle die Rolle** unter Access und klicke auf Generate.
6. **Lade den privaten Schlüssel herunter** über den Link Download API Key.

> Der Download-Link verschwindet, sobald du die Datei heruntergeladen hast, und Apple behält keine Kopie. Leg die `.p8` sicher ab, bevor du die Seite schließt.

Notiere dir dann die beiden IDs. Laut [Apples Seite zu Tokens](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests) **wird die Issuer ID oben auf der Seite Integrations angezeigt**, mit einem Copy-Button. Die Key ID steht in der Liste der aktiven Schlüssel: Fahr mit der Maus darüber, dann erscheint Copy Key ID. Die Issuer ID ist für alle Team-Schlüssel des Accounts gleich. Die Key ID gehört zu genau einem Schlüssel.

Bei einem individuellen Schlüssel geht es schneller: Öffne dein Nutzerprofil, scroll zu Individual API Key und klick auf Generate API Key. Auch hier kannst du nur einmal herunterladen.

## Die .p8-Datei aufbewahren

Apple verlangt, den Schlüssel wie ein Passwort zu behandeln: **Teile ihn nicht, leg ihn nicht in ein Code-Repository, bau ihn nie in den Code einer App ein.** Meine Routine:

- **Ein Ordner außerhalb des Projekts**, oder der Secrets-Manager deines CI-Tools.
- **Der Schlüsselordner in deiner `.gitignore`**, falls die Datei für einen Upload kurz im Projekt liegen muss.
- **Strenge Rechte.** Ein Kommandozeilen-Tool für App Store Connect hat meine `.p8` abgelehnt, solange andere Accounts sie lesen konnten. Ein `chmod 600` hat das Problem gelöst.
- **Ein Schlüssel pro Tool.** Apple erlaubt, [mehrere Schlüssel zu erzeugen](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), mit den Rollen deiner Wahl.

Den letzten Punkt habe ich anfangs nicht umgesetzt. Mein App-Manager-Schlüssel dient gleichzeitig RevenueCat, meinen Builds und meinem Tool für die Store-Einträge. Muss ich ihn widerrufen, fallen drei Tools auf einmal aus. **Würde ich es nochmal machen, würde ich einen Schlüssel pro Tool erstellen**, damit ich einen abschalten kann, ohne die anderen anzufassen.

## Nutzung mit Expo

Drei Wege, EAS den Schlüssel zu geben:

- **EAS verwalten lassen.** `eas credentials --platform ios` kann einen Schlüssel erstellen und auf den Servern von Expo speichern. Das ist der einfachste Weg.
- **Ihn in `eas.json` eintragen.** Das `submit`-Profil akzeptiert `ascApiKeyPath`, `ascApiKeyIssuerId` und `ascApiKeyId`. Laut [eas.json-Referenz](https://docs.expo.dev/eas/json/) akzeptieren diese Felder Umgebungsvariablen wie `$ASC_API_KEY_PATH`.
- **Ihn über die Umgebung übergeben.** [Das EAS CLI-Repository](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/README.md) dokumentiert `EXPO_ASC_API_KEY_PATH`, `EXPO_ASC_KEY_ID` und `EXPO_ASC_ISSUER_ID`. Bei einem individuellen Schlüssel lässt du die Issuer ID weg.

Eine Einschränkung bei Builds solltest du kennen: [Expo weist darauf hin](https://docs.expo.dev/build-reference/ios-capabilities/), dass die offizielle API keine App Group, keine Merchant ID und keinen CloudKit-Container zuordnen kann. Dann brauchst du eine lokale Anmeldung mit deiner Apple-ID. Das habe ich bei Nolera mit der App Group des Widgets erlebt: Der Schlüssel hat die Capability aktiviert, die Gruppe aber nicht zugeordnet. Die Zuordnung habe ich im Apple-Entwicklerportal gemacht. **Wenn die Capability-Synchronisierung hängt, schaltet `EXPO_NO_CAPABILITY_SYNC=1` sie ab**, und du aktivierst die Capability selbst auf der App-ID. Das Signieren von Builds erkläre ich in Zertifikat und Provisioning Profile unter iOS.

## Nutzung mit fastlane

[fastlane](https://docs.fastlane.tools/app-store-connect-api/) liest den Schlüssel aus einer JSON-Datei. Die Felder `key_id`, `issuer_id` und `key`, also der Inhalt der `.p8`, sind Pflicht. `duration` und `in_house` sind optional. Beispielwerte:

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

Diese Datei gibst du dann an eine Action weiter, zum Beispiel `fastlane pilot distribute --api_key_path fastlane/cle.json`. In einem Fastfile nimmt die Action `app_store_connect_api_key` die Werte `key_id`, `issuer_id` und `key_filepath`. Die Sitzungsdauer liegt bei höchstens 1.200 Sekunden, also 20 Minuten. Nicht alle Actions unterstützen den Schlüssel: fastlane weist zum Beispiel darauf hin, dass `produce` und `pem` nicht mit einem API-Schlüssel funktionieren.

## Nutzung im eigenen Skript

Ohne Tool baust du das Token selbst. [Apple gibt das Rezept vor](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests):

- **Header**: `alg` ist `ES256`, `kid` ist deine Key ID, `typ` ist `JWT`.
- **Payload, Team-Schlüssel**: `iss`, deine Issuer ID; `iat`, der Erstellungszeitpunkt; `exp`, der Ablaufzeitpunkt; `aud`, mit dem Wert `appstoreconnect-v1`.
- **Payload, individueller Schlüssel**: `sub` ist `user` anstelle von `iss`.
- **Dauer**: Über 20 Minuten lehnt Apple das Token bei den meisten Anfragen ab.

In Python mit der Bibliothek PyJWT und ihrer Kryptografie-Abhängigkeit, installiert per `pip install pyjwt[crypto]` laut [Dokumentation](https://pyjwt.readthedocs.io/en/stable/installation.html). Im Terminal auf dem Mac setzt du Anführungszeichen: `pip install "pyjwt[crypto]"`, sonst lehnt zsh die eckigen Klammern ab.

```python
import time
import jwt

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

Dann schickst du es im Header `Authorization`, wie in Apples Beispiel:

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

Ich habe dieses Skript am 3. November 2026 mit einem Wegwerf-Schlüssel ausgeführt, den ich auf meinem Rechner erzeugt habe: Header und Payload des Tokens stimmen mit Apples Seite überein, und die ES256-Signatur lässt sich verifizieren. An Apples API habe ich es mit diesem Testschlüssel nicht geschickt, denn bei Apple existiert er nicht. **Verwende dasselbe Token wieder, solange es gültig ist**: Apple empfiehlt das für bessere Performance.

## Einen Schlüssel widerrufen

Widerrufe einen Schlüssel, sobald er verloren oder kompromittiert ist oder kein Tool ihn mehr nutzt. Laut [App Store Connect-Hilfe](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api), mit einem Account-Holder- oder Admin-Account:

1. Öffne Users and Access, dann Integrations.
2. Wähle Team Keys oder Individual Keys und klicke auf Edit.
3. Markiere die zu widerrufenden Schlüssel, dann Revoke Key.
4. Bestätige mit Revoke.

**Ein widerrufener Schlüssel lässt sich nie wieder aktivieren.** [Apple zeigt ihn](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) 30 Tage lang unter Revoked an. Jedes Tool, das ihn genutzt hat, scheitert dann bei der Authentifizierung. Bei Expo lautet die Meldung „[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)“. Diese Meldung und andere Upload-Fehler erkläre ich in [Upload-Fehler mit EAS und ihre Behebung](https://devoria.fr/de/blog/eas-submit-ios-fehler-loesung). Ist der Schlüssel nicht kompromittiert, bereite den neuen vor, bevor du den alten abschaltest. Ist er kompromittiert, verlangt Apple, ihn sofort zu widerrufen.

Für deinen eigenen individuellen Schlüssel: dein Profil, Individual API Key, dann Revoke.

## Meine Checkliste für den .p8-Schlüssel

- Der Account Holder hat den API-Zugang beantragt.
- Der Schlüssel ist ein Team-Schlüssel, wenn er für Builds oder Profile gedacht ist.
- Seine Rolle ist die kleinste, die den Einsatz abdeckt, und sein Name sagt, welches Tool ihn nutzt.
- Die `.p8` liegt außerhalb des Repositorys, mit strengen Rechten und einer verschlüsselten Sicherungskopie.
- Issuer ID und Key ID sind separat notiert, ohne die Datei.
- Jedes Tool hat seinen eigenen Schlüssel, damit du einen einzelnen widerrufen kannst.

## Deine Veröffentlichung automatisieren, ohne deinen Schlüssel preiszugeben

Der Schlüssel ist nur ein Teil des Wegs. Das [iOS & Android Kit](https://devoria.fr/de/kits/ios) startet mit dem Starter Code meiner Apps, Abos inklusive, und führt dich in vier Schritten bis in den App Store, in deinem Tempo. Wenn du RevenueCat mit diesem Schlüssel anbindest, findest du das komplette Setup in [RevenueCat und In-App-Abos unter iOS](https://devoria.fr/de/blog/revenuecat-in-app-abo-ios-einrichten).

Wenn du deinen ersten Release vorbereitest, [mach deine kostenlose Diagnose](https://devoria.fr/de/diagnostic): Sie zeigt dir, was dich wirklich blockiert, und schickt dir meine Checkliste gegen Apple-Ablehnungen. Die Seite [App im App Store veröffentlichen](https://devoria.fr/de/expertise/app-im-app-store-veroeffentlichen) geht jeden Schritt durch, vom Store-Eintrag bis zur Freigabe.

## Häufige Fragen

### Wie erstelle ich einen App Store Connect API-Schlüssel?

Der Account Holder beantragt zuerst den API-Zugang. Danach öffnet ein Admin Users and Access, Tab Integrations, App Store Connect API, Team Keys. Er klickt auf Generate API Key, wählt Namen und Rolle, erzeugt den Schlüssel und lädt die `.p8`-Datei herunter.

### Kann ich einen verlorenen .p8-Schlüssel erneut herunterladen?

Nein. Die Datei lässt sich nur einmal herunterladen, und Apple behält keine Kopie. Widerrufe den verlorenen Schlüssel, erzeuge einen neuen und aktualisiere jedes Tool, das ihn genutzt hat.

### Wo finde ich die Issuer ID und die Key ID?

In App Store Connect, Menü Users and Access, Tab Integrations. Die Issuer ID steht oben auf der Seite. Die Key ID steht in der Liste der aktiven Schlüssel. Ein individueller Schlüssel nutzt keine Issuer ID.

### Welche Rolle bekommt ein Schlüssel, den Expo nutzt?

Der Expo-Guide gibt die Rolle Admin. Laut Apples Rollentabelle reicht App Manager, um Builds hochzuladen und Zertifikate und Profile zu erstellen. Das ist die Rolle meines Schlüssels, den ich für meine Expo-Builds nutze.

### Kann ich die Rolle eines API-Schlüssels ändern?

Nein. Apple erlaubt nach der Erstellung weder eine Änderung des Namens noch der Rolle. Widerrufe ihn und erzeuge einen neuen mit der richtigen Rolle.

### Läuft ein App Store Connect API-Schlüssel ab?

Apples Seiten erwähnen keinen Ablauf des Schlüssels, nur seinen Widerruf. Ablaufen tun die damit signierten Tokens, für die meisten Anfragen nach höchstens 20 Minuten.


## Dein Projekt

[Review Kit](https://devoria.fr/de/kits/app-review): Meine Checkliste für die App Store Review, meine von Apple abgelehnten und korrigierten Fälle, die für Google Play und drei Claude Code Skills. 49 €.

[iOS & Android Kit](https://devoria.fr/de/kits/ios): Bau deine iPhone- und Android-App mit Claude Code: der Startcode meiner Apps, der Weg bis in die Stores und alle Kits. 99 €.

[Diagnose: Was dich von deiner iPhone-App trennt](https://devoria.fr/de/diagnostic): 7 Fragen, 60 Sekunden: Du erfährst, was dich wirklich davon abhält, deine iPhone-App zu veröffentlichen, bekommst deinen Weg in 4 Schritten und das passende Kit.
