Ключ API App Store Connect (.p8): створення і використання
Автор: Mehdi Azizi
Опубліковано , 10 хв
Ключ API App Store Connect (.p8) можна завантажити лише один раз. Роль, Issuer ID, Key ID, відкликання і використання з Expo, fastlane або скриптом.
Ключ API App Store Connect дає змогу інструменту, як-от EAS, fastlane, RevenueCat або твоєму власному скрипту, працювати з твоїм акаунтом без пароля і без двофакторної автентифікації. Apple зберігає публічну половину ключа, а приватну половину, файл .p8, ти завантажуєш лише один раз. З цим файлом, Issuer ID і Key ID ти підписуєш токени, які для більшості запитів діють не довше 20 хвилин.
Я публікую свої iOS-застосунки, зокрема TradaZen і Nolera, через Expo. Один командний ключ із роллю App Manager у мене працює для RevenueCat, для збірок Expo і для інструмента командного рядка, яким я редагую свої сторінки в App Store. Цей гайд спирається на сторінки Apple, Expo і fastlane, які я перечитав 3 листопада 2026 року. Не плутай його з ключами сервісів, вшитими в код застосунку: про них ідеться в статті секретний ключ API у застосунку Expo.
Що робить ключ API App Store Connect
Згідно з документацією Apple, API App Store Connect вимагає JWT-токен для кожного запиту. Ти генеруєш його і підписуєш своїм приватним ключем. Ключ працює тільки з цим API: для інших сервісів Apple його використати не можна.
Його користь вміщається в одне речення: нікому не треба підтверджувати вхід. Твій Apple ID упирається у двофакторну автентифікацію, і це блокує будь-яку автоматизацію. У гайді EAS Submit для iOS видно, що це змінює для відправки застосунку Expo.
Насамперед: запитати доступ до API
Перший ключ одразу не створиш. Довідка App Store Connect пише прямо: спершу Account Holder має запитати доступ до API. Він відкриває Users and Access, натискає Integrations, потім Request Access. Apple розглядає кожен запит окремо.
Account Holder це людина, яка зареєструвала акаунт. Якщо ти новачок, то це ти: реєстрацію детально описано в гайді акаунт розробника Apple.
Командний чи індивідуальний ключ
Apple пропонує два типи ключів. Ось різниця між ними за документацією і довідкою App Store Connect:
| Критерій | Командний ключ | Індивідуальний ключ |
|---|---|---|
| Хто може згенерувати | Account Holder або Admin | Майже будь-який користувач |
| Доступні застосунки | Усі, без винятку | Ті, що доступні користувачу |
| Права | Обрана роль | Права користувача |
| Кількість ключів | Кілька | Один активний на людину |
| Сертифікати й профілі | Так, залежно від ролі | Ні |
| Продажі, фінанси, notaryTool | Залежно від ролі | Ні |
| Поле токена | iss = Issuer ID | sub = user |
«Майже будь-який користувач», за словами Apple, означає: Account Holder, Admin, App Manager, Customer Support, Developer і Marketing, якщо тільки Admin або Account Holder не забрав у них право генерувати індивідуальний ключ.
Для Expo чи fastlane обирай командний ключ. Індивідуальний ключ не має доступу до ендпоінтів провізіонування, тих, що створюють сертифікати й профілі. Документація fastlane це підтверджує: для будь-якого доступу, пов'язаного з провізіонуванням, потрібні командні ключі.
Яку роль дати ключу
Командний ключ має доступ до всіх застосунків акаунта незалежно від ролі. Роль визначає, що він може робити. Apple попереджає, що ключ Admin може створювати й видаляти користувачів: давай найменшу роль, якої вистачає для твоїх задач. Права нижче взято з таблиці ролей Apple.
| Для чого ключ | Ролі, які це дозволяють |
|---|---|
| Відправляти збірки | Admin, App Manager, Developer |
| Керувати збірками TestFlight | Admin, App Manager |
| Створювати сертифікати й профілі | Admin, App Manager |
| Відправляти застосунок на перевірку | Admin, App Manager |
| Імпортувати продукти й ціни (RevenueCat) | Щонайменше App Manager |
| Генерувати інші командні ключі | Admin |
Рядок про RevenueCat узято з її документації. Гайд Expo натомість дає ключу роль Admin. На моїх застосунках вистачає ролі App Manager: EAS створює з нею профілі дистрибуції, а RevenueCat імпортує продукти.
Після генерації змінити ні назву, ні роль ключа вже не можна. Щоб змінити, доведеться відкликати його і згенерувати інший.
Створюємо командний ключ крок за кроком
Потрібен акаунт Admin або Account Holder. За Apple:
- Відкрий Users and Access, потім вкладку Integrations.
- Обери App Store Connect API у лівій колонці, потім вкладку Team Keys.
- Натисни Generate API Key або кнопку +.
- Дай ключу назву. Вона потрібна тільки тобі й не є частиною ключа. Назви його за інструментом, який його використовуватиме.
- Обери роль у розділі Access, потім натисни Generate.
- Завантаж приватний ключ за посиланням Download API Key.
Посилання для завантаження зникає, щойно ти завантажив файл, і Apple не зберігає жодної копії. Сховай
.p8, перш ніж закрити сторінку.
Потім запиши обидва ідентифікатори. Згідно з довідкою Apple про токени, Issuer ID показано вгорі сторінки Integrations, поруч із кнопкою Copy. Key ID видно в списку активних ключів: наведи на нього курсор, щоб з'явилася кнопка Copy Key ID. Issuer ID однаковий для всіх командних ключів акаунта. Key ID у кожного ключа свій.
З індивідуальним ключем усе коротше: відкрий свій профіль користувача, прокрути до Individual API Key і натисни Generate API Key. Завантаження тут теж одноразове.
Де зберігати файл .p8
Apple просить поводитися з ключем як із паролем: не ділися ним, не клади його в репозиторій коду, ніколи не вбудовуй його в код застосунку. Мій підхід:
- Окрема тека поза проєктом або менеджер секретів твого CI-інструмента.
- Тека з ключами в
.gitignore, якщо файл мусить полежати в проєкті на час відправки. - Суворі права доступу. Один інструмент командного рядка для App Store Connect відмовлявся приймати мій
.p8, поки файл був доступний для читання іншим обліковим записам.chmod 600розв'язав проблему. - Один ключ на інструмент. Apple дозволяє генерувати кілька ключів з ролями на твій вибір.
Останнього пункту я спочатку не дотримався. Мій ключ App Manager обслуговує водночас RevenueCat, мої збірки й інструмент для сторінок. Якщо доведеться його відкликати, впадуть одразу три інструменти. Якби робив усе наново, створив би окремий ключ для кожного інструмента, щоб вимикати один, не чіпаючи інших.
Використання з Expo
Є три способи передати ключ EAS:
- Довірити його EAS.
eas credentials --platform iosможе створити ключ і зберігати його на серверах Expo. Це найпростіший шлях. - Прописати його в
eas.json. ПрофільsubmitприймаєascApiKeyPath,ascApiKeyIssuerIdіascApiKeyId. Згідно з довідником eas.json, ці поля приймають змінні оточення, як-от$ASC_API_KEY_PATH. - Передати через оточення. Репозиторій EAS CLI документує
EXPO_ASC_API_KEY_PATH,EXPO_ASC_KEY_IDіEXPO_ASC_ISSUER_ID. Для індивідуального ключа Issuer ID не вказують.
Одне обмеження для збірок, про яке варто знати: Expo уточнює, що офіційне API не вміє прив'язувати App Group, Merchant ID чи контейнер CloudKit. Тоді потрібен вхід через твій Apple ID, локально. Я зіткнувся з цим у Nolera, з групою застосунків для її віджета: ключ увімкнув можливість, але групу не прив'язав. Цю прив'язку я зробив на порталі розробника Apple. Якщо синхронізація можливостей застрягає, EXPO_NO_CAPABILITY_SYNC=1 її вимикає, а можливість ти вмикаєш сам на ідентифікаторі застосунку. Підпис збірок детально описано в статті сертифікат і provisioning profile iOS.
Використання з fastlane
fastlane читає ключ із JSON-файлу. Поля key_id, issuer_id і key (вміст .p8) обов'язкові. duration і in_house необов'язкові. Вигадані значення:
{
"key_id": "XXXXXXXXXX",
"issuer_id": "your-issuer-id",
"key": "-----BEGIN PRIVATE KEY-----\nMIGT...\n-----END PRIVATE KEY-----",
"duration": 1200,
"in_house": false
}
Далі передаєш цей файл дії, наприклад fastlane pilot distribute --api_key_path fastlane/cle.json. У Fastfile дія app_store_connect_api_key приймає key_id, issuer_id і key_filepath. Тривалість сесії не перевищує 1200 секунд, тобто 20 хвилин. Не всі дії це підтримують: fastlane, наприклад, зазначає, що produce і pem не працюють з ключем API.
Використання у власному скрипті
Без інструмента токен робиш сам. Apple задає рецепт:
- Заголовок:
algдорівнюєES256,kidдорівнює твоєму Key ID,typдорівнюєJWT. - Вміст, командний ключ:
iss, твій Issuer ID;iat, час створення;exp, час закінчення дії;aud, що дорівнюєappstoreconnect-v1. - Вміст, індивідуальний ключ:
subдорівнюєuserзамістьiss. - Тривалість: якщо більше 20 хвилин, Apple відхиляє токен для більшості запитів.
На Python, з бібліотекою PyJWT і її криптографічною залежністю, яку встановлюють командою pip install pyjwt[crypto] за її документацією. У терміналі Mac бери в лапки: pip install "pyjwt[crypto]", інакше zsh не прийме квадратні дужки.
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)
Потім надсилаєш його в заголовку Authorization, як у прикладі Apple:
curl -H "Authorization: Bearer $TOKEN" "https://api.appstoreconnect.apple.com/v1/apps"
Я запустив цей скрипт 3 листопада 2026 року з одноразовим ключем, згенерованим на моєму комп'ютері: заголовок і вміст токена відповідають сторінці Apple, а підпис ES256 проходить перевірку. До API Apple я його з цим тестовим ключем не надсилав, бо в Apple такого ключа немає. Використовуй той самий токен, поки він дійсний: Apple радить так робити заради кращої продуктивності.
Відкликання ключа
Відкликай ключ, щойно його втрачено, скомпрометовано або якийсь інструмент ним більше не користується. Згідно з довідкою App Store Connect, з акаунтом Account Holder або Admin:
- Відкрий Users and Access, потім Integrations.
- Обери Team Keys або Individual Keys, потім натисни Edit.
- Познач ключі, які треба відкликати, потім Revoke Key.
- Підтвердь кнопкою Revoke.
Відкликаний ключ ніколи не відновлюється. Apple показує його 30 днів у розділі Revoked. Кожен інструмент, що ним користувався, після цього не проходить автентифікацію. В Expo повідомлення таке: «App Store Connect rejected the API authentication credentials». Це повідомлення та інші збої відправки пояснено в статті помилки відправки через EAS і як їх виправити. Якщо ключ не скомпрометовано, підготуй новий, перш ніж вимикати старий. Якщо скомпрометовано, Apple вимагає відкликати його негайно.
Для власного індивідуального ключа: твій профіль, Individual API Key, потім Revoke.
Мій чекліст для ключа .p8
- Account Holder запитав доступ до API.
- Ключ командний, якщо він потрібен для збірок або профілів.
- Його роль найменша з тих, що покривають задачу, а назва каже, який інструмент ним користується.
.p8лежить поза репозиторієм, із суворими правами доступу й зашифрованою резервною копією.- Issuer ID і Key ID записано окремо, без файлу.
- У кожного інструмента свій ключ, щоб можна було відкликати лише один.
Автоматизуй публікацію, не ризикуючи ключем
Ключ це лише одна частина шляху. iOS & Android Kit стартує з базового коду моїх застосунків, разом із підписками, і веде тебе чотирма етапами до App Store у твоєму темпі. Якщо підключаєш RevenueCat із цим ключем, повне налаштування є в статті RevenueCat і підписка in-app на iOS.
Якщо готуєш свій перший реліз, пройди безкоштовну діагностику: вона покаже, що тебе насправді гальмує, і надішле мій чекліст проти відмов Apple. Сторінка публікація застосунку в App Store розбирає кожен етап, від сторінки застосунку до схвалення.
Поширені запитання
Як створити ключ API App Store Connect?
Спершу Account Holder запитує доступ до API. Потім Admin відкриває Users and Access, вкладку Integrations, App Store Connect API, Team Keys. Він натискає Generate API Key, обирає назву й роль, генерує ключ і завантажує файл .p8.
Чи можна повторно завантажити втрачений ключ .p8?
Ні. Файл завантажується лише раз, і Apple не зберігає жодної копії. Відклич утрачений ключ, потім згенеруй новий і онови кожен інструмент, який ним користувався.
Де знайти Issuer ID і Key ID?
В App Store Connect, меню Users and Access, вкладка Integrations. Issuer ID показано вгорі сторінки. Key ID є в списку активних ключів. Індивідуальний ключ не використовує Issuer ID.
Яку роль дати ключу, який використовує Expo?
Гайд Expo дає роль Admin. За таблицею ролей Apple, App Manager достатньо, щоб відправляти збірки й створювати сертифікати та профілі. Саме таку роль має мій ключ, який я використовую для збірок Expo.
Чи можна змінити роль ключа API?
Ні. Apple не дозволяє змінювати ні назву, ні роль ключа після створення. Відклич його і згенеруй новий із потрібною роллю.
Чи закінчується термін дії ключа API App Store Connect?
На сторінках Apple не згадано жодного терміну дії ключа, лише його відкликання. Термін дії мають токени, підписані ним: для більшості запитів не більше 20 хвилин.

