# App Store Connect API-nøkkel (.p8): opprett og bruk den

> App Store Connect API-nøkkelen (.p8) kan bare lastes ned én gang. Rolle, Issuer ID, Key ID, tilbakekalling og bruk med Expo, fastlane eller et skript.

Opprinnelig side: [App Store Connect API-nøkkel (.p8): opprett og bruk den](https://devoria.fr/no/blog/app-store-connect-api-nokkel-p8)
Forfatter: [Mehdi Azizi](https://devoria.fr/no/mehdi-azizi)
Publisert: 2026-11-04
Innhold sist revidert: 2026-11-04


En App Store Connect API-nøkkel lar et verktøy, som EAS, fastlane, RevenueCat eller ditt eget skript, handle på kontoen din uten passordet ditt og uten tofaktorautentisering. **Apple beholder den offentlige halvdelen av nøkkelen, og du laster ned den private halvdelen, en `.p8`-fil, bare én gang.** Med denne filen, Issuer ID og Key ID signerer du tokener som for de fleste forespørsler er gyldige i maks 20 minutter.

Jeg publiserer iOS-appene mine, blant annet TradaZen og Nolera, med Expo. En teamnøkkel med rollen App Manager brukes av RevenueCat, av Expo-byggene mine og av et kommandolinjeverktøy som redigerer appsidene mine. Denne guiden følger sidene til Apple, Expo og fastlane, gjennomlest 3. november 2026. Ikke bland den sammen med tjenestenøkler som legges inn i koden til en app: de tar jeg for meg i [hemmelig API-nøkkel i en Expo-app](https://devoria.fr/no/blog/hemmelig-api-nokkel-expo-app).

## Hva en App Store Connect API-nøkkel gjør

Ifølge [Apples dokumentasjon](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) krever App Store Connect API et JWT-token for hver forespørsel. Du genererer det og signerer det med den private nøkkelen din. Nøkkelen fungerer bare mot dette API-et: du kan ikke bruke den til andre Apple-tjenester.

Poenget kan sies i én setning: **ingen person trenger å godkjenne innloggingen.** Apple-ID-en din stopper på tofaktorautentiseringen, og det blokkerer all automatisering. Guiden [EAS Submit for iOS](https://devoria.fr/no/blog/eas-submit-ios-publisere-expo-app-app-store) viser hva dette endrer når du sender inn en Expo-app.

## Aller først: be om tilgang til API-et

Den første nøkkelen kan ikke opprettes med en gang. [Hjelpesidene til App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api) er tydelige: **Account Holder må først be om tilgang til API-et.** Hen åpner Users and Access, klikker på Integrations og deretter på Request Access. Apple vurderer hver forespørsel enkeltvis.

Account Holder er personen som registrerte kontoen. Er du nybegynner, er det deg: guiden [Apple-utviklerkonto](https://devoria.fr/no/blog/apple-utviklerkonto-pris-gratis-eller-99-dollar) går gjennom registreringen.

## Teamnøkkel eller individuell nøkkel

Apple tilbyr to typer nøkler. Her er forskjellene, hentet fra [dokumentasjonen](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) og [hjelpesidene til App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api):

| Kriterium                 | Teamnøkkel                 | Individuell nøkkel    |
| ------------------------- | -------------------------- | --------------------- |
| Hvem kan generere den     | Account Holder eller Admin | Nesten alle brukere   |
| Tilgjengelige apper       | Alle, uten unntak          | Brukerens apper       |
| Rettigheter               | Den valgte rollen          | Brukerens rettigheter |
| Antall nøkler             | Flere                      | Én aktiv per person   |
| Sertifikater og profiler  | Ja, avhengig av rolle      | Nei                   |
| Salg, økonomi, notaryTool | Avhengig av rolle          | Nei                   |
| Felt i tokenet            | `iss` = Issuer ID          | `sub` = `user`        |

«Nesten alle brukere» betyr ifølge Apple: Account Holder, Admin, App Manager, Customer Support, Developer og Marketing, med mindre en Admin eller Account Holder har fjernet retten deres til å generere en individuell nøkkel.

**Til Expo eller fastlane velger du en teamnøkkel.** En individuell nøkkel har ikke tilgang til provisioning-endepunktene, de som oppretter sertifikater og profiler. [Dokumentasjonen til fastlane](https://docs.fastlane.tools/app-store-connect-api/) bekrefter det: teamnøkler kreves for all tilgang som har med provisioning å gjøre.

## Hvilken rolle nøkkelen bør få

En teamnøkkel har tilgang til alle appene på kontoen, uansett rolle. Rollen avgjør hva den kan gjøre. **Apple advarer om at en Admin-nøkkel kan opprette og slette brukere**: gi den minste rollen som dekker behovet ditt. Rettighetene nedenfor kommer fra [Apples rolletabell](https://developer.apple.com/help/account/access/roles/).

| Bruk av nøkkelen                           | Roller som tillater det       |
| ------------------------------------------ | ----------------------------- |
| Sende inn bygg                             | Admin, App Manager, Developer |
| Administrere TestFlight-bygg               | Admin, App Manager            |
| Opprette sertifikater og profiler          | Admin, App Manager            |
| Sende en app til gjennomgang               | Admin, App Manager            |
| Importere produkter og priser (RevenueCat) | Minst App Manager             |
| Generere andre teamnøkler                  | Admin                         |

RevenueCat-raden kommer fra [dokumentasjonen deres](https://www.revenuecat.com/docs/service-credentials/itunesconnect-app-specific-shared-secret/app-store-connect-api-key-configuration). Expo-guiden [gir derimot nøkkelen rollen Admin](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md). For mine apper holder App Manager: EAS oppretter distribusjonsprofilene med den, og RevenueCat importerer produktene.

Når nøkkelen først er generert, [kan du ikke endre verken navnet eller rollen](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api). Vil du endre noe, må du tilbakekalle den og generere en ny.

## Opprett en teamnøkkel, steg for steg

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

1. **Åpne Users and Access**, og deretter fanen Integrations.
2. **Velg App Store Connect API** i venstre kolonne, og deretter fanen Team Keys.
3. **Klikk på Generate API Key**, eller på +-knappen.
4. **Gi nøkkelen et navn.** Det er bare for deg og er ikke en del av nøkkelen. Gi den navn etter verktøyet som skal bruke den.
5. **Velg rollen** under Access, og klikk på Generate.
6. **Last ned den private nøkkelen** med lenken Download API Key.

> Nedlastingslenken forsvinner så snart du har lastet ned filen, og Apple beholder ingen kopi. Legg `.p8`-filen på et trygt sted før du lukker siden.

Noter deretter de to ID-ene. Ifølge [Apples side om tokener](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests) **vises Issuer ID øverst på Integrations-siden**, med en Copy-knapp. Key ID står i listen over aktive nøkler: hold musepekeren over den for å få fram Copy Key ID. Issuer ID er den samme for alle teamnøklene på kontoen. Key ID er unik for hver nøkkel.

For en individuell nøkkel går det raskere: åpne brukerprofilen din, bla ned til Individual API Key og klikk på Generate API Key. Også her kan du bare laste ned én gang.

## Oppbevar .p8-filen

Apple ber deg behandle nøkkelen som et passord: **ikke del den, ikke legg den i et kodelager, og bygg den aldri inn i koden til en app.** Rutinen min:

- **En mappe utenfor prosjektet**, eller hemmelighetslageret i CI-verktøyet ditt.
- **Nøkkelmappen i `.gitignore`**, hvis filen må ligge i prosjektet mens du sender inn.
- **Strenge tilganger.** Et kommandolinjeverktøy for App Store Connect nektet å godta `.p8`-filen min så lenge andre kontoer kunne lese den. En `chmod 600` løste problemet.
- **Én nøkkel per verktøy.** Apple lar deg [generere flere nøkler](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), med rollene du selv velger.

Det siste punktet fulgte jeg ikke i starten. App Manager-nøkkelen min brukes av både RevenueCat, byggene mine og verktøyet for appsidene. Må jeg tilbakekalle den, faller tre verktøy samtidig. **Om jeg skulle gjort det på nytt, hadde jeg laget én nøkkel per verktøy**, så jeg kunne kutte én uten å røre de andre.

## Bruk den med Expo

Tre måter å gi nøkkelen til EAS på:

- **La EAS håndtere den.** `eas credentials --platform ios` kan opprette en nøkkel og lagre den på Expos servere. Det er den enkleste veien.
- **Oppgi den i `eas.json`.** `submit`-profilen godtar `ascApiKeyPath`, `ascApiKeyIssuerId` og `ascApiKeyId`. Ifølge [referansen for eas.json](https://docs.expo.dev/eas/json/) godtar disse feltene miljøvariabler, som `$ASC_API_KEY_PATH`.
- **Send den via miljøet.** [EAS CLI-repoet](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`. For en individuell nøkkel utelater du Issuer ID.

En begrensning du bør kjenne til for bygg: [Expo påpeker](https://docs.expo.dev/build-reference/ios-capabilities/) at det offisielle API-et ikke kan knytte til en App Group, en Merchant ID eller en CloudKit-container. Da trenger du en innlogging med Apple-ID-en din, lokalt. Det opplevde jeg med Nolera og app-gruppen til widgeten: nøkkelen aktiverte funksjonen, men knyttet ikke til gruppen. Den koblingen gjorde jeg i Apples utviklerportal. **Hvis synkroniseringen av funksjoner låser seg, slår `EXPO_NO_CAPABILITY_SYNC=1` den av**, og så aktiverer du funksjonen selv på app-ID-en. Signering av bygg er forklart i [iOS-sertifikat og provisioning profile](https://devoria.fr/no/blog/ios-utviklersertifikat-provisioning-profile-expo).

## Bruk den med fastlane

[fastlane](https://docs.fastlane.tools/app-store-connect-api/) leser nøkkelen fra en JSON-fil. Feltene `key_id`, `issuer_id` og `key`, innholdet i `.p8`-filen, er obligatoriske. `duration` og `in_house` er valgfrie. Fiktive verdier:

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

Deretter sender du filen til en action, for eksempel `fastlane pilot distribute --api_key_path fastlane/cle.json`. I en Fastfile tar actionen `app_store_connect_api_key` imot `key_id`, `issuer_id` og `key_filepath`. Sesjonsvarigheten er maks 1200 sekunder, altså 20 minutter. Ikke alle actions støtter den: fastlane oppgir for eksempel at `produce` og `pem` ikke fungerer med en API-nøkkel.

## Bruk den i ditt eget skript

Uten verktøy lager du tokenet selv. [Apple har fastsatt oppskriften](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests):

- **Header**: `alg` er `ES256`, `kid` er Key ID-en din, `typ` er `JWT`.
- **Innhold, teamnøkkel**: `iss`, Issuer ID-en din; `iat`, tidspunktet det ble laget; `exp`, utløpstidspunktet; `aud`, som er `appstoreconnect-v1`.
- **Innhold, individuell nøkkel**: `sub` er `user` i stedet for `iss`.
- **Varighet**: over 20 minutter avviser Apple tokenet for de fleste forespørsler.

I Python, med biblioteket PyJWT og kryptografi-avhengigheten, installert med `pip install pyjwt[crypto]` ifølge [dokumentasjonen](https://pyjwt.readthedocs.io/en/stable/installation.html). I Mac-terminalen må du bruke anførselstegn: `pip install "pyjwt[crypto]"`, ellers nekter zsh å godta hakeparentesene.

```python
import time
import jwt

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

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

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

Jeg kjørte dette skriptet 3. november 2026 med en engangsnøkkel generert på maskinen min: headeren og innholdet i tokenet stemmer med Apples side, og ES256-signaturen lar seg verifisere. Jeg sendte det ikke til Apples API med denne testnøkkelen, som ikke finnes hos Apple. **Gjenbruk det samme tokenet så lenge det er gyldig**: Apple anbefaler det for bedre ytelse.

## Tilbakekall en nøkkel

Tilbakekall en nøkkel så snart den er mistet, kompromittert eller ikke lenger brukes av noe verktøy. Ifølge [hjelpesidene til App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api), med en Account Holder- eller Admin-konto:

1. Åpne Users and Access, og deretter Integrations.
2. Velg Team Keys, eller Individual Keys, og klikk på Edit.
3. Huk av nøklene som skal tilbakekalles, og velg Revoke Key.
4. Bekreft med Revoke.

**En tilbakekalt nøkkel kan aldri aktiveres igjen.** [Apple viser den](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) i 30 dager under Revoked. Alle verktøy som brukte den, feiler da ved autentisering. Med Expo er meldingen «[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)». Denne meldingen og andre innsendingsfeil er forklart i [innsendingsfeil med EAS og hvordan du fikser dem](https://devoria.fr/no/blog/eas-submit-ios-vanlige-feil-losning). Hvis nøkkelen ikke er kompromittert, gjør du klar den nye før du kutter den gamle. Er den kompromittert, ber Apple deg tilbakekalle den umiddelbart.

For din egen individuelle nøkkel: profilen din, Individual API Key, og så Revoke.

## Sjekklisten min for .p8-nøkkelen

- Account Holder har bedt om tilgang til API-et.
- Nøkkelen er en teamnøkkel hvis den brukes til bygg eller profiler.
- Rollen er den minste som dekker bruken, og navnet sier hvilket verktøy som bruker den.
- `.p8`-filen ligger utenfor repoet, med strenge tilganger og en kryptert sikkerhetskopi.
- Issuer ID og Key ID er notert ved siden av, uten filen.
- Hvert verktøy har sin egen nøkkel, så du kan tilbakekalle bare én.

## Automatiser publiseringen uten å legge igjen nøkkelen

Nøkkelen er bare én del av veien. [iOS & Android Kit](https://devoria.fr/no/kits/ios) tar utgangspunkt i startkoden til appene mine, abonnementer inkludert, og følger fire steg helt fram til App Store, i ditt eget tempo. Kobler du til RevenueCat med denne nøkkelen, finner du hele oppsettet i [RevenueCat og in-app-abonnement på iOS](https://devoria.fr/no/blog/revenuecat-abonnement-ios-app).

Forbereder du din første lansering, [ta den gratis diagnosen](https://devoria.fr/no/diagnostic): den forteller deg hva som faktisk stopper deg, og sender deg sjekklisten min mot avvisning fra Apple. Siden [publisere en app på App Store](https://devoria.fr/no/expertise/publisere-app-pa-app-store) går gjennom hvert steg, fra appsiden til godkjenning.

## Ofte stilte spørsmål

### Hvordan oppretter jeg en App Store Connect API-nøkkel?

Account Holder ber først om tilgang til API-et. Deretter åpner en Admin Users and Access, fanen Integrations, App Store Connect API, Team Keys. Hen klikker på Generate API Key, velger navn og rolle, genererer nøkkelen og laster ned `.p8`-filen.

### Kan jeg laste ned en mistet .p8-nøkkel på nytt?

Nei. Filen kan bare lastes ned én gang, og Apple beholder ingen kopi. Tilbakekall den mistede nøkkelen, generer en ny og oppdater alle verktøy som brukte den.

### Hvor finner jeg Issuer ID og Key ID?

I App Store Connect, menyen Users and Access, fanen Integrations. Issuer ID vises øverst på siden. Key ID står i listen over aktive nøkler. En individuell nøkkel bruker ikke Issuer ID.

### Hvilken rolle bør en nøkkel som brukes av Expo få?

Expo-guiden gir rollen Admin. Ifølge Apples rolletabell holder App Manager for å sende inn bygg og opprette sertifikater og profiler. Det er rollen til nøkkelen min, som jeg bruker til Expo-byggene mine.

### Kan jeg endre rollen til en API-nøkkel?

Nei. Apple lar deg ikke endre verken navnet eller rollen til en nøkkel etter at den er opprettet. Tilbakekall den, og generer en ny med riktig rolle.

### Utløper en App Store Connect API-nøkkel?

Apples sider nevner ingen utløpsdato for nøkkelen, bare tilbakekalling. Det er tokenene som signeres med den som utløper, etter maks 20 minutter for de fleste forespørsler.


## Prosjektet ditt

[Review Kit](https://devoria.fr/no/kits/app-review): Sjekklisten min for App Store-gjennomgang, Apples avslag på appene mine med rettelser, sjekklisten for Google Play og tre Claude Code-skills. 499 kr.

[iOS & Android Kit](https://devoria.fr/no/kits/ios): Lag din iPhone- og Android-app med Claude Code: startkoden fra appene mine, veien helt til butikkene og alle kitene. 999 kr.

[Diagnose: dette står mellom deg og iPhone-appen din](https://devoria.fr/no/diagnostic): 7 spørsmål, 60 sekunder: du får vite hva som egentlig hindrer deg i å publisere iPhone-appen din, veien din i 4 steg og kitet som passer deg.
