Read-only TypeScript client and CLI for the Austrian FinanzOnline DataBox API.
npm install finanzonline-ts


Read-only TypeScript SDK and CLI for the Austrian FinanzOnline DataBox API.
Download all unread Bescheide with a single command:
``bash`
npx finanzonline-ts sync \
--tid YOUR_TID \
--benid YOUR_BENID \
--pin YOUR_PIN \
--herstellerid ATUxxxxxxxx \
--output-dir ./bescheide \
--erltyp B \
--all
Or list documents first:
`bash`
npx finanzonline-ts list \
--tid YOUR_TID \
--benid YOUR_BENID \
--pin YOUR_PIN \
--herstellerid ATUxxxxxxxx \
--output-dir /tmp \
--all
> Note: You need a FinanzOnline WebService user (not your regular login). Create one in FinanzOnline under Admin → Benutzerverwaltung → Benutzer anlegen → Type "Webservice".
---
This is a TypeScript port of the Python package
finanzonline_databox by
Robert Nowotny (bitranox). Huge thanks for the original implementation and docs.
- Login/logout session handling
- List DataBox documents (Bescheide, Mitteilungen, etc.)
- Download documents as base64-decoded PDF/XML
- CLI with list/download/sync commands
- Layered config: CLI flags → env → .env → TOML
- Strict TypeScript types and error classes
`bash`
pnpm add finanzonline-ts
`bash`
bun add finanzonline-ts
`ts
import { DataboxClient, SessionClient, loadConfig } from "finanzonline-ts";
const { config } = loadConfig();
const sessionClient = new SessionClient({ timeoutSeconds: config.session_timeout });
const databoxClient = new DataboxClient({ timeoutSeconds: config.query_timeout });
const session = await sessionClient.login({
tid: config.tid,
benid: config.benid,
pin: config.pin,
herstellerid: config.herstellerid
});
const entries = await databoxClient.getDatabox(session.sessionId, config, {
erltyp: "B"
});
const pdf = await databoxClient.getDataboxEntry(
session.sessionId,
config,
entries[0].applkey
);
`
`bash`
finanzonline --help
`bash`
finanzonline list --erltyp B --days 30
finanzonline list --all
finanzonline list --read
Defaults: list/sync only show UNREAD unless --read or --all is provided.
`bash`
finanzonline download
`bash`
finanzonline sync --erltyp B --days 7
finanzonline sync --all
Config is loaded in priority order:
1. CLI flags
2. Environment variables
3. .env in current/parent directoriesfinanzonline.toml
4. in current/parent directories
Compatibility notes:
- The original Python package uses a layered config system; this port uses a
single finanzonline.toml plus .env discovery.
`bash`
FINANZONLINE__TID=12345678
FINANZONLINE__BENID=WEBUSER
FINANZONLINE__PIN=secret
FINANZONLINE__HERSTELLERID=ATU12345678
FINANZONLINE__OUTPUT_DIR=/tmp/finanzonline
FINANZONLINE__SESSION_TIMEOUT=30
FINANZONLINE__QUERY_TIMEOUT=30
`toml`
[finanzonline]
tid = "12345678"
benid = "WEBUSER"
pin = "secret"
herstellerid = "ATU12345678"
output_dir = "/tmp/finanzonline"
session_timeout = 30
query_timeout = 30
`bash`
finanzonline \
--tid 12345678 \
--benid WEBUSER \
--pin secret \
--herstellerid ATU12345678 \
--output-dir /tmp/finanzonline
`ts
import { DataboxClient, SessionClient } from "finanzonline-ts";
const sessionClient = new SessionClient({ timeoutSeconds: 30 });
const databoxClient = new DataboxClient({ timeoutSeconds: 30 });
const session = await sessionClient.login({
tid: "12345678",
benid: "WEBUSER",
pin: "secret",
herstellerid: "ATU12345678"
});
const entries = await databoxClient.getDatabox(session.sessionId, {
tid: "12345678",
benid: "WEBUSER",
pin: "secret",
herstellerid: "ATU12345678"
});
`
- Invalid credentials return rc=-4 and throw InvalidCredentialsError.rc=-1
- Expired sessions return and throw SessionExpiredError./wartung/
- Maintenance mode responses include and throw MaintenanceError.NetworkError
- Network timeouts throw .InvalidXmlError`.
- Invalid XML responses throw
MIT
- Original Python implementation:
bitranox/finanzonline_databox