actualbudget/actual · error
results.reason
Error message
results.reason
What it means
When fetching Pluggy.ai accounts, an error_code in the 'pluggyai-accounts' response is thrown with results.reason as the message. Note this branch does not fall back to the code itself, so an empty reason yields an empty error message.
Source
Thrown at packages/desktop-client/src/components/banksync/useBuiltInBankSyncProviders.ts:501
}
}, [
dispatch,
isEnableBankingSetupComplete,
onEnableBankingInit,
t,
upgradingAccountId,
]);
const onConnectPluggyAi = useCallback(async () => {
if (!pluggyAiStatus.configured) {
onPluggyAiInit();
return;
}
try {
const results = await send('pluggyai-accounts');
if (results.error_code) {
throw new Error(results.reason);
}
if ('error' in results) {
throw new Error(results.error);
}
const externalAccounts = (results.accounts as PluggyAiAccount[]).map(
oldAccount => ({
account_id: oldAccount.id,
name: `${oldAccount.name.trim()} - ${
oldAccount.type === 'BANK' ? oldAccount.taxNumber : oldAccount.owner
}`,
institution: oldAccount.name,
orgDomain: null,
orgId: oldAccount.id,
balance:
oldAccount.type === 'BANK'
? oldAccount.bankData.automaticallyInvestedBalance +
oldAccount.bankData.closingBalanceView on GitHub (pinned to d4334cb6e6)
Solutions
- Check results.reason (and server logs) for the Pluggy.ai failure cause
- Re-enter Pluggy.ai credentials via the provider settings so secret-set stores valid values
- Confirm the secret scope matches pluggyAiStatus.source (global vs per-budget-file)
- Verify network access from the sync server to api.pluggy.ai
Example fix
// before
if (results.error_code) {
throw new Error(results.reason);
}
// after
if (results.error_code) {
throw new Error(results.reason || results.error_code);
} Defensive patterns
Strategy: try-catch
Validate before calling
const res = await send('pluggyai-accounts');
if (res.error_code) {
throw new Error(res.reason || res.error_code);
} Type guard
const isPluggyError = (r: object): r is { error_code?: string; reason?: string; error?: string } =>
'error_code' in r || 'error' in r; Try / catch
try {
await loadPluggyAiAccounts();
} catch (e) {
notify(`Pluggy.ai failed: ${e instanceof Error ? e.message : String(e)}`);
} Prevention
- Validate Pluggy.ai clientId/secret before saving them as secrets
- Ensure the secret scope (global vs per-budget-file) matches the provider source
- Check Pluggy.ai status/uptime before debugging app-side
When it happens
Trigger: The 'pluggyai-accounts' IPC returns { error_code: <non-null> } — e.g. invalid Pluggy.ai client id/secret, expired Pluggy auth, or the server failing to reach the Pluggy.ai API.
Common situations: Mis-typed pluggyai_clientId or pluggyai_clientSecret stored in secrets; per-budget-file vs global secret scope mismatch; Pluggy.ai API outage.
Related errors
- results.error
- results.reason || results.error_code
- results.reason || results.error
- Budget file ID is required.
- Pluggy credentials are not configured
AI-assisted analysis of actualbudget/actual@d4334cb6e6 (2026-08-29).
Data as JSON: /api/errors/744a5510f4693b11.
Report an issue: GitHub.