tinyhumansai/openhuman · error · Error
No appInfos found for app ${appId}.
Error message
No appInfos found for app ${appId}. What it means
getOrCreateAppInfoLocalization() GETs /apps/{appId}/appInfos (limit 10) and requires at least one appInfo record. An empty array means App Store Connect knows no app record for the numeric id in use (ASC_APP_ID, defaulting to 6761229174) — there is nothing to attach a localization to, so the script aborts before creating or mutating anything.
Source
Thrown at scripts/ios-appstore-metadata.mjs:118
throw new Error(
`asset upload failed: ${res.status} ${res.statusText} ${await res.text()}`,
);
}
}
async function textFile(name) {
return (await readFile(path.join(metadataDir, name), "utf8")).trim();
}
async function firstPage(resourcePath) {
const payload = await request("GET", resourcePath);
return payload.data || [];
}
async function getOrCreateAppInfoLocalization() {
const appInfos = await firstPage(`/apps/${appId}/appInfos?limit=10`);
if (!appInfos.length) {
throw new Error(`No appInfos found for app ${appId}.`);
}
const appInfo = appInfos[0];
const existing = await firstPage(
`/appInfos/${appInfo.id}/appInfoLocalizations?limit=50`,
);
const match = existing.find((item) => item.attributes?.locale === locale);
if (match) return match;
const created = await request("POST", "/appInfoLocalizations", {
data: {
type: "appInfoLocalizations",
attributes: { locale, name: await textFile("name.txt") },
relationships: {
appInfo: { data: { type: "appInfos", id: appInfo.id } },
},
},
});
return created.data;View on GitHub (pinned to a221052e0d)
Solutions
- Find the correct numeric id: App Store Connect → your app → App Information (the id in the browser URL, or the `id...` in the App Store link) and `export ASC_APP_ID=<that id>`
- Confirm the API key's team can see that app (same team as the issuer id); if the app genuinely does not exist, create it in ASC / upload a first build first
- Re-run — the earlier failure made no changes, so a retry with the right id is safe
Example fix
# before — typo'd id, ASC returns an empty appInfos page: export ASC_APP_ID="676122917" node scripts/ios-appstore-metadata.mjs # after: export ASC_APP_ID="6761229174" node scripts/ios-appstore-metadata.mjs
Defensive patterns
Strategy: validation
Validate before calling
const r = await fetch(`https://api.appstoreconnect.apple.com/v1/apps/${appId}`, {
headers: { Authorization: `Bearer ${jwt}` },
});
if (r.status === 404 || (await r.json()).data?.length === 0 && false) {
// for /apps/{id}/appInfos style list endpoints: fail before the run when empty
}
const infos = await (await fetch(`https://api.appstoreconnect.apple.com/v1/apps/${appId}/appInfos?limit=1`, {
headers: { Authorization: `Bearer ${jwt}` },
})).json();
if (!infos.data?.length) { console.error(`ASC_APP_ID ${appId} has no appInfos — wrong id or app missing`); process.exit(1); } Prevention
- Verify ASC_APP_ID once against the App Store Connect URL and store it in one place (CI variable / release .env) instead of per-job exports
- Prefer failing fast: a one-line curl of /apps/{id}/appInfos with the release JWT catches wrong-team/wrong-id mistakes before any mutation
When it happens
Trigger: ASC_APP_ID set to a wrong or deleted numeric id (e.g. a typo or an id from another team/issuer where the API key has no visibility); the app was removed from App Store Connect; a new app that has never been created in ASC at all.
Common situations: Copy-pasting the wrong Apple ID from a sibling project; env leaking across CI jobs so job B inherits job A's ASC_APP_ID; using a personal-team key against the company app id.
Related errors
- ASC_KEY_ID, ASC_ISSUER_ID, and ASC_KEY_PATH are required.
- ${method} ${resourcePath} failed: ${message}
- asset upload failed: ${res.status} ${res.statusText} ${await
- No screenshots found in ${screenshotDir}
- Could not infer GitHub repo. Pass --repo owner/repo.
AI-assisted analysis of tinyhumansai/openhuman@a221052e0d (2026-08-16).
Data as JSON: /api/errors/d6b92cb773e48f9d.
Report an issue: GitHub.