App Store Connect API kľúč (.p8): vytvorenie a použitie
Autor: Mehdi Azizi
Zverejnené , 10 min
App Store Connect API kľúč (.p8) si stiahneš iba raz. Rola, Issuer ID, Key ID, zrušenie a použitie s Expo, fastlane alebo vlastným skriptom.
App Store Connect API kľúč umožňuje nástroju, ako je EAS, fastlane, RevenueCat alebo tvoj vlastný skript, pracovať s tvojím účtom bez hesla aj bez dvojfaktorového overenia. Apple si nechá verejnú polovicu kľúča a ty si súkromnú polovicu, súbor .p8, stiahneš iba raz. S týmto súborom, Issuer ID a Key ID podpisuješ tokeny, ktoré pri väčšine požiadaviek platia najviac 20 minút.
Svoje iOS appky, napríklad TradaZen a Nolera, publikujem cez Expo. Tímový kľúč s rolou App Manager používam pre RevenueCat, pre buildy v Expo a pre nástroj v príkazovom riadku, ktorým upravujem stránky appiek. Tento návod vychádza zo stránok Apple, Expo a fastlane, ktoré som prešiel 3. novembra 2026. Nezamieňaj si ho s kľúčmi služieb vloženými do kódu appky: tie rozoberám v článku tajný API kľúč v Expo appke.
Na čo slúži App Store Connect API kľúč
Podľa dokumentácie Apple vyžaduje App Store Connect API pri každej požiadavke JWT token. Vygeneruješ ho a podpíšeš svojím súkromným kľúčom. Kľúč slúži výhradne na toto API: na iné služby Apple ho použiť nemôžeš.
Jeho výhoda sa zmestí do jednej vety: prihlásenie nemusí potvrdzovať žiadny človek. Tvoje Apple ID narazí na dvojfaktorové overenie, a to zablokuje akúkoľvek automatizáciu. Návod EAS Submit pre iOS ukazuje, čo to mení pri odosielaní Expo appky.
Najprv: požiadaj o prístup k API
Prvý kľúč nevytvoríš hneď. Pomocník App Store Connect hovorí jasne: Account Holder musí najprv požiadať o prístup k API. Otvorí Users and Access, klikne na Integrations a potom na Request Access. Apple posudzuje každú žiadosť individuálne.
Account Holder je osoba, ktorá účet zaregistrovala. Ak začínaš, si to ty: návod Apple vývojársky účet popisuje registráciu.
Tímový alebo individuálny kľúč
Apple ponúka dva typy kľúčov. Tu sú rozdiely, ktoré som vyčítal z dokumentácie a pomocníka App Store Connect:
| Kritérium | Tímový kľúč | Individuálny kľúč |
|---|---|---|
| Kto ho môže vygenerovať | Account Holder alebo Admin | Takmer každý používateľ |
| Dostupné appky | Všetky, bez výnimky | Tie, ku ktorým má používateľ prístup |
| Oprávnenia | Zvolená rola | Oprávnenia používateľa |
| Počet kľúčov | Viac | Jeden aktívny na osobu |
| Certifikáty a profily | Áno, podľa roly | Nie |
| Predaje, financie, notaryTool | Podľa roly | Nie |
| Pole v tokene | iss = Issuer ID | sub = user |
„Takmer každý používateľ“ podľa Apple znamená: Account Holder, Admin, App Manager, Customer Support, Developer a Marketing, pokiaľ im Admin alebo Account Holder neodobral právo generovať individuálny kľúč.
Pre Expo alebo fastlane si vyber tímový kľúč. Individuálny kľúč nemá prístup k endpointom pre provisioning, teda k tým, ktoré vytvárajú certifikáty a profily. Dokumentácia fastlane to potvrdzuje: na akýkoľvek prístup súvisiaci s provisioningom sú potrebné tímové kľúče.
Akú rolu dať kľúču
Tímový kľúč má prístup ku všetkým appkám účtu bez ohľadu na rolu. Rola určuje, čo s nimi môže robiť. Apple upozorňuje, že kľúč s rolou Admin môže vytvárať a mazať používateľov: daj mu najnižšiu rolu, ktorá pokryje tvoje použitie. Oprávnenia nižšie pochádzajú z tabuľky rolí Apple.
| Použitie kľúča | Roly, ktoré to umožňujú |
|---|---|
| Odosielanie buildov | Admin, App Manager, Developer |
| Správa buildov v TestFlight | Admin, App Manager |
| Vytváranie certifikátov a profilov | Admin, App Manager |
| Odoslanie appky na kontrolu | Admin, App Manager |
| Import produktov a cien (RevenueCat) | Minimálne App Manager |
| Generovanie ďalších tímových kľúčov | Admin |
Riadok o RevenueCat pochádza z jeho dokumentácie. Návod Expo zase kľúču dáva rolu Admin. Pri mojich appkách stačí rola App Manager: EAS s ňou vytvára distribučné profily a RevenueCat importuje produkty.
Keď je kľúč vygenerovaný, už nemôžeš zmeniť jeho názov ani rolu. Ak chceš zmenu, musíš ho zrušiť a vygenerovať nový.
Vytvorenie tímového kľúča krok za krokom
Potrebuješ účet s rolou Admin alebo Account Holder. Podľa Apple:
- Otvor Users and Access a potom kartu Integrations.
- V ľavom stĺpci vyber App Store Connect API, potom kartu Team Keys.
- Klikni na Generate API Key alebo na tlačidlo +.
- Pomenuj kľúč. Názov slúži len tebe, nie je súčasťou kľúča. Pomenuj ho podľa nástroja, ktorý ho bude používať.
- Vyber rolu v časti Access a klikni na Generate.
- Stiahni súkromný kľúč cez odkaz Download API Key.
Odkaz na stiahnutie zmizne hneď, ako súbor stiahneš, a Apple si neuchováva žiadnu kópiu. Ulož si
.p8skôr, než stránku zavrieš.
Potom si zapíš oba identifikátory. Podľa stránky Apple o tokenoch sa Issuer ID zobrazuje hore na stránke Integrations, s tlačidlom Copy. Key ID nájdeš v zozname aktívnych kľúčov: prejdi naň myšou a objaví sa Copy Key ID. Issuer ID je rovnaké pre všetky tímové kľúče účtu. Key ID má každý kľúč vlastné.
Pri individuálnom kľúči je to kratšie: otvor svoj používateľský profil, zíď na Individual API Key a klikni na Generate API Key. Aj tu sa dá súbor stiahnuť iba raz.
Kam uložiť súbor .p8
Apple žiada, aby si s kľúčom zaobchádzal ako s heslom: nezdieľaj ho, neukladaj ho do repozitára a nikdy ho nevkladaj do kódu appky. Moja rutina:
- Priečinok mimo projektu alebo správca tajomstiev tvojho CI nástroja.
- Priečinok s kľúčmi v
.gitignore, ak musí súbor počas odosielania zostať v projekte. - Prísne práva. Jeden nástroj pre App Store Connect v príkazovom riadku odmietal môj
.p8, kým bol súbor čitateľný pre iné účty.chmod 600problém vyriešil. - Jeden kľúč na nástroj. Apple umožňuje vygenerovať viac kľúčov s rolami podľa tvojho výberu.
Ten posledný bod som na začiatku nedodržal. Môj kľúč App Manager slúži naraz pre RevenueCat, pre buildy aj pre nástroj na stránky appiek. Ak ho budem musieť zrušiť, padnú tri nástroje naraz. Keby som začínal znova, vytvoril by som jeden kľúč na každý nástroj, aby som mohol jeden vypnúť bez vplyvu na ostatné.
Použitie s Expo
Tri spôsoby, ako dať kľúč EAS:
- Nechať ho spravovať EAS.
eas credentials --platform iosvie vytvoriť kľúč a uchovávať ho na serveroch Expo. Je to najjednoduchšia cesta. - Uviesť ho v
eas.json. ProfilsubmitprijímaascApiKeyPath,ascApiKeyIssuerIdaascApiKeyId. Podľa referencie eas.json tieto polia prijímajú premenné prostredia, napríklad$ASC_API_KEY_PATH. - Odovzdať ho cez prostredie. Repozitár EAS CLI dokumentuje
EXPO_ASC_API_KEY_PATH,EXPO_ASC_KEY_IDaEXPO_ASC_ISSUER_ID. Pri individuálnom kľúči Issuer ID vynecháš.
Jedno obmedzenie pri buildoch: Expo upresňuje, že oficiálne API nevie priradiť App Group, Merchant ID ani CloudKit kontajner. Vtedy sa musíš prihlásiť svojím Apple ID, lokálne. Zažil som to pri Nolere so skupinou appiek pre jej widget: kľúč schopnosť zapol, ale skupinu nepriradil. Priradenie som urobil na vývojárskom portáli Apple. Ak synchronizácia schopností zlyháva, EXPO_NO_CAPABILITY_SYNC=1 ju vypne a schopnosť zapneš na identifikátore appky sám. Podpisovanie buildov podrobne popisujem v článku certifikát a provisioning profile pre iOS.
Použitie s fastlane
fastlane číta kľúč zo súboru JSON. Polia key_id, issuer_id a key (obsah súboru .p8) sú povinné. duration a in_house sú voliteľné. Fiktívne hodnoty:
{
"key_id": "XXXXXXXXXX",
"issuer_id": "tvoje-issuer-id",
"key": "-----BEGIN PRIVATE KEY-----\nMIGT...\n-----END PRIVATE KEY-----",
"duration": 1200,
"in_house": false
}
Tento súbor potom odovzdáš akcii, napríklad fastlane pilot distribute --api_key_path fastlane/cle.json. Vo Fastfile akcia app_store_connect_api_key prijíma key_id, issuer_id a key_filepath. Dĺžka relácie nepresiahne 1 200 sekúnd, teda 20 minút. Nie všetky akcie to podporujú: fastlane napríklad uvádza, že produce a pem s API kľúčom nefungujú.
Použitie vo vlastnom skripte
Bez nástroja si token vyrobíš sám. Apple určuje postup:
- Hlavička:
algjeES256,kidje tvoje Key ID,typjeJWT. - Obsah, tímový kľúč:
iss, tvoje Issuer ID;iat, čas vytvorenia;exp, čas vypršania;auds hodnotouappstoreconnect-v1. - Obsah, individuálny kľúč:
subs hodnotouusernamiestoiss. - Platnosť: nad 20 minút Apple token pri väčšine požiadaviek odmietne.
V Pythone s knižnicou PyJWT a jej kryptografickou závislosťou, ktorú podľa jej dokumentácie nainštaluješ cez pip install pyjwt[crypto]. V termináli na Macu použi úvodzovky: pip install "pyjwt[crypto]", inak zsh hranaté zátvorky odmietne.
import time
import jwt
KEY_ID = "XXXXXXXXXX"
ISSUER_ID = "tvoje-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)
Potom ho pošleš v hlavičke Authorization, ako v príklade od Apple:
curl -H "Authorization: Bearer $TOKEN" "https://api.appstoreconnect.apple.com/v1/apps"
Tento skript som spustil 3. novembra 2026 s jednorazovým kľúčom vygenerovaným na mojom počítači: hlavička aj obsah tokenu zodpovedajú stránke Apple a podpis ES256 sa dá overiť. Na API Apple som ho s týmto testovacím kľúčom neposlal, pretože u Apple neexistuje. Kým je token platný, používaj ten istý: Apple to odporúča kvôli lepšiemu výkonu.
Zrušenie kľúča
Zruš kľúč hneď, ako sa stratí, je kompromitovaný alebo ho už nejaký nástroj nepoužíva. Podľa pomocníka App Store Connect, s účtom Account Holder alebo Admin:
- Otvor Users and Access a potom Integrations.
- Vyber Team Keys alebo Individual Keys a klikni na Edit.
- Označ kľúče na zrušenie a potom Revoke Key.
- Potvrď cez Revoke.
Zrušený kľúč sa už nikdy nedá znovu aktivovať. Apple ho zobrazuje 30 dní v časti Revoked. Každý nástroj, ktorý ho používal, potom zlyhá pri overení. Pri Expo je hláška „App Store Connect rejected the API authentication credentials“. Túto hlášku aj ďalšie chyby pri odosielaní vysvetľujem v článku chyby pri odosielaní cez EAS a ich riešenie. Ak kľúč nie je kompromitovaný, priprav nový skôr, než starý vypneš. Ak je, Apple žiada zrušiť ho okamžite.
Pre tvoj vlastný individuálny kľúč: tvoj profil, Individual API Key a potom Revoke.
Môj checklist pre kľúč .p8
- Account Holder požiadal o prístup k API.
- Kľúč je tímový, ak slúži na buildy alebo profily.
- Jeho rola je najnižšia, ktorá pokryje použitie, a z názvu je jasné, ktorý nástroj ho používa.
.p8je uložený mimo repozitára, s prísnymi právami a so šifrovanou zálohou.- Issuer ID a Key ID sú zapísané bokom, bez súboru.
- Každý nástroj má svoj kľúč, aby sa dal zrušiť len jeden.
Automatizuj publikovanie bez rizika pre kľúč
Kľúč je len jeden diel celej cesty. iOS & Android Kit vychádza zo štartovacieho kódu mojich appiek vrátane predplatného a vedie ťa štyrmi krokmi až do App Store, tvojím tempom. Ak cez tento kľúč napájaš RevenueCat, kompletné nastavenie nájdeš v článku RevenueCat a in-app predplatné v iOS.
Ak chystáš svoje prvé vydanie, sprav si bezplatnú diagnostiku: povie ti, čo ťa naozaj brzdí, a pošle ti môj checklist proti zamietnutiu od Apple. Stránka publikovanie aplikácie v App Store prechádza každý krok, od stránky appky až po schválenie.
Často kladené otázky
Ako vytvoriť App Store Connect API kľúč?
Account Holder najprv požiada o prístup k API. Potom Admin otvorí Users and Access, kartu Integrations, App Store Connect API, Team Keys. Klikne na Generate API Key, zvolí názov a rolu, vygeneruje kľúč a stiahne súbor .p8.
Dá sa stratený kľúč .p8 stiahnuť znova?
Nie. Súbor sa dá stiahnuť iba raz a Apple si neuchováva žiadnu kópiu. Stratený kľúč zruš, vygeneruj nový a aktualizuj každý nástroj, ktorý ho používal.
Kde nájdem Issuer ID a Key ID?
V App Store Connect, v menu Users and Access, na karte Integrations. Issuer ID sa zobrazuje hore na stránke. Key ID je v zozname aktívnych kľúčov. Individuálny kľúč Issuer ID nepoužíva.
Akú rolu dať kľúču, ktorý používa Expo?
Návod Expo uvádza rolu Admin. Podľa tabuľky rolí Apple stačí App Manager na odosielanie buildov a vytváranie certifikátov a profilov. Túto rolu má môj kľúč, ktorý používam na buildy v Expo.
Dá sa zmeniť rola API kľúča?
Nie. Apple po vytvorení nedovolí zmeniť názov ani rolu kľúča. Zruš ho a vygeneruj nový so správnou rolou.
Vyprší App Store Connect API kľúč?
Stránky Apple neuvádzajú žiadne vypršanie kľúča, iba jeho zrušenie. Vypršia tokeny, ktoré ním podpíšeš, a to pri väčšine požiadaviek najneskôr po 20 minútach.

