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

  1. 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>`
  2. 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
  3. 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

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


AI-assisted analysis of tinyhumansai/openhuman@a221052e0d (2026-08-16). Data as JSON: /api/errors/d6b92cb773e48f9d. Report an issue: GitHub.