[GH-ISSUE #6320] [Bug]: downloadBudget fails with “Could not get remote files” #44351

Closed
opened 2026-04-26 05:27:37 -05:00 by GiteaMirror · 4 comments
Owner

Originally created by @rrweller on GitHub (Dec 6, 2025).
Original GitHub issue: https://github.com/actualbudget/actual/issues/6320

Verified issue does not already exist?

  • I have searched and found no existing issue

What happened?

I am working on setting up a third party bank integration that I found online here https://code.martials.no/martin/sparebank1_actual_budget_integration, however I am running into an issue with the downloadBudget(syncID) call.

I’ve searched the issue tracker and found #5351 (API Unhandled Rejection) which has the same Error: Could not get remote files in handlers.api/download-budget, but I’m opening this to add a repro with a self-hosted LXC setup and current versions (v25.12.0).


What happened?

I’m running Actual server in an LXC on Proxmox, installed via the community Proxmox helper script.
In the web UI:

  • Client version: v25.12.0
  • Server version: v25.12.0
  • Server URL in the footer: https://actualbudget.home:5006

I have two budgets:

  • My Budget (encrypted)
  • Test (non-encrypted)

Both show “Syncing” on the Files screen and sync fine between browser sessions.

From my browser I can open both budgets, manually hit the sync button, and see the server log:

2025-12-06T20:11:50.352Z info: POST 200 /sync/sync
2025-12-06T20:11:51.982Z info: POST 200 /sync/sync

However, when I try to access the Test budget via @actual-app/api, init() succeeds but downloadBudget always throws Error: Could not get remote files.

How can we reproduce the issue?

Minimal repro code

This is running in a separate Debian LXC container on the same Proxmox host.

import * as actual from '@actual-app/api';

async function main() {
  await actual.init({
    dataDir: '.cache',                         // created beforehand
    serverURL: 'https://actualbudget.home:5006',
    password: '<same password I use in the web UI>',
  });

  console.log('init OK, calling downloadBudget');

  await actual.downloadBudget('a3edae16-a433-41e3-be4f-d5f632ee5d39'); // Test budget syncId

  console.log('downloadBudget OK');
  await actual.shutdown();
}

main().catch((err) => {
  console.error('downloadBudget failed:', err);
});

Environment variables:
NODE_TLS_REJECT_UNAUTHORIZED=0 # self-signed cert on the Actual server

When I run this (or the sb1budget integration that uses the same API), I see:

Initialising ActualBudget API
  serverURL: "https://actualbudget.home:5006"
  dataDir: ".cache"
  syncId: "a3edae16-a433-41e3-be4f-d5f632ee5d39"
ActualBudget API initialised, downloading budget
Calling actual.downloadBudget
  syncId: "a3edae16-a433-41e3-be4f-d5f632ee5d39"
actual.downloadBudget failed
  err: Error: Could not get remote files
      at handlers.api/download-budget (/opt/sb1budget/node_modules/@actual-app/api/dist/app/bundle.api.js:XXXXX:YY)

So:

-init() works ⇒ auth and TLS are fine.

-The server clearly has a cloud budget with that group_id.

-The budget is non-encrypted (all encrypt_* fields null in files).

-The web UI can sync that budget with no errors.

-But downloadBudget(syncId) from @actual-app/api@25.12.0 always throws
Error: Could not get remote files.

This is the same error as in #5351, but here the server + client are both v25.12.0 and the server DB confirms the file exists.

Where are you hosting Actual?

Other

What browsers are you seeing the problem on?

Firefox

Operating System

Linux

Originally created by @rrweller on GitHub (Dec 6, 2025). Original GitHub issue: https://github.com/actualbudget/actual/issues/6320 ### Verified issue does not already exist? - [x] I have searched and found no existing issue ### What happened? I am working on setting up a third party bank integration that I found online here https://code.martials.no/martin/sparebank1_actual_budget_integration, however I am running into an issue with the downloadBudget(syncID) call. I’ve searched the issue tracker and found **#5351 (API Unhandled Rejection)** which has the same `Error: Could not get remote files` in `handlers.api/download-budget`, but I’m opening this to add a repro with a self-hosted LXC setup and current versions (v25.12.0). --- ### What happened? I’m running Actual server in an LXC on Proxmox, installed via the community Proxmox helper script. In the web UI: - Client version: **v25.12.0** - Server version: **v25.12.0** - Server URL in the footer: `https://actualbudget.home:5006` I have two budgets: - `My Budget` (encrypted) - `Test` (non-encrypted) Both show **“Syncing”** on the Files screen and sync fine between browser sessions. From my browser I can open both budgets, manually hit the sync button, and see the server log: `2025-12-06T20:11:50.352Z info: POST 200 /sync/sync` `2025-12-06T20:11:51.982Z info: POST 200 /sync/sync` However, when I try to access the Test budget via @actual-app/api, init() succeeds but downloadBudget always throws Error: Could not get remote files. ### How can we reproduce the issue? Minimal repro code This is running in a separate Debian LXC container on the same Proxmox host. ``` import * as actual from '@actual-app/api'; async function main() { await actual.init({ dataDir: '.cache', // created beforehand serverURL: 'https://actualbudget.home:5006', password: '<same password I use in the web UI>', }); console.log('init OK, calling downloadBudget'); await actual.downloadBudget('a3edae16-a433-41e3-be4f-d5f632ee5d39'); // Test budget syncId console.log('downloadBudget OK'); await actual.shutdown(); } main().catch((err) => { console.error('downloadBudget failed:', err); }); ``` Environment variables: `NODE_TLS_REJECT_UNAUTHORIZED=0 # self-signed cert on the Actual server` When I run this (or the sb1budget integration that uses the same API), I see: ``` Initialising ActualBudget API serverURL: "https://actualbudget.home:5006" dataDir: ".cache" syncId: "a3edae16-a433-41e3-be4f-d5f632ee5d39" ActualBudget API initialised, downloading budget Calling actual.downloadBudget syncId: "a3edae16-a433-41e3-be4f-d5f632ee5d39" actual.downloadBudget failed err: Error: Could not get remote files at handlers.api/download-budget (/opt/sb1budget/node_modules/@actual-app/api/dist/app/bundle.api.js:XXXXX:YY) ``` So: -init() works ⇒ auth and TLS are fine. -The server clearly has a cloud budget with that group_id. -The budget is non-encrypted (all encrypt_* fields null in files). -The web UI can sync that budget with no errors. -But downloadBudget(syncId) from @actual-app/api@25.12.0 always throws `Error: Could not get remote files.` This is the same error as in #5351, but here the server + client are both v25.12.0 and the server DB confirms the file exists. ### Where are you hosting Actual? Other ### What browsers are you seeing the problem on? Firefox ### Operating System Linux
GiteaMirror added the needs infoAPIbug labels 2026-04-26 05:27:38 -05:00
Author
Owner

@MatissJanis commented on GitHub (Dec 8, 2025):

👋 Anything in server logs?

<!-- gh-comment-id:3628758381 --> @MatissJanis commented on GitHub (Dec 8, 2025): 👋 Anything in server logs?
Author
Owner

@rrweller commented on GitHub (Dec 8, 2025):

👋 Anything in server logs?

Nothing, this is all I get when I run pnpm start

root@actualbudget:/opt/sb1budget# pnpm start

> sparebank1_actual_budget_integration@1.0.0 start /opt/sb1budget
> dotenvx run --env-file=.env.local -- node --import=tsx ./src/main.ts | ./packages/common/node_modules/pino-pretty/bin.js

[dotenvx@1.51.1] injecting env (16) from .env.local
[dotenv@17.2.3] injecting env (0) from .env -- tip: 🗂️ backup and recover secrets: https://dotenvx.com/ops
[21:49:53.420] INFO (2995): Starting application
[21:49:53.427] INFO (2995): Started Sqlite database at 'data/default.sqlite'
[21:49:53.427] INFO (2995): Testing ActualBudget connection
[21:49:53.427] INFO (2995): Initialising ActualBudget API
    serverURL: "https://10.0.1.20:5006"
    dataDir: ".cache"
    syncId: "5562b3f7-0ff1-4e90-a653-b2c2e14d92e3"
[21:49:53.462] INFO (2995): ActualBudget API initialised, downloading budget
[21:49:53.462] INFO (2995): Calling actual.downloadBudget
    syncId: "5562b3f7-0ff1-4e90-a653-b2c2e14d92e3"
[21:49:53.463] ERROR (2995): actual.downloadBudget failed
    err: {
      "type": "Error",
      "message": "Could not get remote files",
      "stack":
          Error: Could not get remote files
              at handlers.api/download-budget (/opt/sb1budget/node_modules/.pnpm/@actual-app+api@25.12.0/node_modules/@actual-app/api/dist/app/bundle.api.js:109492:19)
    }
[21:49:53.469] ERROR (2995): ActualBudget connection test failed
    err: {
      "type": "Error",
      "message": "Could not get remote files",
      "stack":
          Error: Could not get remote files
              at handlers.api/download-budget (/opt/sb1budget/node_modules/.pnpm/@actual-app+api@25.12.0/node_modules/@actual-app/api/dist/app/bundle.api.js:109492:19)
    }
[21:49:53.469] INFO (2995): Finished testing ActualBudget connection
node:internal/process/promises:391
    triggerUncaughtException(err, true /* fromPromise */);
    ^

Error: Could not get remote files
    at handlers.api/download-budget (/opt/sb1budget/node_modules/.pnpm/@actual-app+api@25.12.0/node_modules/@actual-app/api/dist/app/bundle.api.js:109492:19)

Node.js v20.19.6
Command failed with exit code 1: /root/.nvm/versions/node/v20.19.6/bin/node --import=tsx ./src/main.ts
root@actualbudget:/opt/sb1budget# journalctl -u actualbudget.service -n 50 --no-pager
Dec 06 21:07:01 actualbudget actual-server[87]: 2025-12-06T20:07:01.026Z info: POST 200 /sync/sync
Dec 06 21:07:03 actualbudget actual-server[87]: 2025-12-06T20:07:03.733Z info: POST 200 /sync/sync
Dec 06 21:07:06 actualbudget actual-server[87]: 2025-12-06T20:07:06.186Z info: POST 200 /sync/sync
Dec 06 21:07:06 actualbudget actual-server[87]: 2025-12-06T20:07:06.954Z info: POST 200 /sync/sync
Dec 06 21:07:09 actualbudget actual-server[87]: 2025-12-06T20:07:09.158Z info: GET 200 /account/validate
Dec 06 21:07:09 actualbudget actual-server[87]: 2025-12-06T20:07:09.164Z info: GET 200 /account/needs-bootstrap
Dec 06 21:07:09 actualbudget actual-server[87]: 2025-12-06T20:07:09.286Z info: GET 304 /account/validate
Dec 06 21:07:09 actualbudget actual-server[87]: 2025-12-06T20:07:09.298Z info: GET 200 /sync/list-user-files
Dec 06 21:07:09 actualbudget actual-server[87]: 2025-12-06T20:07:09.299Z info: GET 200 /sync/list-user-files
Dec 06 21:07:09 actualbudget actual-server[87]: 2025-12-06T20:07:09.442Z info: POST 200 /sync/sync
Dec 06 21:07:10 actualbudget actual-server[87]: 2025-12-06T20:07:10.548Z info: POST 200 /sync/sync
Dec 06 21:07:14 actualbudget actual-server[87]: 2025-12-06T20:07:14.232Z info: GET 304 /account/validate
Dec 06 21:07:14 actualbudget actual-server[87]: 2025-12-06T20:07:14.233Z info: GET 200 /account/validate
Dec 06 21:07:14 actualbudget actual-server[87]: 2025-12-06T20:07:14.246Z info: GET 304 /sync/list-user-files
Dec 06 21:07:14 actualbudget actual-server[87]: 2025-12-06T20:07:14.434Z info: GET 304 /account/validate
Dec 06 21:07:21 actualbudget actual-server[87]: 2025-12-06T20:07:21.470Z info: GET 304 /account/validate
Dec 06 21:07:21 actualbudget actual-server[87]: 2025-12-06T20:07:21.570Z info: POST 200 /sync/sync
Dec 06 21:07:22 actualbudget actual-server[87]: 2025-12-06T20:07:22.775Z info: POST 200 /sync/sync
Dec 06 21:07:23 actualbudget actual-server[87]: 2025-12-06T20:07:23.455Z info: POST 200 /sync/sync
Dec 06 21:07:23 actualbudget actual-server[87]: 2025-12-06T20:07:23.845Z info: POST 200 /sync/sync
Dec 06 21:07:55 actualbudget actual-server[87]: 2025-12-06T20:07:55.412Z info: POST 200 /sync/sync
Dec 06 21:08:39 actualbudget actual-server[87]: 2025-12-06T20:08:39.399Z info: POST 200 /sync/sync
Dec 06 21:08:48 actualbudget actual-server[87]: 2025-12-06T20:08:48.077Z info: POST 200 /sync/sync
Dec 06 21:09:03 actualbudget actual-server[87]: 2025-12-06T20:09:03.319Z info: POST 200 /sync/sync
Dec 06 21:09:06 actualbudget actual-server[87]: 2025-12-06T20:09:06.708Z info: POST 200 /sync/sync
Dec 06 21:09:13 actualbudget actual-server[87]: 2025-12-06T20:09:13.926Z info: POST 200 /sync/sync
Dec 06 21:11:46 actualbudget actual-server[87]: 2025-12-06T20:11:46.176Z info: POST 200 /sync/sync
Dec 06 21:11:50 actualbudget actual-server[87]: 2025-12-06T20:11:50.352Z info: POST 200 /sync/sync
Dec 06 21:11:51 actualbudget actual-server[87]: 2025-12-06T20:11:51.982Z info: POST 200 /sync/sync
Dec 06 21:11:52 actualbudget actual-server[87]: 2025-12-06T20:11:52.823Z info: POST 200 /sync/sync
Dec 06 21:11:53 actualbudget actual-server[87]: 2025-12-06T20:11:53.248Z info: POST 200 /sync/sync
Dec 06 21:12:01 actualbudget actual-server[87]: 2025-12-06T20:12:01.903Z info: POST 200 /sync/sync
Dec 06 21:14:06 actualbudget actual-server[87]: 2025-12-06T20:14:06.129Z info: POST 200 /sync/sync
Dec 06 21:14:17 actualbudget actual-server[87]: 2025-12-06T20:14:17.642Z info: POST 200 /sync/sync
Dec 06 21:18:43 actualbudget actual-server[87]: 2025-12-06T20:18:43.030Z info: POST 200 /sync/sync
Dec 06 21:19:00 actualbudget actual-server[87]: 2025-12-06T20:19:00.498Z info: POST 200 /sync/user-get-key
Dec 06 21:19:00 actualbudget actual-server[87]: 2025-12-06T20:19:00.525Z info: POST 200 /sync/reset-user-file
Dec 06 21:19:00 actualbudget actual-server[87]: 2025-12-06T20:19:00.720Z info: POST 200 /sync/upload-user-file
Dec 06 21:19:00 actualbudget actual-server[87]: 2025-12-06T20:19:00.786Z info: POST 200 /sync/sync
Dec 06 21:20:02 actualbudget actual-server[87]: 2025-12-06T20:20:02.266Z info: POST 200 /sync/sync
Dec 06 21:34:15 actualbudget actual-server[87]: 2025-12-06T20:34:15.589Z info: POST 200 /sync/sync
Dec 06 21:34:37 actualbudget actual-server[87]: 2025-12-06T20:34:37.060Z info: POST 200 /sync/sync
Dec 06 21:35:04 actualbudget actual-server[87]: 2025-12-06T20:35:04.410Z info: POST 200 /sync/sync
Dec 08 21:49:45 actualbudget actual-server[87]: 2025-12-08T20:49:45.553Z info: GET 200 /account/validate
Dec 08 21:49:45 actualbudget actual-server[87]: 2025-12-08T20:49:45.553Z info: GET 200 /account/needs-bootstrap
Dec 08 21:49:45 actualbudget actual-server[87]: 2025-12-08T20:49:45.674Z info: GET 304 /account/validate
Dec 08 21:49:45 actualbudget actual-server[87]: 2025-12-08T20:49:45.675Z info: GET 200 /sync/list-user-files
Dec 08 21:49:45 actualbudget actual-server[87]: 2025-12-08T20:49:45.686Z info: GET 200 /sync/list-user-files
Dec 08 21:49:45 actualbudget actual-server[87]: 2025-12-08T20:49:45.810Z info: POST 200 /sync/sync
Dec 08 21:49:46 actualbudget actual-server[87]: 2025-12-08T20:49:46.983Z info: POST 200 /sync/sync

It seems like this is the .ts file that is failing at actual.downloadBudget(ACTUAL_SYNC_ID) - https://code.martials.no/martin/sparebank1_actual_budget_integration/src/branch/main/src/actual.ts

I've tried making a quick test script to verify its not an issue with this integration

const api = require('@actual-app/api');
const path = require('path');
const fs = require('fs');

// Load the same env file sb1budget is using
require('dotenv').config({ path: '/opt/sb1budget/.env.local' });

(async () => {
  try {
    const serverURL = process.env.ACTUAL_SERVER_URL;
    const password = process.env.ACTUAL_PASSWORD;
    const syncId = process.env.ACTUAL_SYNC_ID;
    const dataDir = process.env.ACTUAL_DATA_DIR || '.cache';

    console.log('Using:');
    console.log('  serverURL:', serverURL);
    console.log('  dataDir  :', dataDir);
    console.log('  syncId   :', syncId);

    // Make sure the cache dir exists
    const fullDataDir = path.resolve(dataDir);

but this fails similarly

[dotenv@17.2.3] injecting env (16) from ../sb1budget/.env.local -- tip: ⚙️  override existing env vars with { override: true }
Using:
  serverURL: https://10.0.1.20:5006
  dataDir  : .cache
  syncId   : 5562b3f7-0ff1-4e90-a653-b2c2e14d92e3

[1] init()
  init() OK

[2] getBudgets()
  Budgets seen by server:

[3] downloadBudget(syncId)

[ERROR]
 Error: Could not get remote files
    at handlers.api/download-budget (/opt/actual-debug/node_modules/.pnpm/@actual-app+api@25.12.0/node_modules/@actual-app/api/dist/app/bundle.api.js:109492:19)
node:internal/process/promises:391
    triggerUncaughtException(err, true /* fromPromise */);
    ^

Error: Could not get remote files
    at handlers.api/download-budget (/opt/actual-debug/node_modules/.pnpm/@actual-app+api@25.12.0/node_modules/@actual-app/api/dist/app/bundle.api.js:109492:19)

Node.js v20.19.6
<!-- gh-comment-id:3628970406 --> @rrweller commented on GitHub (Dec 8, 2025): > 👋 Anything in server logs? Nothing, this is all I get when I run pnpm start ``` root@actualbudget:/opt/sb1budget# pnpm start > sparebank1_actual_budget_integration@1.0.0 start /opt/sb1budget > dotenvx run --env-file=.env.local -- node --import=tsx ./src/main.ts | ./packages/common/node_modules/pino-pretty/bin.js [dotenvx@1.51.1] injecting env (16) from .env.local [dotenv@17.2.3] injecting env (0) from .env -- tip: 🗂️ backup and recover secrets: https://dotenvx.com/ops [21:49:53.420] INFO (2995): Starting application [21:49:53.427] INFO (2995): Started Sqlite database at 'data/default.sqlite' [21:49:53.427] INFO (2995): Testing ActualBudget connection [21:49:53.427] INFO (2995): Initialising ActualBudget API serverURL: "https://10.0.1.20:5006" dataDir: ".cache" syncId: "5562b3f7-0ff1-4e90-a653-b2c2e14d92e3" [21:49:53.462] INFO (2995): ActualBudget API initialised, downloading budget [21:49:53.462] INFO (2995): Calling actual.downloadBudget syncId: "5562b3f7-0ff1-4e90-a653-b2c2e14d92e3" [21:49:53.463] ERROR (2995): actual.downloadBudget failed err: { "type": "Error", "message": "Could not get remote files", "stack": Error: Could not get remote files at handlers.api/download-budget (/opt/sb1budget/node_modules/.pnpm/@actual-app+api@25.12.0/node_modules/@actual-app/api/dist/app/bundle.api.js:109492:19) } [21:49:53.469] ERROR (2995): ActualBudget connection test failed err: { "type": "Error", "message": "Could not get remote files", "stack": Error: Could not get remote files at handlers.api/download-budget (/opt/sb1budget/node_modules/.pnpm/@actual-app+api@25.12.0/node_modules/@actual-app/api/dist/app/bundle.api.js:109492:19) } [21:49:53.469] INFO (2995): Finished testing ActualBudget connection node:internal/process/promises:391 triggerUncaughtException(err, true /* fromPromise */); ^ Error: Could not get remote files at handlers.api/download-budget (/opt/sb1budget/node_modules/.pnpm/@actual-app+api@25.12.0/node_modules/@actual-app/api/dist/app/bundle.api.js:109492:19) Node.js v20.19.6 Command failed with exit code 1: /root/.nvm/versions/node/v20.19.6/bin/node --import=tsx ./src/main.ts root@actualbudget:/opt/sb1budget# journalctl -u actualbudget.service -n 50 --no-pager Dec 06 21:07:01 actualbudget actual-server[87]: 2025-12-06T20:07:01.026Z info: POST 200 /sync/sync Dec 06 21:07:03 actualbudget actual-server[87]: 2025-12-06T20:07:03.733Z info: POST 200 /sync/sync Dec 06 21:07:06 actualbudget actual-server[87]: 2025-12-06T20:07:06.186Z info: POST 200 /sync/sync Dec 06 21:07:06 actualbudget actual-server[87]: 2025-12-06T20:07:06.954Z info: POST 200 /sync/sync Dec 06 21:07:09 actualbudget actual-server[87]: 2025-12-06T20:07:09.158Z info: GET 200 /account/validate Dec 06 21:07:09 actualbudget actual-server[87]: 2025-12-06T20:07:09.164Z info: GET 200 /account/needs-bootstrap Dec 06 21:07:09 actualbudget actual-server[87]: 2025-12-06T20:07:09.286Z info: GET 304 /account/validate Dec 06 21:07:09 actualbudget actual-server[87]: 2025-12-06T20:07:09.298Z info: GET 200 /sync/list-user-files Dec 06 21:07:09 actualbudget actual-server[87]: 2025-12-06T20:07:09.299Z info: GET 200 /sync/list-user-files Dec 06 21:07:09 actualbudget actual-server[87]: 2025-12-06T20:07:09.442Z info: POST 200 /sync/sync Dec 06 21:07:10 actualbudget actual-server[87]: 2025-12-06T20:07:10.548Z info: POST 200 /sync/sync Dec 06 21:07:14 actualbudget actual-server[87]: 2025-12-06T20:07:14.232Z info: GET 304 /account/validate Dec 06 21:07:14 actualbudget actual-server[87]: 2025-12-06T20:07:14.233Z info: GET 200 /account/validate Dec 06 21:07:14 actualbudget actual-server[87]: 2025-12-06T20:07:14.246Z info: GET 304 /sync/list-user-files Dec 06 21:07:14 actualbudget actual-server[87]: 2025-12-06T20:07:14.434Z info: GET 304 /account/validate Dec 06 21:07:21 actualbudget actual-server[87]: 2025-12-06T20:07:21.470Z info: GET 304 /account/validate Dec 06 21:07:21 actualbudget actual-server[87]: 2025-12-06T20:07:21.570Z info: POST 200 /sync/sync Dec 06 21:07:22 actualbudget actual-server[87]: 2025-12-06T20:07:22.775Z info: POST 200 /sync/sync Dec 06 21:07:23 actualbudget actual-server[87]: 2025-12-06T20:07:23.455Z info: POST 200 /sync/sync Dec 06 21:07:23 actualbudget actual-server[87]: 2025-12-06T20:07:23.845Z info: POST 200 /sync/sync Dec 06 21:07:55 actualbudget actual-server[87]: 2025-12-06T20:07:55.412Z info: POST 200 /sync/sync Dec 06 21:08:39 actualbudget actual-server[87]: 2025-12-06T20:08:39.399Z info: POST 200 /sync/sync Dec 06 21:08:48 actualbudget actual-server[87]: 2025-12-06T20:08:48.077Z info: POST 200 /sync/sync Dec 06 21:09:03 actualbudget actual-server[87]: 2025-12-06T20:09:03.319Z info: POST 200 /sync/sync Dec 06 21:09:06 actualbudget actual-server[87]: 2025-12-06T20:09:06.708Z info: POST 200 /sync/sync Dec 06 21:09:13 actualbudget actual-server[87]: 2025-12-06T20:09:13.926Z info: POST 200 /sync/sync Dec 06 21:11:46 actualbudget actual-server[87]: 2025-12-06T20:11:46.176Z info: POST 200 /sync/sync Dec 06 21:11:50 actualbudget actual-server[87]: 2025-12-06T20:11:50.352Z info: POST 200 /sync/sync Dec 06 21:11:51 actualbudget actual-server[87]: 2025-12-06T20:11:51.982Z info: POST 200 /sync/sync Dec 06 21:11:52 actualbudget actual-server[87]: 2025-12-06T20:11:52.823Z info: POST 200 /sync/sync Dec 06 21:11:53 actualbudget actual-server[87]: 2025-12-06T20:11:53.248Z info: POST 200 /sync/sync Dec 06 21:12:01 actualbudget actual-server[87]: 2025-12-06T20:12:01.903Z info: POST 200 /sync/sync Dec 06 21:14:06 actualbudget actual-server[87]: 2025-12-06T20:14:06.129Z info: POST 200 /sync/sync Dec 06 21:14:17 actualbudget actual-server[87]: 2025-12-06T20:14:17.642Z info: POST 200 /sync/sync Dec 06 21:18:43 actualbudget actual-server[87]: 2025-12-06T20:18:43.030Z info: POST 200 /sync/sync Dec 06 21:19:00 actualbudget actual-server[87]: 2025-12-06T20:19:00.498Z info: POST 200 /sync/user-get-key Dec 06 21:19:00 actualbudget actual-server[87]: 2025-12-06T20:19:00.525Z info: POST 200 /sync/reset-user-file Dec 06 21:19:00 actualbudget actual-server[87]: 2025-12-06T20:19:00.720Z info: POST 200 /sync/upload-user-file Dec 06 21:19:00 actualbudget actual-server[87]: 2025-12-06T20:19:00.786Z info: POST 200 /sync/sync Dec 06 21:20:02 actualbudget actual-server[87]: 2025-12-06T20:20:02.266Z info: POST 200 /sync/sync Dec 06 21:34:15 actualbudget actual-server[87]: 2025-12-06T20:34:15.589Z info: POST 200 /sync/sync Dec 06 21:34:37 actualbudget actual-server[87]: 2025-12-06T20:34:37.060Z info: POST 200 /sync/sync Dec 06 21:35:04 actualbudget actual-server[87]: 2025-12-06T20:35:04.410Z info: POST 200 /sync/sync Dec 08 21:49:45 actualbudget actual-server[87]: 2025-12-08T20:49:45.553Z info: GET 200 /account/validate Dec 08 21:49:45 actualbudget actual-server[87]: 2025-12-08T20:49:45.553Z info: GET 200 /account/needs-bootstrap Dec 08 21:49:45 actualbudget actual-server[87]: 2025-12-08T20:49:45.674Z info: GET 304 /account/validate Dec 08 21:49:45 actualbudget actual-server[87]: 2025-12-08T20:49:45.675Z info: GET 200 /sync/list-user-files Dec 08 21:49:45 actualbudget actual-server[87]: 2025-12-08T20:49:45.686Z info: GET 200 /sync/list-user-files Dec 08 21:49:45 actualbudget actual-server[87]: 2025-12-08T20:49:45.810Z info: POST 200 /sync/sync Dec 08 21:49:46 actualbudget actual-server[87]: 2025-12-08T20:49:46.983Z info: POST 200 /sync/sync ``` It seems like this is the .ts file that is failing at actual.downloadBudget(ACTUAL_SYNC_ID) - https://code.martials.no/martin/sparebank1_actual_budget_integration/src/branch/main/src/actual.ts I've tried making a quick test script to verify its not an issue with this integration ``` const api = require('@actual-app/api'); const path = require('path'); const fs = require('fs'); // Load the same env file sb1budget is using require('dotenv').config({ path: '/opt/sb1budget/.env.local' }); (async () => { try { const serverURL = process.env.ACTUAL_SERVER_URL; const password = process.env.ACTUAL_PASSWORD; const syncId = process.env.ACTUAL_SYNC_ID; const dataDir = process.env.ACTUAL_DATA_DIR || '.cache'; console.log('Using:'); console.log(' serverURL:', serverURL); console.log(' dataDir :', dataDir); console.log(' syncId :', syncId); // Make sure the cache dir exists const fullDataDir = path.resolve(dataDir); ``` but this fails similarly ``` [dotenv@17.2.3] injecting env (16) from ../sb1budget/.env.local -- tip: ⚙️ override existing env vars with { override: true } Using: serverURL: https://10.0.1.20:5006 dataDir : .cache syncId : 5562b3f7-0ff1-4e90-a653-b2c2e14d92e3 [1] init() init() OK [2] getBudgets() Budgets seen by server: [3] downloadBudget(syncId) [ERROR] Error: Could not get remote files at handlers.api/download-budget (/opt/actual-debug/node_modules/.pnpm/@actual-app+api@25.12.0/node_modules/@actual-app/api/dist/app/bundle.api.js:109492:19) node:internal/process/promises:391 triggerUncaughtException(err, true /* fromPromise */); ^ Error: Could not get remote files at handlers.api/download-budget (/opt/actual-debug/node_modules/.pnpm/@actual-app+api@25.12.0/node_modules/@actual-app/api/dist/app/bundle.api.js:109492:19) Node.js v20.19.6 ```
Author
Owner

@MatissJanis commented on GitHub (Dec 8, 2025):

Do you have OIDC set up (multi user)?

Either way: I suspect auth is the problem here, but the auth error is never properly surfaced. I pushed a patch here: https://github.com/actualbudget/actual/pull/6337

<!-- gh-comment-id:3629131139 --> @MatissJanis commented on GitHub (Dec 8, 2025): Do you have OIDC set up (multi user)? Either way: I suspect auth is the problem here, but the auth error is never properly surfaced. I pushed a patch here: https://github.com/actualbudget/actual/pull/6337
Author
Owner

@dkratz commented on GitHub (Dec 9, 2025):

I had the same problem because my actual budget instance was behind pangolin and API calls where blocked.

Error (with https://github.com/actualbudget/actual/pull/6337 and some additional console logs).

SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON
    at JSON.parse (<anonymous>)
    at post (C:\Coding\actual-split-report\node_modules\@actual-app\api\dist\app\bundle.api.js:55970:29)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async signIn (C:\Coding\actual-split-report\node_modules\@actual-app\api\dist\app\bundle.api.js:110249:15)
{ error: 'parse-json' }
C:\Coding\actual-split-report\node_modules\@actual-app\api\dist\app\bundle.api.js:134127
        throw new Error(`Authentication failed: ${result.error}`);
              ^
Error: Authentication failed: parse-json
    at Object.init (C:\Coding\actual-split-report\node_modules\@actual-app\api\dist\app\bundle.api.js:134127:15)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async Object.init (C:\Coding\actual-split-report\node_modules\@actual-app\api\dist\index.js:61:5)
Waiting for the debugger to disconnect...
error: script "start" exited with code 1
<!-- gh-comment-id:3634664812 --> @dkratz commented on GitHub (Dec 9, 2025): I had the same problem because my actual budget instance was behind pangolin and API calls where blocked. Error (with https://github.com/actualbudget/actual/pull/6337 and some additional console logs). ``` SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON at JSON.parse (<anonymous>) at post (C:\Coding\actual-split-report\node_modules\@actual-app\api\dist\app\bundle.api.js:55970:29) at processTicksAndRejections (node:internal/process/task_queues:95:5) at async signIn (C:\Coding\actual-split-report\node_modules\@actual-app\api\dist\app\bundle.api.js:110249:15) { error: 'parse-json' } C:\Coding\actual-split-report\node_modules\@actual-app\api\dist\app\bundle.api.js:134127 throw new Error(`Authentication failed: ${result.error}`); ^ Error: Authentication failed: parse-json at Object.init (C:\Coding\actual-split-report\node_modules\@actual-app\api\dist\app\bundle.api.js:134127:15) at processTicksAndRejections (node:internal/process/task_queues:95:5) at async Object.init (C:\Coding\actual-split-report\node_modules\@actual-app\api\dist\index.js:61:5) Waiting for the debugger to disconnect... error: script "start" exited with code 1 ```
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/actual#44351