# App Store Connect API-nøgle (.p8): opret og brug den

> App Store Connect API-nøglen (.p8) kan kun downloades én gang. Rolle, Issuer ID, Key ID, tilbagekaldelse og brug med Expo, fastlane eller et script.

Original side: [App Store Connect API-nøgle (.p8): opret og brug den](https://devoria.fr/da/blog/app-store-connect-api-noegle-p8)
Forfatter: [Mehdi Azizi](https://devoria.fr/da/mehdi-azizi)
Udgivet: 2026-11-04
Indhold senest revideret: 2026-11-04


En App Store Connect API-nøgle lader et værktøj, som EAS, fastlane, RevenueCat eller dit eget script, arbejde på din konto uden din adgangskode og uden totrinsgodkendelse. **Apple beholder den offentlige halvdel af nøglen, og du downloader den private halvdel, en `.p8`-fil, kun én gang.** Med den fil, Issuer ID og Key ID signerer du tokens, der højst er gyldige i 20 minutter for de fleste forespørgsler.

Jeg udgiver mine iOS-apps, blandt andet TradaZen og Nolera, med Expo. En teamnøgle med rollen App Manager bruges af RevenueCat, af mine Expo-builds og af et kommandolinjeværktøj, der redigerer mine app-sider. Denne guide følger Apples, Expos og fastlanes sider, gennemlæst den 3. november 2026. Forveksl den ikke med nøgler til tjenester, der ligger i koden til en app: dem gennemgår jeg i [hemmelig API-nøgle i en Expo-app](https://devoria.fr/da/blog/hemmelig-api-noegle-expo-app).

## Hvad en App Store Connect API-nøgle gør

Ifølge [Apples dokumentation](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) kræver App Store Connect API'et et JWT-token for hver forespørgsel. Du genererer det og signerer det med din private nøgle. Nøglen bruges kun til dette API: du kan ikke bruge den til andre af Apples tjenester.

Fordelen kan siges i én sætning: **ingen person behøver at godkende login.** Dit Apple-id støder ind i totrinsgodkendelsen, og det blokerer al automatisering. Guiden [EAS Submit iOS](https://devoria.fr/da/blog/eas-submit-ios-udgiv-expo-app-app-store) viser, hvad det ændrer, når du sender en Expo-app.

## Først: anmod om adgang til API'et

Den første nøgle kan ikke oprettes med det samme. [App Store Connects hjælp](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api) er klar: **Account Holder skal først anmode om adgang til API'et.** Vedkommende åbner Users and Access, klikker på Integrations og derefter på Request Access. Apple behandler hver anmodning for sig.

Account Holder er den person, der har oprettet kontoen. Hvis du er nybegynder, er det dig: guiden [Apple-udviklerkonto](https://devoria.fr/da/blog/apple-udviklerkonto-pris-gratis-eller-betalt) gennemgår tilmeldingen.

## Teamnøgle eller individuel nøgle

Apple tilbyder to typer nøgler. Her er forskellene, hentet fra [dokumentationen](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) og [App Store Connects hjælp](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api):

| Kriterium                 | Teamnøgle                  | Individuel nøgle      |
| ------------------------- | -------------------------- | --------------------- |
| Hvem kan generere den     | Account Holder eller Admin | Næsten alle brugere   |
| Tilgængelige apps         | Alle, uden undtagelse      | Brugerens egne        |
| Rettigheder               | Den valgte rolle           | Brugerens rettigheder |
| Antal nøgler              | Flere                      | Én aktiv pr. person   |
| Certifikater og profiler  | Ja, afhængigt af rollen    | Nej                   |
| Salg, økonomi, notaryTool | Afhængigt af rollen        | Nej                   |
| Felt i tokenet            | `iss` = Issuer ID          | `sub` = `user`        |

"Næsten alle brugere" betyder ifølge Apple: Account Holder, Admin, App Manager, Customer Support, Developer og Marketing, medmindre en Admin eller Account Holder har frataget dem retten til at generere en individuel nøgle.

**Til Expo eller fastlane skal du vælge en teamnøgle.** En individuel nøgle har ikke adgang til provisioning-endpoints, dem der opretter certifikater og profiler. [fastlanes dokumentation](https://docs.fastlane.tools/app-store-connect-api/) bekræfter det: teamnøgler er påkrævet til al adgang, der har med provisioning at gøre.

## Hvilken rolle din nøgle skal have

En teamnøgle har adgang til alle kontoens apps, uanset rolle. Rollen bestemmer, hvad den må. **Apple advarer om, at en Admin-nøgle kan oprette og slette brugere**: giv den mindste rolle, der dækker dit behov. Rettighederne nedenfor kommer fra [Apples rolletabel](https://developer.apple.com/help/account/access/roles/).

| Hvad nøglen bruges til                     | Roller, der tillader det      |
| ------------------------------------------ | ----------------------------- |
| Sende builds                               | Admin, App Manager, Developer |
| Administrere TestFlight-builds             | Admin, App Manager            |
| Oprette certifikater og profiler           | Admin, App Manager            |
| Sende en app til review                    | Admin, App Manager            |
| Importere produkter og priser (RevenueCat) | Mindst App Manager            |
| Generere andre teamnøgler                  | Admin                         |

RevenueCat-linjen kommer fra [deres dokumentation](https://www.revenuecat.com/docs/service-credentials/itunesconnect-app-specific-shared-secret/app-store-connect-api-key-configuration). Expos guide [giver derimod nøglen rollen Admin](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md). På mine apps er App Manager nok: EAS opretter distributionsprofilerne med den, og RevenueCat importerer produkterne.

Når nøglen først er genereret, [kan du hverken ændre dens navn eller rolle](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api). Vil du ændre noget, skal du tilbagekalde den og generere en ny.

## Opret en teamnøgle, trin for trin

Du skal bruge en Admin- eller Account Holder-konto. Ifølge [Apple](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api):

1. **Åbn Users and Access**, og derefter fanen Integrations.
2. **Vælg App Store Connect API** i venstre kolonne, og derefter fanen Team Keys.
3. **Klik på Generate API Key**, eller på knappen +.
4. **Giv nøglen et navn.** Det er kun til dig og er ikke en del af nøglen. Navngiv den efter det værktøj, der skal bruge den.
5. **Vælg rollen** under Access, og klik på Generate.
6. **Download den private nøgle** med linket Download API Key.

> Downloadlinket forsvinder, så snart du har downloadet filen, og Apple gemmer ingen kopi. Læg `.p8`-filen et sikkert sted, før du lukker siden.

Notér derefter de to id'er. Ifølge [Apples side om tokens](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests) **vises Issuer ID øverst på siden Integrations**, med en Copy-knap. Key ID står i listen over aktive nøgler: hold musen over den, så dukker Copy Key ID op. Issuer ID er det samme for alle kontoens teamnøgler. Key ID er unikt for hver nøgle.

For en individuel nøgle er det kortere: åbn din brugerprofil, rul ned til Individual API Key, og klik på Generate API Key. Også her kan du kun downloade én gang.

## Opbevar .p8-filen

Apple beder dig behandle nøglen som en adgangskode: **del den ikke, læg den ikke i et kode-repository, og byg den aldrig ind i koden til en app.** Min rutine:

- **En mappe uden for projektet**, eller secrets-manageren i dit CI-værktøj.
- **Nøglemappen i din `.gitignore`**, hvis filen skal ligge i projektet, mens du sender.
- **Stramme rettigheder.** Et kommandolinjeværktøj til App Store Connect afviste min `.p8`, så længe filen kunne læses af andre konti. En `chmod 600` løste problemet.
- **Én nøgle pr. værktøj.** Apple lader dig [generere flere nøgler](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), med de roller du vil.

Det sidste punkt fulgte jeg ikke fra starten. Min App Manager-nøgle bruges både af RevenueCat, mine builds og mit værktøj til app-siderne. Hvis jeg skal tilbagekalde den, holder tre værktøjer op med at virke på én gang. **Hvis jeg skulle gøre det om, ville jeg oprette én nøgle pr. værktøj**, så jeg kan slå én fra uden at røre de andre.

## Brug den med Expo

Tre måder at give nøglen til EAS:

- **Lad EAS håndtere den.** `eas credentials --platform ios` kan oprette en nøgle og gemme den på Expos servere. Det er den nemmeste vej.
- **Angiv den i `eas.json`.** `submit`-profilen accepterer `ascApiKeyPath`, `ascApiKeyIssuerId` og `ascApiKeyId`. Ifølge [referencen for eas.json](https://docs.expo.dev/eas/json/) accepterer felterne miljøvariabler, som `$ASC_API_KEY_PATH`.
- **Send den via miljøet.** [EAS CLI-repositoriet](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/README.md) dokumenterer `EXPO_ASC_API_KEY_PATH`, `EXPO_ASC_KEY_ID` og `EXPO_ASC_ISSUER_ID`. Ved en individuel nøgle udelader du Issuer ID.

En begrænsning, du skal kende til for builds: [Expo oplyser](https://docs.expo.dev/build-reference/ios-capabilities/), at det officielle API ikke kan tilknytte en App Group, et Merchant ID eller en CloudKit-container. Så skal du logge ind med dit Apple-id lokalt. Det oplevede jeg på Nolera med app-gruppen til dens widget: nøglen aktiverede capability'en uden at tilknytte gruppen. Den tilknytning lavede jeg i Apples udviklerportal. **Hvis synkroniseringen af capabilities går i stå, slår `EXPO_NO_CAPABILITY_SYNC=1` den fra**, og du aktiverer selv capability'en på app-id'et. Signering af builds er gennemgået i [iOS-certifikat og provisioning profile](https://devoria.fr/da/blog/ios-udviklercertifikat-provisioning-profile-expo).

## Brug den med fastlane

[fastlane](https://docs.fastlane.tools/app-store-connect-api/) læser nøglen fra en JSON-fil. Felterne `key_id`, `issuer_id` og `key`, indholdet af `.p8`-filen, er påkrævede. `duration` og `in_house` er valgfrie. Fiktive værdier:

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

Derefter giver du filen til en action, for eksempel `fastlane pilot distribute --api_key_path fastlane/cle.json`. I en Fastfile tager action'en `app_store_connect_api_key` imod `key_id`, `issuer_id` og `key_filepath`. Sessionens varighed må højst være 1.200 sekunder, altså 20 minutter. Ikke alle actions understøtter den: fastlane oplyser for eksempel, at `produce` og `pem` ikke virker med en API-nøgle.

## Brug den i dit eget script

Uden værktøj laver du selv tokenet. [Apple fastlægger opskriften](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests):

- **Header**: `alg` er `ES256`, `kid` er dit Key ID, `typ` er `JWT`.
- **Indhold, teamnøgle**: `iss`, dit Issuer ID; `iat`, oprettelsestidspunktet; `exp`, udløbstidspunktet; `aud`, som er `appstoreconnect-v1`.
- **Indhold, individuel nøgle**: `sub` er `user` i stedet for `iss`.
- **Varighed**: over 20 minutter afviser Apple tokenet for de fleste forespørgsler.

I Python med biblioteket PyJWT og dets kryptografiske afhængighed, installeret med `pip install pyjwt[crypto]` ifølge [dokumentationen](https://pyjwt.readthedocs.io/en/stable/installation.html). I Mac'ens terminal skal du bruge anførselstegn: `pip install "pyjwt[crypto]"`, ellers afviser zsh de firkantede parenteser.

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

Derefter sender du det i `Authorization`-headeren, som i Apples eksempel:

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

Jeg kørte scriptet den 3. november 2026 med en engangsnøgle genereret på min egen maskine: tokenets header og indhold stemmer med Apples side, og ES256-signaturen kan verificeres. Jeg sendte det ikke til Apples API med denne testnøgle, som ikke findes hos Apple. **Genbrug det samme token, så længe det er gyldigt**: Apple anbefaler det for bedre ydeevne.

## Tilbagekald en nøgle

Tilbagekald en nøgle, så snart den er mistet eller kompromitteret, eller et værktøj ikke længere bruger den. Ifølge [App Store Connects hjælp](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api), med en Account Holder- eller Admin-konto:

1. Åbn Users and Access, og derefter Integrations.
2. Vælg Team Keys eller Individual Keys, og klik på Edit.
3. Markér de nøgler, der skal tilbagekaldes, og vælg Revoke Key.
4. Bekræft med Revoke.

**En tilbagekaldt nøgle kan aldrig genaktiveres.** [Apple viser den](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) i 30 dage under Revoked. Alle værktøjer, der brugte den, fejler derefter ved godkendelsen. Med Expo er beskeden "[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)". Den besked og de andre fejl ved afsendelse er forklaret i [fejl ved afsendelse med EAS og hvordan du retter dem](https://devoria.fr/da/blog/eas-submit-ios-fejl-losninger). Hvis nøglen ikke er kompromitteret, så gør den nye klar, før du slår den gamle fra. Hvis den er, beder Apple dig tilbagekalde den med det samme.

Til din egen individuelle nøgle: din profil, Individual API Key, og så Revoke.

## Min tjekliste til .p8-nøglen

- Account Holder har anmodet om adgang til API'et.
- Nøglen er en teamnøgle, hvis den bruges til builds eller profiler.
- Dens rolle er den mindste, der dækker behovet, og dens navn fortæller, hvilket værktøj der bruger den.
- `.p8`-filen ligger uden for repositoriet, med stramme rettigheder og en krypteret sikkerhedskopi.
- Issuer ID og Key ID er noteret separat, uden filen.
- Hvert værktøj har sin egen nøgle, så du kan tilbagekalde én ad gangen.

## Automatisér din udgivelse uden at efterlade din nøgle

Nøglen er kun én brik i forløbet. [iOS & Android Kit](https://devoria.fr/da/kits/ios) tager udgangspunkt i startkoden til mine apps, abonnementer inklusive, og følger fire trin frem til App Store, i dit eget tempo. Hvis du kobler RevenueCat på med denne nøgle, finder du hele opsætningen i [RevenueCat og in-app-abonnement på iOS](https://devoria.fr/da/blog/revenuecat-in-app-abonnement-ios).

Hvis du forbereder din første udgivelse, så [tag din gratis diagnose](https://devoria.fr/da/diagnostic): den fortæller dig, hvad der reelt blokerer dig, og sender dig min tjekliste mod afvisning fra Apple. Siden [udgiv en app på App Store](https://devoria.fr/da/expertise/udgiv-app-paa-app-store) gennemgår hvert trin, fra app-siden til godkendelsen.

## Ofte stillede spørgsmål

### Hvordan opretter man en App Store Connect API-nøgle?

Account Holder anmoder først om adgang til API'et. Derefter åbner en Admin Users and Access, fanen Integrations, App Store Connect API, Team Keys. Vedkommende klikker på Generate API Key, vælger navn og rolle, genererer nøglen og downloader `.p8`-filen.

### Kan man downloade en mistet .p8-nøgle igen?

Nej. Filen kan kun downloades én gang, og Apple gemmer ingen kopi. Tilbagekald den mistede nøgle, generér en ny, og opdatér alle værktøjer, der brugte den.

### Hvor finder man Issuer ID og Key ID?

I App Store Connect, menuen Users and Access, fanen Integrations. Issuer ID vises øverst på siden. Key ID står i listen over aktive nøgler. En individuel nøgle bruger ikke Issuer ID.

### Hvilken rolle skal en nøgle, som Expo bruger, have?

Expos guide giver rollen Admin. Ifølge Apples rolletabel er App Manager nok til at sende builds og oprette certifikater og profiler. Det er rollen på min nøgle, som jeg bruger til mine Expo-builds.

### Kan man ændre rollen på en API-nøgle?

Nej. Apple tillader hverken at ændre navn eller rolle på en nøgle, efter den er oprettet. Tilbagekald den, og generér en ny med den rigtige rolle.

### Udløber en App Store Connect API-nøgle?

Apples sider nævner ikke, at nøglen udløber, kun at den kan tilbagekaldes. Det er de tokens, der signeres med den, som udløber, efter højst 20 minutter for de fleste forespørgsler.


## Dit projekt

[Review Kit](https://devoria.fr/da/kits/app-review): Min tjekliste til App Store-review, mine afvisninger fra Apple og hvordan jeg rettede dem, tjeklisten til Google Play og tre Claude Code-skills. 369 kr..

[iOS & Android Kit](https://devoria.fr/da/kits/ios): Byg din iPhone- og Android-app med Claude Code: startkoden fra mine apps, vejen helt ud i butikkerne og alle kits. 739 kr..

[Diagnose: det, der skiller dig fra din iPhone-app](https://devoria.fr/da/diagnostic): 7 spørgsmål, 60 sekunder: du finder ud af, hvad der reelt holder dig tilbage fra at udgive din iPhone-app, får din vej i 4 trin og det kit, der passer til dig.
