# App Store Connect API ključ (.p8): izrada i korištenje

> App Store Connect API ključ (.p8) preuzimaš samo jednom. Uloga, Issuer ID, Key ID, opoziv i korištenje s Expoom, fastlaneom ili vlastitom skriptom.

Izvorna stranica: [App Store Connect API ključ (.p8): izrada i korištenje](https://devoria.fr/hr/blog/app-store-connect-api-kljuc-p8)
Autor: [Mehdi Azizi](https://devoria.fr/hr/mehdi-azizi)
Objavljeno: 2026-11-04
Zadnja revizija sadržaja: 2026-11-04


App Store Connect API ključ omogućuje alatu, poput EAS-a, fastlanea, RevenueCata ili tvoje vlastite skripte, da radi na tvom računu bez tvoje lozinke i bez dvofaktorske autentifikacije. **Apple čuva javnu polovicu ključa, a ti privatnu polovicu, datoteku `.p8`, preuzimaš samo jednom.** S tom datotekom, Issuer ID-jem i Key ID-jem potpisuješ tokene koji za većinu zahtjeva vrijede najviše 20 minuta.

Svoje iOS aplikacije, među njima TradaZen i Nolera, objavljujem s Expoom. Timski ključ s ulogom App Manager koristim za RevenueCat, za Expo buildove i za alat naredbenog retka koji uređuje moje stranice aplikacija. Ovaj vodič prati stranice Applea, Expoa i fastlanea koje sam ponovno pročitao 3. studenoga 2026. Ne brkaj ga s ključevima servisa ubačenima u kod aplikacije: o njima piše u članku [tajni API ključ u Expo aplikaciji](https://devoria.fr/hr/blog/tajni-api-kljuc-expo-aplikacija).

## Čemu služi App Store Connect API ključ

Prema [Appleovoj dokumentaciji](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), App Store Connect API traži JWT token za svaki zahtjev. Generiraš ga i potpisuješ svojim privatnim ključem. Ključ služi isključivo za taj API: ne možeš ga koristiti za druge Appleove servise.

Njegova prednost stane u jednu rečenicu: **nitko ne mora odobriti prijavu.** Tvoj Apple ID zapinje na dvofaktorskoj autentifikaciji, što blokira svaku automatizaciju. Vodič [EAS Submit za iOS](https://devoria.fr/hr/blog/eas-submit-ios-objava-expo-aplikacije-app-store) pokazuje što to mijenja kod slanja Expo aplikacije.

## Prije svega: zatraži pristup API-ju

Prvi ključ ne možeš napraviti odmah. [Pomoć za App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api) je jasna: **Account Holder najprije mora zatražiti pristup API-ju.** Otvori Users and Access, klikne na Integrations, pa na Request Access. Apple zahtjev razmatra pojedinačno.

Account Holder je osoba koja je registrirala račun. Ako tek počinješ, to si ti: vodič [Apple developerski račun](https://devoria.fr/hr/blog/apple-developer-racun-cijena) detaljno opisuje registraciju.

## Timski ili individualni ključ

Apple nudi dvije vrste ključeva. Evo razlika, prema [dokumentaciji](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) i [pomoći za App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api):

| Kriterij                       | Timski ključ             | Individualni ključ     |
| ------------------------------ | ------------------------ | ---------------------- |
| Tko ga može generirati         | Account Holder ili Admin | Gotovo svaki korisnik  |
| Dostupne aplikacije            | Sve, bez iznimke         | One koje korisnik vidi |
| Prava                          | Odabrana uloga           | Prava korisnika        |
| Broj ključeva                  | Više njih                | Jedan aktivan po osobi |
| Certifikati i profili          | Da, ovisno o ulozi       | Ne                     |
| Prodaja, financije, notaryTool | Ovisno o ulozi           | Ne                     |
| Polje tokena                   | `iss` = Issuer ID        | `sub` = `user`         |

„Gotovo svaki korisnik” prema Appleu znači: Account Holder, Admin, App Manager, Customer Support, Developer i Marketing, osim ako im Admin ili Account Holder nije oduzeo pravo generiranja individualnog ključa.

**Za Expo ili fastlane odaberi timski ključ.** Individualni ključ nema pristup endpointima za provisioning, onima koji izrađuju certifikate i profile. [Dokumentacija fastlanea](https://docs.fastlane.tools/app-store-connect-api/) to potvrđuje: timski ključevi su obavezni za svaki pristup vezan uz provisioning.

## Koju ulogu dati ključu

Timski ključ ima pristup svim aplikacijama na računu, bez obzira na ulogu. Uloga određuje što smije raditi. **Apple upozorava da Admin ključ može stvarati i brisati korisnike**: daj najmanju ulogu koja pokriva tvoju upotrebu. Prava u nastavku dolaze iz [Appleove tablice uloga](https://developer.apple.com/help/account/access/roles/).

| Upotreba ključa                      | Uloge koje to dopuštaju       |
| ------------------------------------ | ----------------------------- |
| Slanje buildova                      | Admin, App Manager, Developer |
| Upravljanje TestFlight buildovima    | Admin, App Manager            |
| Izrada certifikata i profila         | Admin, App Manager            |
| Slanje aplikacije na pregled         | Admin, App Manager            |
| Uvoz proizvoda i cijena (RevenueCat) | Najmanje App Manager          |
| Generiranje drugih timskih ključeva  | Admin                         |

Redak za RevenueCat dolazi iz [njegove dokumentacije](https://www.revenuecat.com/docs/service-credentials/itunesconnect-app-specific-shared-secret/app-store-connect-api-key-configuration). Expoov vodič pak ključu [daje ulogu Admin](https://github.com/expo/fyi/blob/main/creating-asc-api-key.md). Na mojim aplikacijama dovoljna je uloga App Manager: EAS s njom izrađuje distribucijske profile, a RevenueCat uvozi proizvode.

Kad generiraš ključ, [više mu ne možeš promijeniti ni ime ni ulogu](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api). Za promjenu ga moraš opozvati i generirati novi.

## Izrada timskog ključa, korak po korak

Treba ti Admin ili Account Holder račun. Prema [Appleu](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api):

1. **Otvori Users and Access**, pa karticu Integrations.
2. **Odaberi App Store Connect API** u lijevom stupcu, pa karticu Team Keys.
3. **Klikni na Generate API Key** ili na gumb +.
4. **Daj ključu ime.** Služi samo tebi, nije dio ključa. Nazovi ga po alatu koji će ga koristiti.
5. **Odaberi ulogu** pod Access, pa klikni na Generate.
6. **Preuzmi privatni ključ** putem poveznice Download API Key.

> Poveznica za preuzimanje nestaje čim preuzmeš datoteku, a Apple ne čuva nikakvu kopiju. Spremi `.p8` prije nego zatvoriš stranicu.

Zatim zapiši oba identifikatora. Prema [Appleovoj stranici o tokenima](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests), **Issuer ID prikazuje se na vrhu stranice Integrations**, s gumbom Copy. Key ID se pojavljuje na popisu aktivnih ključeva: prijeđi mišem preko njega da se pojavi Copy Key ID. Issuer ID je isti za sve timske ključeve na računu. Key ID je jedinstven za svaki ključ.

Za individualni ključ postupak je kraći: otvori svoj korisnički profil, spusti se do Individual API Key i klikni na Generate API Key. I ovdje se preuzima samo jednom.

## Gdje držati datoteku .p8

Apple traži da ključ tretiraš kao lozinku: **ne dijeli ga, ne stavljaj ga u repozitorij koda i nikad ga ne ugrađuj u kod aplikacije.** Moja rutina:

- **Mapa izvan projekta**, ili upravitelj tajni tvog CI alata.
- **Mapa s ključevima u tvom `.gitignore`**, ako datoteka mora biti u projektu tijekom slanja.
- **Stroga prava pristupa.** Jedan alat naredbenog retka za App Store Connect odbijao je moj `.p8` dok su ga mogli čitati drugi korisnički računi. `chmod 600` riješio je problem.
- **Jedan ključ po alatu.** Apple dopušta [generiranje više ključeva](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api), s ulogama po tvom izboru.

Ovo zadnje na početku nisam primijenio. Moj App Manager ključ služi istovremeno za RevenueCat, za buildove i za alat za stranice aplikacija. Ako ga moram opozvati, padaju sva tri alata odjednom. **Da mogu ponovno, napravio bih jedan ključ po alatu**, kako bih mogao isključiti jedan bez diranja ostalih.

## Korištenje s Expoom

Tri načina da ključ predaš EAS-u:

- **Pusti EAS da njime upravlja.** `eas credentials --platform ios` može izraditi ključ i čuvati ga na Expoovim serverima. To je najjednostavniji put.
- **Navedi ga u `eas.json`.** Profil `submit` prihvaća `ascApiKeyPath`, `ascApiKeyIssuerId` i `ascApiKeyId`. Prema [referenci za eas.json](https://docs.expo.dev/eas/json/), ta polja prihvaćaju varijable okruženja, poput `$ASC_API_KEY_PATH`.
- **Predaj ga kroz okruženje.** [Repozitorij EAS CLI-ja](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/README.md) dokumentira `EXPO_ASC_API_KEY_PATH`, `EXPO_ASC_KEY_ID` i `EXPO_ASC_ISSUER_ID`. Za individualni ključ izostavi Issuer ID.

Jedno ograničenje za buildove: [Expo navodi](https://docs.expo.dev/build-reference/ios-capabilities/) da službeni API ne zna povezati App Group, Merchant ID ili CloudKit kontejner. Tada ti treba lokalna prijava s Apple ID-jem. To mi se dogodilo na Noleri s grupom aplikacija za widget: ključ je aktivirao capability, ali nije povezao grupu. To povezivanje napravio sam na Appleovom developerskom portalu. **Ako sinkronizacija capabilityja zapne, `EXPO_NO_CAPABILITY_SYNC=1` je isključuje**, a capability sam aktiviraš na identifikatoru aplikacije. Potpisivanje buildova detaljno je opisano u članku [iOS certifikat i provisioning profile](https://devoria.fr/hr/blog/ios-developerski-certifikat-provisioning-profile-expo).

## Korištenje s fastlaneom

[fastlane](https://docs.fastlane.tools/app-store-connect-api/) čita ključ iz JSON datoteke. Polja `key_id`, `issuer_id` i `key`, sadržaj `.p8` datoteke, obavezna su. `duration` i `in_house` nisu obavezni. Izmišljene vrijednosti:

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

Tu datoteku zatim predaješ akciji, na primjer `fastlane pilot distribute --api_key_path fastlane/cle.json`. U Fastfileu akcija `app_store_connect_api_key` prima `key_id`, `issuer_id` i `key_filepath`. Trajanje sesije ne prelazi 1200 sekundi, odnosno 20 minuta. Ne podržavaju je sve akcije: fastlane, primjerice, navodi da `produce` i `pem` ne rade s API ključem.

## Korištenje u vlastitoj skripti

Bez alata, token izrađuješ sam. [Apple određuje recept](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests):

- **Zaglavlje**: `alg` je `ES256`, `kid` je tvoj Key ID, `typ` je `JWT`.
- **Sadržaj, timski ključ**: `iss`, tvoj Issuer ID; `iat`, vrijeme izrade; `exp`, vrijeme isteka; `aud`, s vrijednošću `appstoreconnect-v1`.
- **Sadržaj, individualni ključ**: `sub` s vrijednošću `user` umjesto `iss`.
- **Trajanje**: iznad 20 minuta Apple odbija token za većinu zahtjeva.

U Pythonu, s bibliotekom PyJWT i njenom kriptografskom ovisnošću, instaliranom naredbom `pip install pyjwt[crypto]` prema [njenoj dokumentaciji](https://pyjwt.readthedocs.io/en/stable/installation.html). U terminalu na Macu stavi navodnike: `pip install "pyjwt[crypto]"`, inače zsh odbija uglate zagrade.

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

Zatim ga šalješ u zaglavlju `Authorization`, kao u Appleovom primjeru:

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

Pokrenuo sam ovu skriptu 3. studenoga 2026. s jednokratnim ključem generiranim na svom računalu: zaglavlje i sadržaj tokena odgovaraju Appleovoj stranici, a ES256 potpis prolazi provjeru. Nisam ga poslao Appleovom API-ju s tim testnim ključem, koji kod Applea ne postoji. **Koristi isti token dok god vrijedi**: Apple to preporučuje radi boljih performansi.

## Opoziv ključa

Opozovi ključ čim se izgubi, bude kompromitiran ili ga neki alat više ne koristi. Prema [pomoći za App Store Connect](https://developer.apple.com/help/app-store-connect/get-started/app-store-connect-api), s Account Holder ili Admin računom:

1. Otvori Users and Access, pa Integrations.
2. Odaberi Team Keys ili Individual Keys, pa klikni na Edit.
3. Označi ključeve za opoziv, pa Revoke Key.
4. Potvrdi s Revoke.

**Opozvani ključ nikad se ne može ponovno aktivirati.** [Apple ga prikazuje](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) 30 dana pod Revoked. Svaki alat koji ga je koristio tada pada na autentifikaciji. S Expoom poruka glasi „[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)”. Ta poruka i druge greške pri slanju objašnjene su u članku [greške pri slanju s EAS-om i kako ih popraviti](https://devoria.fr/hr/blog/eas-submit-ios-greske-rjesenja). Ako ključ nije kompromitiran, pripremi novi prije nego isključiš stari. Ako jest, Apple traži da ga odmah opozoveš.

Za vlastiti individualni ključ: tvoj profil, Individual API Key, pa Revoke.

## Moja check-lista za .p8 ključ

- Account Holder je zatražio pristup API-ju.
- Ključ je timski ako služi za buildove ili profile.
- Uloga mu je najmanja koja pokriva upotrebu, a ime govori koji ga alat koristi.
- `.p8` je spremljen izvan repozitorija, sa strogim pravima i šifriranom sigurnosnom kopijom.
- Issuer ID i Key ID zapisani su odvojeno, bez datoteke.
- Svaki alat ima svoj ključ, kako bi se mogao opozvati samo jedan.

## Automatiziraj objavu, a da ne riskiraš ključ

Ključ je samo jedan dio puta. [iOS & Android Kit](https://devoria.fr/hr/kits/ios) kreće od početnog koda mojih aplikacija, uključujući pretplate, i vodi te kroz četiri koraka do App Storea, tvojim tempom. Ako s ovim ključem spajaš RevenueCat, cijela postavka je u članku [RevenueCat i in-app pretplata na iOS-u](https://devoria.fr/hr/blog/revenuecat-pretplata-ios-aplikacija).

Ako pripremaš prvo izdanje, [napravi besplatnu dijagnostiku](https://devoria.fr/hr/diagnostic): reći će ti što te stvarno koči i poslati ti moju check-listu protiv Appleovih odbijanja. Stranica [objava aplikacije na App Storeu](https://devoria.fr/hr/expertise/objava-aplikacije-na-app-store) prolazi kroz svaki korak, od stranice aplikacije do odobrenja.

## Česta pitanja

### Kako napraviti App Store Connect API ključ?

Account Holder najprije zatraži pristup API-ju. Zatim Admin otvori Users and Access, karticu Integrations, App Store Connect API, Team Keys. Klikne na Generate API Key, odabere ime i ulogu, generira ključ i preuzme datoteku `.p8`.

### Može li se izgubljeni .p8 ključ ponovno preuzeti?

Ne. Datoteka se preuzima samo jednom, a Apple ne čuva nikakvu kopiju. Opozovi izgubljeni ključ, generiraj novi i ažuriraj svaki alat koji ga je koristio.

### Gdje pronaći Issuer ID i Key ID?

U App Store Connectu, izbornik Users and Access, kartica Integrations. Issuer ID prikazuje se na vrhu stranice. Key ID nalazi se na popisu aktivnih ključeva. Individualni ključ ne koristi Issuer ID.

### Koju ulogu dati ključu koji koristi Expo?

Expoov vodič daje ulogu Admin. Prema Appleovoj tablici uloga, App Manager je dovoljan za slanje buildova i izradu certifikata i profila. To je uloga mog ključa, koji koristim za Expo buildove.

### Može li se promijeniti uloga API ključa?

Ne. Apple ne dopušta promjenu ni imena ni uloge ključa nakon izrade. Opozovi ga, pa generiraj novi s pravom ulogom.

### Istječe li App Store Connect API ključ?

Appleove stranice ne spominju nikakav istek ključa, samo njegov opoziv. Istječu tokeni potpisani njime, najkasnije nakon 20 minuta za većinu zahtjeva.


## Tvoj projekt

[Review Kit](https://devoria.fr/hr/kits/app-review): Moja checklista za App Store pregled, moja Appleova odbijanja i kako sam ih ispravio, checklista za Google Play i tri Claude Code skilla. 49 €.

[iOS & Android Kit](https://devoria.fr/hr/kits/ios): Napravi svoju iPhone i Android aplikaciju s Claude Codeom: početni kod mojih aplikacija, put do trgovina i svi kitovi. 99 €.

[Dijagnoza: što te dijeli od tvoje iPhone aplikacije](https://devoria.fr/hr/diagnostic): 7 pitanja, 60 sekundi: saznaj što te stvarno koči da objaviš svoju iPhone aplikaciju, dobij svoj put u 4 koraka i kit koji ti odgovara.
