Clé API App Store Connect (.p8) : la créer et l'utiliser
Par Mehdi Azizi
Publié le , 10 min
La clé API App Store Connect (.p8) se télécharge une seule fois. Rôle, Issuer ID, Key ID, révocation, et son usage avec Expo, fastlane ou un script.
Une clé API App Store Connect permet à un outil, comme EAS, fastlane, RevenueCat ou ton propre script, d'agir sur ton compte sans ton mot de passe ni la double authentification. Apple garde la moitié publique de la clé, et tu télécharges la moitié privée, un fichier .p8, une seule fois. Avec ce fichier, l'Issuer ID et le Key ID, tu signes des jetons valables 20 minutes au plus pour la plupart des requêtes.
Je publie mes apps iOS, dont TradaZen et Nolera, avec Expo. Une clé d'équipe au rôle App Manager sert à RevenueCat, à mes builds Expo et à un outil en ligne de commande qui édite mes fiches. Ce guide suit les pages d'Apple, d'Expo et de fastlane relues le 3 novembre 2026. Ne la confonds pas avec les clés de services glissées dans le code d'une app : celles-là sont traitées dans clé API secrète dans une app Expo.
Ce que fait une clé API App Store Connect
D'après la documentation d'Apple, l'API App Store Connect exige un jeton JWT pour chaque requête. Tu le génères et tu le signes avec ta clé privée. La clé sert uniquement à cette API : tu ne peux pas l'utiliser pour d'autres services d'Apple.
Son intérêt tient en une phrase : aucune personne n'a besoin de valider la connexion. Ton identifiant Apple bute sur la double authentification, ce qui bloque toute automatisation. Le guide EAS Submit iOS montre ce que ça change pour l'envoi d'une app Expo.
Avant tout : demander l'accès à l'API
La première clé ne se crée pas d'emblée. L'aide d'App Store Connect est claire : l'Account Holder doit d'abord demander l'accès à l'API. Il ouvre Users and Access, clique sur Integrations, puis sur Request Access. Apple examine la demande au cas par cas.
L'Account Holder est la personne qui a inscrit le compte. Si tu débutes, c'est toi : le guide compte développeur Apple détaille l'inscription.
Clé d'équipe ou clé individuelle
Apple propose deux types de clés. Voici leurs différences, relevées sur la documentation et l'aide d'App Store Connect :
| Critère | Clé d'équipe | Clé individuelle |
|---|---|---|
| Qui peut la générer | Account Holder ou Admin | Presque tout utilisateur |
| Apps accessibles | Toutes, sans exception | Celles de l'utilisateur |
| Droits | Le rôle choisi | Ceux de l'utilisateur |
| Nombre de clés | Plusieurs | Une active par personne |
| Certificats et profils | Oui, selon le rôle | Non |
| Ventes, finances, notaryTool | Selon le rôle | Non |
| Champ du jeton | iss = Issuer ID | sub = user |
« Presque tout utilisateur » veut dire, selon Apple : Account Holder, Admin, App Manager, Customer Support, Developer et Marketing, sauf si un Admin ou l'Account Holder leur a retiré le droit de générer une clé individuelle.
Pour Expo ou fastlane, choisis une clé d'équipe. Une clé individuelle n'a pas accès aux points d'entrée de provisionnement, ceux qui créent certificats et profils. La documentation de fastlane le confirme : les clés d'équipe sont requises pour tout accès lié au provisionnement.
Quel rôle donner à ta clé
Une clé d'équipe accède à toutes les apps du compte, quel que soit son rôle. Le rôle décide de ce qu'elle peut faire. Apple prévient qu'une clé Admin peut créer et supprimer des utilisateurs : donne le plus petit rôle qui couvre ton usage. Les droits ci-dessous viennent du tableau des rôles d'Apple.
| Usage de la clé | Rôles qui le permettent |
|---|---|
| Envoyer des builds | Admin, App Manager, Developer |
| Gérer les builds TestFlight | Admin, App Manager |
| Créer certificats et profils | Admin, App Manager |
| Envoyer une app en revue | Admin, App Manager |
| Importer produits et prix (RevenueCat) | App Manager au minimum |
| Générer d'autres clés d'équipe | Admin |
La ligne RevenueCat vient de sa documentation. Le guide d'Expo, lui, donne le rôle Admin à la clé. Sur mes apps, le rôle App Manager suffit : EAS crée les profils de distribution avec, et RevenueCat importe les produits.
Une fois la clé générée, tu ne peux plus modifier ni son nom ni son rôle. Pour changer, il faut la révoquer et en générer une autre.
Créer une clé d'équipe, pas à pas
Il faut un compte Admin ou Account Holder. D'après Apple :
- Ouvre Users and Access, puis l'onglet Integrations.
- Choisis App Store Connect API dans la colonne de gauche, puis l'onglet Team Keys.
- Clique sur Generate API Key, ou sur le bouton +.
- Donne un nom à la clé. Il ne sert qu'à toi, il ne fait pas partie de la clé. Nomme-la d'après l'outil qui l'utilisera.
- Choisis le rôle sous Access, puis clique sur Generate.
- Télécharge la clé privée avec le lien Download API Key.
Le lien de téléchargement disparaît dès que tu as téléchargé le fichier, et Apple n'en garde aucune copie. Range le
.p8avant de fermer la page.
Note ensuite les deux identifiants. Selon la page d'Apple sur les jetons, l'Issuer ID s'affiche en haut de la page Integrations, avec un bouton Copy. Le Key ID apparaît dans la liste des clés actives : survole-le pour faire apparaître Copy Key ID. L'Issuer ID est le même pour toutes les clés d'équipe du compte. Le Key ID est propre à chaque clé.
Pour une clé individuelle, c'est plus court : ouvre ton profil d'utilisateur, descends jusqu'à Individual API Key et clique sur Generate API Key. Le téléchargement est, là aussi, unique.
Ranger le fichier .p8
Apple demande de traiter la clé comme un mot de passe : ne la partage pas, ne la range pas dans un dépôt de code, ne l'intègre jamais au code d'une app. Ma routine :
- Un dossier hors du projet, ou le gestionnaire de secrets de ton outil d'intégration continue.
- Le dossier des clés dans ton
.gitignore, si le fichier doit vivre dans le projet le temps d'un envoi. - Des droits stricts. Un outil en ligne de commande pour App Store Connect a refusé mon
.p8tant que le fichier restait lisible par d'autres comptes. Unchmod 600a réglé le problème. - Une clé par outil. Apple permet de générer plusieurs clés, avec les rôles de ton choix.
Ce dernier point, je ne l'ai pas appliqué au départ. Ma clé App Manager sert à la fois à RevenueCat, à mes builds et à mon outil de fiches. Si je dois la révoquer, trois outils tombent ensemble. Si c'était à refaire, je créerais une clé par outil, pour pouvoir en couper une sans toucher aux autres.
L'utiliser avec Expo
Trois façons de donner la clé à EAS :
- La laisser gérer par EAS.
eas credentials --platform iospeut créer une clé et la garder sur les serveurs d'Expo. C'est le chemin le plus simple. - La déclarer dans
eas.json. Le profilsubmitaccepteascApiKeyPath,ascApiKeyIssuerIdetascApiKeyId. D'après la référence d'eas.json, ces champs acceptent des variables d'environnement, comme$ASC_API_KEY_PATH. - La passer par l'environnement. Le dépôt d'EAS CLI documente
EXPO_ASC_API_KEY_PATH,EXPO_ASC_KEY_IDetEXPO_ASC_ISSUER_ID. Pour une clé individuelle, on omet l'Issuer ID.
Une limite à connaître pour les builds : Expo précise que l'API officielle ne sait pas rattacher un App Group, un Merchant ID ou un conteneur CloudKit. Il faut alors une connexion avec ton identifiant Apple, en local. Je l'ai vécu sur Nolera avec le groupe d'apps de son widget : la clé activait la capacité, sans rattacher le groupe. J'ai fait ce rattachement dans le portail développeur d'Apple. Si la synchronisation des capacités bloque, EXPO_NO_CAPABILITY_SYNC=1 la désactive, et tu actives la capacité toi‑même sur l'identifiant d'app. La signature des builds est détaillée dans certificat et provisioning profile iOS.
L'utiliser avec fastlane
fastlane lit la clé depuis un fichier JSON. Les champs key_id, issuer_id et key, le contenu du .p8, sont obligatoires. duration et in_house sont facultatifs. Valeurs factices :
{
"key_id": "XXXXXXXXXX",
"issuer_id": "ton-issuer-id",
"key": "-----BEGIN PRIVATE KEY-----\nMIGT...\n-----END PRIVATE KEY-----",
"duration": 1200,
"in_house": false
}
Tu passes ensuite ce fichier à une action, par exemple fastlane pilot distribute --api_key_path fastlane/cle.json. Dans un Fastfile, l'action app_store_connect_api_key prend key_id, issuer_id et key_filepath. La durée de session ne dépasse pas 1 200 secondes, soit 20 minutes. Toutes les actions ne la prennent pas en charge : fastlane signale par exemple que produce et pem ne fonctionnent pas avec une clé API.
L'utiliser dans ton propre script
Sans outil, tu fabriques le jeton toi‑même. Apple fixe la recette :
- En-tête :
algvautES256,kidvaut ton Key ID,typvautJWT. - Contenu, clé d'équipe :
iss, ton Issuer ID ;iat, l'heure de création ;exp, l'heure d'expiration ;aud, qui vautappstoreconnect-v1. - Contenu, clé individuelle :
subvautuserà la place deiss. - Durée : au-delà de 20 minutes, Apple rejette le jeton pour la plupart des requêtes.
En Python, avec la bibliothèque PyJWT et sa dépendance cryptographique, installée par pip install pyjwt[crypto] selon sa documentation. Dans le terminal du Mac, mets des guillemets : pip install "pyjwt[crypto]", sinon zsh refuse les crochets.
import time
import jwt
KEY_ID = "XXXXXXXXXX"
ISSUER_ID = "ton-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)
Puis tu l'envoies dans l'en-tête Authorization, comme dans l'exemple d'Apple :
curl -H "Authorization: Bearer $TOKEN" "https://api.appstoreconnect.apple.com/v1/apps"
J'ai exécuté ce script le 3 novembre 2026 avec une clé jetable générée sur ma machine : l'en-tête et le contenu du jeton correspondent à la page d'Apple, et la signature ES256 se vérifie. Je ne l'ai pas envoyé à l'API d'Apple avec cette clé de test, qui n'existe pas chez Apple. Réutilise le même jeton tant qu'il est valable : Apple le conseille pour de meilleures performances.
Révoquer une clé
Révoque une clé dès qu'elle est perdue, compromise, ou qu'un outil ne s'en sert plus. D'après l'aide d'App Store Connect, avec un compte Account Holder ou Admin :
- Ouvre Users and Access, puis Integrations.
- Choisis Team Keys, ou Individual Keys, puis clique sur Edit.
- Coche les clés à révoquer, puis Revoke Key.
- Confirme avec Revoke.
Une clé révoquée ne se réactive jamais. Apple l'affiche 30 jours sous Revoked. Chaque outil qui l'utilisait échoue alors à l'authentification. Avec Expo, le message est « App Store Connect rejected the API authentication credentials ». Ce message et les autres échecs d'envoi sont expliqués dans les erreurs d'envoi avec EAS et leur correction. Si la clé n'est pas compromise, prépare la nouvelle avant de couper l'ancienne. Si elle l'est, Apple demande de la révoquer immédiatement.
Pour ta propre clé individuelle : ton profil, Individual API Key, puis Revoke.
Ma check-list de la clé .p8
- L'Account Holder a demandé l'accès à l'API.
- La clé est une clé d'équipe si elle sert aux builds ou aux profils.
- Son rôle est le plus petit qui couvre l'usage, et son nom dit quel outil l'utilise.
- Le
.p8est rangé hors du dépôt, avec des droits stricts et une copie de secours chiffrée. - L'Issuer ID et le Key ID sont notés à côté, sans le fichier.
- Chaque outil a sa clé, pour pouvoir en révoquer une seule.
Automatiser ta publication sans y laisser ta clé
La clé n'est qu'une pièce du parcours. Le Kit iOS part du code de départ de mes apps, abonnements compris, et suit quatre étapes jusqu'à l'App Store, à ton rythme. Si tu branches RevenueCat avec cette clé, le montage complet est dans RevenueCat et l'abonnement in-app iOS.
Si tu prépares ta première sortie, fais ton diagnostic gratuit : il te dit ce qui te bloque vraiment et t'envoie ma checklist anti-refus Apple. La page publier une application sur l'App Store reprend chaque étape, de la fiche à la validation.
Questions fréquentes
Comment créer une clé API App Store Connect ?
L'Account Holder demande d'abord l'accès à l'API. Ensuite, un Admin ouvre Users and Access, onglet Integrations, App Store Connect API, Team Keys. Il clique sur Generate API Key, choisit un nom et un rôle, génère la clé, puis télécharge le fichier .p8.
Peut-on retélécharger une clé .p8 perdue ?
Non. Le fichier se télécharge une seule fois, et Apple n'en garde aucune copie. Révoque la clé perdue, puis génères-en une nouvelle et mets à jour chaque outil qui s'en servait.
Où trouver l'Issuer ID et le Key ID ?
Dans App Store Connect, menu Users and Access, onglet Integrations. L'Issuer ID s'affiche en haut de la page. Le Key ID figure dans la liste des clés actives. Une clé individuelle n'utilise pas d'Issuer ID.
Quel rôle donner à une clé utilisée par Expo ?
Le guide d'Expo donne le rôle Admin. D'après le tableau des rôles d'Apple, App Manager suffit pour envoyer des builds et créer certificats et profils. C'est le rôle de ma clé, utilisée pour mes builds Expo.
Peut-on changer le rôle d'une clé API ?
Non. Apple ne permet de modifier ni le nom ni le rôle d'une clé après sa création. Révoque-la, puis génères-en une nouvelle avec le bon rôle.
Une clé API App Store Connect expire-t-elle ?
Les pages d'Apple ne mentionnent aucune expiration de la clé, seulement sa révocation. Ce sont les jetons signés avec elle qui expirent, au bout de 20 minutes au plus pour la plupart des requêtes.

