jlcodes99/cockpit-tools · error

API_KEY_NOT_FOUND

API_KEY_NOT_FOUND

Error message

API_KEY_NOT_FOUND

What it means

renameApiKeyOnCodexModelProvider throws API_KEY_NOT_FOUND when the provider exists but none of its apiKeys has the given apiKeyId. The lookup is a plain find on provider.apiKeys by id; note that removeApiKeyFromCodexModelProvider silently no-ops in the same situation, but rename throws to avoid renaming nothing.

Source

Thrown at src/services/codexModelProviderService.ts:797

    return { ...provider, apiKeys: provider.apiKeys.map((item) => ({ ...item })) };
  }
  provider.apiKeys = nextApiKeys;
  provider.updatedAt = Date.now();
  await writeProviders(providers);
  return { ...provider, apiKeys: provider.apiKeys.map((item) => ({ ...item })) };
}

/** Explicit rename for an existing provider API key (#1510). Does not rewrite key material. */
export async function renameApiKeyOnCodexModelProvider(
  providerId: string,
  apiKeyId: string,
  name: string,
): Promise<CodexModelProvider> {
  const providers = await ensureProvidersLoaded();
  const provider = providers.find((item) => item.id === providerId);
  if (!provider) throw new Error('PROVIDER_NOT_FOUND');
  const apiKey = provider.apiKeys.find((item) => item.id === apiKeyId);
  if (!apiKey) throw new Error('API_KEY_NOT_FOUND');

  const now = Date.now();
  apiKey.name = sanitizeName(name);
  apiKey.updatedAt = now;
  provider.updatedAt = now;
  await writeProviders(providers);
  return { ...provider, apiKeys: provider.apiKeys.map((item) => ({ ...item })) };
}

/** Replace the secret for an existing provider API key without changing its id. */
export async function updateApiKeyOnCodexModelProvider(
  providerId: string,
  apiKeyId: string,
  apiKey: string,
  name?: string,
): Promise<CodexModelProvider> {
  const normalizedApiKey = sanitizeApiKey(apiKey);
  if (!normalizedApiKey) throw new Error("API_KEY_REQUIRED");

View on GitHub (pinned to 1ed8b77992)

Solutions

  1. Fetch the provider and confirm apiKeyId is present in provider.apiKeys before renaming.
  2. If the key was deleted, re-add it with addApiKeyToCodexModelProvider and then rename.
  3. Check you are pairing the apiKeyId with the correct providerId (keys from another provider will never match).
  4. Catch 'API_KEY_NOT_FOUND' and refresh the key list in the UI.

Example fix

// before
await renameApiKeyOnCodexModelProvider(providerId, keyId, 'prod-key');
// after
const provider = (await listCodexModelProviders()).find((p) => p.id === providerId);
if (!provider?.apiKeys.some((k) => k.id === keyId)) throw new Error('Key not found on provider');
await renameApiKeyOnCodexModelProvider(providerId, keyId, 'prod-key');
Defensive patterns

Strategy: type-guard

Validate before calling

const provider = (await listCodexModelProviders()).find((p) => p.id === providerId);
if (!provider?.apiKeys.some((k) => k.id === apiKeyId)) {
  throw new Error(`API key ${apiKeyId} not found on provider ${providerId}`);
}

Type guard

function hasApiKey(provider: { apiKeys: { id: string }[] } | undefined, apiKeyId: string): boolean {
  return !!provider && provider.apiKeys.some((k) => k.id === apiKeyId);
}

Try / catch

try {
  await renameApiKeyOnCodexModelProvider(providerId, apiKeyId, name);
} catch (e) {
  if ((e as Error).message === 'API_KEY_NOT_FOUND') {
    await reloadApiKeys(providerId); // key was removed elsewhere
  } else throw e;
}

Prevention

When it happens

Trigger: Calling renameApiKeyOnCodexModelProvider(providerId, apiKeyId, name) with an apiKeyId that is not in that provider's apiKeys array — wrong key id, key already removed, or an id belonging to a different provider.

Common situations: Renaming a key from a stale list after the key was deleted; mixing up key ids between two providers that both have keys; retrying a rename after a successful first attempt that the UI did not reflect.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


AI-assisted analysis of jlcodes99/cockpit-tools@1ed8b77992 (2026-09-05). Data as JSON: /api/errors/2f85817a3b291077. Report an issue: GitHub.