I solve it using direclt API from the browser console. Here is how I did it:
Workaround: Create API Keys via browser console when Integrations page is blank
If the "Integrations" tab under Users and Access shows a blank page (with console error [maison] integrations @ url(/access/m-integrations/asset-manifest.json): No app or default mount found!), you can use the internal REST API directly from the browser console.
Steps:
Go to https://appstoreconnect.apple.com and make sure you're logged in with an Account Holder or Admin account
Open the browser developer console (F12 → Console tab)
Create the API Key:
jsfetch('/iris/v1/apiKeys', {
method: 'POST',
credentials: 'include',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({
data: {
type: 'apiKeys',
attributes: {
nickname: 'NEED_TO_DO_SOME_STUFF',
allAppsVisible: true,
keyType: 'PUBLIC_API',
roles: ['APP_MANAGER']
}
}
})
}).then(r => r.json()).then(d => {
console.log('✅ Key created!');
console.log('Key ID:', d.data.id);
window._newKeyId = d.data.id;
})
Download the .p8 private key (run immediately after — Apple allows this only ONCE):
jsfetch('/iris/v1/apiKeys/' + window.newKeyId + '?fields[apiKeys]=privateKey', {
credentials: 'include',
headers: {'Accept': 'application/json'}
}).then(r => r.json()).then(d => {
const key = atob(d.data.attributes.privateKey);
const blob = new Blob([key], {type: 'text/plain'});
const a = document.createElement('a');
a.href = URL.createObjectURL(blob);
a.download = 'AuthKey' + d.data.id + '.p8';
a.click();
console.log('✅ .p8 file downloaded!');
})
Get the Issuer ID:
jsfetch('/iris/v1/apiKeys/' + window._newKeyId + '/provider', {
credentials: 'include',
headers: {'Accept': 'application/json'}
}).then(r => r.json()).then(d => {
console.log('Issuer ID:', d.data.id);
})
To list existing keys:
jsfetch('/iris/v1/apiKeys', {
credentials: 'include',
headers: {'Accept': 'application/json'}
}).then(r => r.json()).then(d => console.log(d))
To revoke/delete a key:
jsfetch('/iris/v1/apiKeys/YOUR_KEY_ID_HERE', {
method: 'DELETE',
credentials: 'include',
headers: {'Accept': 'application/json'}
}).then(r => console.log('Deleted:', r.status))
Tested April 2026.
This is a workaround for the blank Integrations page bug that has been open since 2022.
Thanks to Opus 4.6 that adress this solution