# Chiave API App Store Connect (.p8): crearla e usarla

> La chiave API App Store Connect (.p8) si scarica una sola volta. Ruolo, Issuer ID, Key ID, revoca e uso con Expo, fastlane o uno script.

Pagina originale: [Chiave API App Store Connect (.p8): crearla e usarla](https://devoria.fr/it/blog/chiave-api-app-store-connect-p8)
Autore: [Mehdi Azizi](https://devoria.fr/it/mehdi-azizi)
Pubblicazione: 2026-11-04
Ultima revisione dei contenuti: 2026-11-04


Una chiave API App Store Connect permette a uno strumento, come EAS, fastlane, RevenueCat o un tuo script, di agire sul tuo account senza la tua password né l'autenticazione a due fattori. **Apple conserva la metà pubblica della chiave, e tu scarichi la metà privata, un file `.p8`, una sola volta.** Con questo file, l'Issuer ID e il Key ID firmi dei token validi al massimo 20 minuti per la maggior parte delle richieste.

Pubblico le mie app iOS, tra cui TradaZen e Nolera, con Expo. Una chiave del team con ruolo App Manager serve a RevenueCat, alle mie build Expo e a uno strumento da riga di comando che modifica le mie schede. Questa guida segue le pagine di Apple, Expo e fastlane rilette il 3 novembre 2026. Non confonderla con le chiavi di servizi inserite nel codice di un'app: quelle sono trattate in [chiave API segreta in un'app Expo](https://devoria.fr/it/blog/chiave-api-segreta-app-expo).

## Cosa fa una chiave API App Store Connect

Secondo [la documentazione di Apple](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), l'API App Store Connect richiede un token JWT per ogni richiesta. Lo generi e lo firmi con la tua chiave privata. La chiave serve solo a questa API: non puoi usarla per altri servizi Apple.

Il suo vantaggio sta in una frase: **nessuna persona deve confermare l'accesso.** Il tuo Apple ID si scontra con l'autenticazione a due fattori, e questo blocca qualsiasi automazione. La guida [EAS Submit iOS](https://devoria.fr/it/blog/eas-submit-ios-pubblicare-app-expo-app-store) mostra cosa cambia per l'invio di un'app Expo.

## Prima di tutto: richiedere l'accesso all'API

La prima chiave non si crea subito. [L'aiuto di App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api) è chiaro: **l'Account Holder deve prima richiedere l'accesso all'API.** Apre Users and Access, clicca su Integrations, poi su Request Access. Apple esamina la richiesta caso per caso.

L'Account Holder è la persona che ha registrato l'account. Se sei agli inizi, sei tu: la guida [account sviluppatore Apple](https://devoria.fr/it/blog/account-sviluppatore-apple-prezzo) spiega la registrazione nel dettaglio.

## Chiave del team o chiave individuale

Apple offre due tipi di chiavi. Ecco le differenze, prese dalla [documentazione](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) e dall'[aiuto di App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api):

| Criterio                     | Chiave del team        | Chiave individuale     |
| ---------------------------- | ---------------------- | ---------------------- |
| Chi può generarla            | Account Holder o Admin | Quasi tutti gli utenti |
| App accessibili              | Tutte, senza eccezioni | Quelle dell'utente     |
| Permessi                     | Il ruolo scelto        | Quelli dell'utente     |
| Numero di chiavi             | Più di una             | Una attiva per persona |
| Certificati e profili        | Sì, secondo il ruolo   | No                     |
| Vendite, finanze, notaryTool | Secondo il ruolo       | No                     |
| Campo del token              | `iss` = Issuer ID      | `sub` = `user`         |

"Quasi tutti gli utenti" significa, secondo Apple: Account Holder, Admin, App Manager, Customer Support, Developer e Marketing, a meno che un Admin o l'Account Holder non abbia tolto loro il permesso di generare una chiave individuale.

**Per Expo o fastlane, scegli una chiave del team.** Una chiave individuale non ha accesso agli endpoint di provisioning, quelli che creano certificati e profili. [La documentazione di fastlane](https://docs.fastlane.tools/app-store-connect-api/) lo conferma: le chiavi del team sono necessarie per qualsiasi accesso legato al provisioning.

## Che ruolo dare alla tua chiave

Una chiave del team accede a tutte le app dell'account, qualunque sia il suo ruolo. Il ruolo decide cosa può fare. **Apple avverte che una chiave Admin può creare ed eliminare utenti**: dai il ruolo più basso che copre il tuo uso. I permessi qui sotto vengono dalla [tabella dei ruoli di Apple](https://developer.apple.com/help/account/access/roles/).

| Uso della chiave                         | Ruoli che lo consentono       |
| ---------------------------------------- | ----------------------------- |
| Inviare build                            | Admin, App Manager, Developer |
| Gestire le build TestFlight              | Admin, App Manager            |
| Creare certificati e profili             | Admin, App Manager            |
| Inviare un'app in revisione              | Admin, App Manager            |
| Importare prodotti e prezzi (RevenueCat) | Almeno App Manager            |
| Generare altre chiavi del team           | Admin                         |

La riga RevenueCat viene dalla [sua documentazione](https://www.revenuecat.com/docs/service-credentials/itunesconnect-app-specific-shared-secret/app-store-connect-api-key-configuration). La guida di Expo, invece, [assegna il ruolo Admin](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md) alla chiave. Sulle mie app basta il ruolo App Manager: EAS ci crea i profili di distribuzione, e RevenueCat importa i prodotti.

Una volta generata la chiave, [non puoi più modificarne né il nome né il ruolo](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api). Per cambiare, devi revocarla e generarne un'altra.

## Creare una chiave del team, passo per passo

Serve un account Admin o Account Holder. Secondo [Apple](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api):

1. **Apri Users and Access**, poi la scheda Integrations.
2. **Scegli App Store Connect API** nella colonna di sinistra, poi la scheda Team Keys.
3. **Clicca su Generate API Key**, o sul pulsante +.
4. **Dai un nome alla chiave.** Serve solo a te, non fa parte della chiave. Chiamala come lo strumento che la userà.
5. **Scegli il ruolo** sotto Access, poi clicca su Generate.
6. **Scarica la chiave privata** con il link Download API Key.

> Il link di download sparisce appena hai scaricato il file, e Apple non ne conserva nessuna copia. Metti al sicuro il `.p8` prima di chiudere la pagina.

Poi annota i due identificativi. Secondo [la pagina di Apple sui token](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests), **l'Issuer ID compare in alto nella pagina Integrations**, con un pulsante Copy. Il Key ID appare nell'elenco delle chiavi attive: passaci sopra col mouse per far comparire Copy Key ID. L'Issuer ID è lo stesso per tutte le chiavi del team dell'account. Il Key ID è specifico di ogni chiave.

Per una chiave individuale è più rapido: apri il tuo profilo utente, scendi fino a Individual API Key e clicca su Generate API Key. Anche qui il download è unico.

## Conservare il file .p8

Apple chiede di trattare la chiave come una password: **non condividerla, non metterla in un repository di codice, non inserirla mai nel codice di un'app.** La mia routine:

- **Una cartella fuori dal progetto**, o il gestore di segreti del tuo strumento di integrazione continua.
- **La cartella delle chiavi nel tuo `.gitignore`**, se il file deve stare nel progetto il tempo di un invio.
- **Permessi rigidi.** Uno strumento da riga di comando per App Store Connect ha rifiutato il mio `.p8` finché il file era leggibile da altri account. Un `chmod 600` ha risolto il problema.
- **Una chiave per strumento.** Apple permette di [generare più chiavi](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), con i ruoli che vuoi.

Quest'ultimo punto, all'inizio non l'ho applicato. La mia chiave App Manager serve sia a RevenueCat, sia alle mie build, sia al mio strumento per le schede. Se devo revocarla, tre strumenti si fermano insieme. **Se dovessi rifarlo, creerei una chiave per strumento**, per poterne disattivare una senza toccare le altre.

## Usarla con Expo

Tre modi di dare la chiave a EAS:

- **Farla gestire a EAS.** `eas credentials --platform ios` può creare una chiave e conservarla sui server di Expo. È la strada più semplice.
- **Dichiararla in `eas.json`.** Il profilo `submit` accetta `ascApiKeyPath`, `ascApiKeyIssuerId` e `ascApiKeyId`. Secondo [il riferimento di eas.json](https://docs.expo.dev/eas/json/), questi campi accettano variabili d'ambiente, come `$ASC_API_KEY_PATH`.
- **Passarla tramite l'ambiente.** [Il repository di EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/README.md) documenta `EXPO_ASC_API_KEY_PATH`, `EXPO_ASC_KEY_ID` e `EXPO_ASC_ISSUER_ID`. Per una chiave individuale si omette l'Issuer ID.

Un limite da conoscere per le build: [Expo precisa](https://docs.expo.dev/build-reference/ios-capabilities/) che l'API ufficiale non sa collegare un App Group, un Merchant ID o un container CloudKit. Serve allora un accesso con il tuo Apple ID, in locale. Mi è successo su Nolera con l'app group del suo widget: la chiave attivava la capability, senza collegare il gruppo. Ho fatto il collegamento nel portale sviluppatori di Apple. **Se la sincronizzazione delle capability si blocca, `EXPO_NO_CAPABILITY_SYNC=1` la disattiva**, e attivi tu la capability sull'identificativo dell'app. La firma delle build è spiegata in [certificato e provisioning profile iOS](https://devoria.fr/it/blog/certificato-sviluppatore-ios-provisioning-profile-expo).

## Usarla con fastlane

[fastlane](https://docs.fastlane.tools/app-store-connect-api/) legge la chiave da un file JSON. I campi `key_id`, `issuer_id` e `key`, il contenuto del `.p8`, sono obbligatori. `duration` e `in_house` sono facoltativi. Valori fittizi:

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

Poi passi il file a un'azione, per esempio `fastlane pilot distribute --api_key_path fastlane/cle.json`. In un Fastfile, l'azione `app_store_connect_api_key` accetta `key_id`, `issuer_id` e `key_filepath`. La durata della sessione non supera 1.200 secondi, cioè 20 minuti. Non tutte le azioni la supportano: fastlane segnala per esempio che `produce` e `pem` non funzionano con una chiave API.

## Usarla in un tuo script

Senza strumenti, il token lo costruisci tu. [Apple fissa la ricetta](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests):

- **Header**: `alg` vale `ES256`, `kid` vale il tuo Key ID, `typ` vale `JWT`.
- **Payload, chiave del team**: `iss`, il tuo Issuer ID; `iat`, l'ora di creazione; `exp`, l'ora di scadenza; `aud`, che vale `appstoreconnect-v1`.
- **Payload, chiave individuale**: `sub` vale `user` al posto di `iss`.
- **Durata**: oltre i 20 minuti, Apple rifiuta il token per la maggior parte delle richieste.

In Python, con la libreria PyJWT e la sua dipendenza crittografica, installata con `pip install pyjwt[crypto]` secondo [la sua documentazione](https://pyjwt.readthedocs.io/en/stable/installation.html). Nel terminale del Mac, usa le virgolette: `pip install "pyjwt[crypto]"`, altrimenti zsh rifiuta le parentesi quadre.

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

Poi lo invii nell'header `Authorization`, come nell'esempio di Apple:

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

Ho eseguito questo script il 3 novembre 2026 con una chiave usa e getta generata sul mio computer: header e payload del token corrispondono alla pagina di Apple, e la firma ES256 risulta valida. Non l'ho inviato all'API di Apple con questa chiave di test, che per Apple non esiste. **Riusa lo stesso token finché è valido**: Apple lo consiglia per prestazioni migliori.

## Revocare una chiave

Revoca una chiave appena è persa, compromessa, o quando uno strumento non la usa più. Secondo [l'aiuto di App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api), con un account Account Holder o Admin:

1. Apri Users and Access, poi Integrations.
2. Scegli Team Keys, o Individual Keys, poi clicca su Edit.
3. Seleziona le chiavi da revocare, poi Revoke Key.
4. Conferma con Revoke.

**Una chiave revocata non si riattiva mai.** [Apple la mostra](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) per 30 giorni sotto Revoked. Ogni strumento che la usava fallisce allora l'autenticazione. Con Expo, il messaggio è "[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)". Questo messaggio e gli altri errori di invio sono spiegati in [gli errori di invio con EAS e come correggerli](https://devoria.fr/it/blog/eas-submit-ios-errori-soluzioni). Se la chiave non è compromessa, prepara quella nuova prima di disattivare la vecchia. Se lo è, Apple chiede di revocarla subito.

Per la tua chiave individuale: il tuo profilo, Individual API Key, poi Revoke.

## La mia checklist della chiave .p8

- L'Account Holder ha richiesto l'accesso all'API.
- La chiave è una chiave del team se serve per build o profili.
- Il suo ruolo è il più basso che copre l'uso, e il suo nome dice quale strumento la usa.
- Il `.p8` è conservato fuori dal repository, con permessi rigidi e una copia di backup cifrata.
- Issuer ID e Key ID sono annotati a parte, senza il file.
- Ogni strumento ha la sua chiave, per poterne revocare una sola.

## Automatizzare la pubblicazione senza lasciarci la chiave

La chiave è solo un pezzo del percorso. L'[iOS & Android Kit](https://devoria.fr/it/kits/ios) parte dal codice di base delle mie app, abbonamenti compresi, e segue quattro tappe fino all'App Store, con i tuoi tempi. Se colleghi RevenueCat con questa chiave, la configurazione completa è in [RevenueCat e l'abbonamento in-app iOS](https://devoria.fr/it/blog/revenuecat-abbonamento-in-app-ios).

Se stai preparando la tua prima uscita, [fai la tua diagnosi gratuita](https://devoria.fr/it/diagnostic): ti dice cosa ti blocca davvero e ti manda la mia checklist anti-rifiuto Apple. La pagina [pubblicare un'app sull'App Store](https://devoria.fr/it/expertise/pubblicare-app-su-app-store) riprende ogni tappa, dalla scheda all'approvazione.

## Domande frequenti

### Come si crea una chiave API App Store Connect?

L'Account Holder richiede prima l'accesso all'API. Poi un Admin apre Users and Access, scheda Integrations, App Store Connect API, Team Keys. Clicca su Generate API Key, sceglie un nome e un ruolo, genera la chiave, poi scarica il file `.p8`.

### Si può riscaricare una chiave .p8 persa?

No. Il file si scarica una sola volta, e Apple non ne conserva nessuna copia. Revoca la chiave persa, poi generane una nuova e aggiorna ogni strumento che la usava.

### Dove trovo l'Issuer ID e il Key ID?

In App Store Connect, menu Users and Access, scheda Integrations. L'Issuer ID compare in alto nella pagina. Il Key ID è nell'elenco delle chiavi attive. Una chiave individuale non usa l'Issuer ID.

### Che ruolo dare a una chiave usata da Expo?

La guida di Expo assegna il ruolo Admin. Secondo la tabella dei ruoli di Apple, App Manager basta per inviare build e creare certificati e profili. È il ruolo della mia chiave, usata per le mie build Expo.

### Si può cambiare il ruolo di una chiave API?

No. Apple non permette di modificare né il nome né il ruolo di una chiave dopo la creazione. Revocala, poi generane una nuova con il ruolo giusto.

### Una chiave API App Store Connect scade?

Le pagine di Apple non parlano di nessuna scadenza della chiave, solo della sua revoca. Sono i token firmati con la chiave a scadere, dopo al massimo 20 minuti per la maggior parte delle richieste.


## Il tuo progetto

[Review Kit](https://devoria.fr/it/kits/app-review): La mia checklist per la review dell'App Store, i rifiuti di Apple che ho risolto, quella di Google Play e tre skill per Claude Code. 49 €.

[iOS & Android Kit](https://devoria.fr/it/kits/ios): Crea la tua app iPhone e Android con Claude Code: il codice di partenza delle mie app, il percorso fino agli store e tutti i kit. 99 €.

[Diagnosi: cosa ti separa dalla tua app per iPhone](https://devoria.fr/it/diagnostic): 7 domande, 60 secondi: scopri cosa ti blocca davvero nel pubblicare la tua app per iPhone, il tuo percorso in 4 tappe e il kit giusto per te.
