@hakimelek/monarchmoney 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,187 @@
1
+ # Monarch Money (Node.js)
2
+
3
+ Node.js/TypeScript library for accessing [Monarch Money](https://www.monarchmoney.com) data.
4
+
5
+ Port of the [Python monarchmoney library](https://github.com/hammem/monarchmoney) with full TypeScript types, JSDoc, and a clean modular architecture.
6
+
7
+ > **Disclaimer:** This project is unofficial and not affiliated with Monarch Money.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install monarchmoney
13
+ ```
14
+
15
+ Requires **Node.js 18+** (uses native `fetch` and `AbortSignal.timeout`).
16
+
17
+ ## Quick Start
18
+
19
+ ```ts
20
+ import { MonarchMoney, RequireMFAException } from "monarchmoney";
21
+
22
+ const mm = new MonarchMoney();
23
+
24
+ // Login
25
+ try {
26
+ await mm.login("your@email.com", "password");
27
+ } catch (e) {
28
+ if (e instanceof RequireMFAException) {
29
+ await mm.multiFactorAuthenticate("your@email.com", "password", "123456");
30
+ }
31
+ }
32
+
33
+ // Fetch data — fully typed responses
34
+ const { accounts } = await mm.getAccounts();
35
+ console.log(accounts[0].displayName, accounts[0].currentBalance);
36
+ ```
37
+
38
+ ## Authentication
39
+
40
+ ### Non-interactive
41
+
42
+ ```ts
43
+ await mm.login("email", "password", {
44
+ useSavedSession: true, // load token from disk if available (default)
45
+ saveSession: true, // persist token after login (default)
46
+ });
47
+ ```
48
+
49
+ ### With MFA secret key (automatic TOTP)
50
+
51
+ ```ts
52
+ await mm.login("email", "password", {
53
+ mfaSecretKey: "YOUR_BASE32_SECRET",
54
+ });
55
+ ```
56
+
57
+ The MFA secret is the "Two-factor text code" from **Settings > Security > Enable MFA** in Monarch Money.
58
+
59
+ ### Interactive CLI
60
+
61
+ ```ts
62
+ await mm.interactiveLogin(); // prompts for email, password, MFA code
63
+ ```
64
+
65
+ ### Direct token
66
+
67
+ ```ts
68
+ const mm = new MonarchMoney({ token: "your-existing-token" });
69
+ ```
70
+
71
+ ### Session persistence
72
+
73
+ ```ts
74
+ mm.saveSession(); // saves to .mm/mm_session.json (mode 0o600)
75
+ mm.loadSession(); // loads from disk
76
+ mm.deleteSession(); // removes the file
77
+ ```
78
+
79
+ ## API
80
+
81
+ All methods return **typed responses** — no `Record<string, unknown>`. Hover over any method in your editor for full JSDoc and type information.
82
+
83
+ ### Read Methods
84
+
85
+ | Method | Returns | Description |
86
+ |--------|---------|-------------|
87
+ | `getAccounts()` | `GetAccountsResponse` | All linked accounts |
88
+ | `getAccountTypeOptions()` | `GetAccountTypeOptionsResponse` | Available account types/subtypes |
89
+ | `getRecentAccountBalances(startDate?)` | `GetRecentAccountBalancesResponse` | Daily balances (default: last 31 days) |
90
+ | `getAccountSnapshotsByType(startDate, timeframe)` | `GetSnapshotsByAccountTypeResponse` | Snapshots by type (`"year"` / `"month"`) |
91
+ | `getAggregateSnapshots(options?)` | `GetAggregateSnapshotsResponse` | Aggregate net value over time |
92
+ | `getAccountHoldings(accountId)` | `GetAccountHoldingsResponse` | Securities in a brokerage account |
93
+ | `getAccountHistory(accountId)` | `AccountHistorySnapshot[]` | Daily balance history |
94
+ | `getInstitutions()` | `GetInstitutionsResponse` | Linked institutions |
95
+ | `getBudgets(startDate?, endDate?)` | `GetBudgetsResponse` | Budgets with actuals (default: last month → next month) |
96
+ | `getSubscriptionDetails()` | `GetSubscriptionDetailsResponse` | Plan status (trial, premium, etc.) |
97
+ | `getTransactionsSummary()` | `GetTransactionsSummaryResponse` | Aggregate summary |
98
+ | `getTransactions(options?)` | `GetTransactionsResponse` | Transactions with full filtering |
99
+ | `getTransactionCategories()` | `GetTransactionCategoriesResponse` | All categories |
100
+ | `getTransactionCategoryGroups()` | `GetTransactionCategoryGroupsResponse` | Category groups |
101
+ | `getTransactionDetails(id)` | typed response | Single transaction detail |
102
+ | `getTransactionSplits(id)` | typed response | Splits for a transaction |
103
+ | `getTransactionTags()` | `GetTransactionTagsResponse` | All tags |
104
+ | `getCashflow(options?)` | `GetCashflowResponse` | Cashflow by category, group, merchant |
105
+ | `getCashflowSummary(options?)` | `GetCashflowSummaryResponse` | Income, expense, savings, savings rate |
106
+ | `getRecurringTransactions(start?, end?)` | `GetRecurringTransactionsResponse` | Upcoming recurring transactions |
107
+ | `isAccountsRefreshComplete(ids?)` | `boolean` | Check refresh status |
108
+
109
+ ### Write Methods
110
+
111
+ | Method | Returns | Description |
112
+ |--------|---------|-------------|
113
+ | `createManualAccount(params)` | `CreateManualAccountResponse` | Create manual account |
114
+ | `updateAccount(id, updates)` | `UpdateAccountResponse` | Update account settings/balance |
115
+ | `deleteAccount(id)` | `DeleteAccountResponse` | Delete account |
116
+ | `requestAccountsRefresh(ids)` | `boolean` | Start refresh (non-blocking) |
117
+ | `requestAccountsRefreshAndWait(opts?)` | `boolean` | Refresh and poll until done |
118
+ | `createTransaction(params)` | `CreateTransactionResponse` | Create transaction |
119
+ | `updateTransaction(id, updates)` | `UpdateTransactionResponse` | Update transaction |
120
+ | `deleteTransaction(id)` | `boolean` | Delete transaction |
121
+ | `updateTransactionSplits(id, splits)` | `UpdateTransactionSplitResponse` | Manage splits |
122
+ | `createTransactionCategory(params)` | `CreateCategoryResponse` | Create category |
123
+ | `deleteTransactionCategory(id, moveTo?)` | `boolean` | Delete category |
124
+ | `deleteTransactionCategories(ids)` | `(boolean \| Error)[]` | Bulk delete |
125
+ | `createTransactionTag(name, color)` | `CreateTransactionTagResponse` | Create tag |
126
+ | `setTransactionTags(txId, tagIds)` | `SetTransactionTagsResponse` | Set tags on transaction |
127
+ | `setBudgetAmount(params)` | `SetBudgetAmountResponse` | Set/clear budget |
128
+ | `uploadAccountBalanceHistory(id, csv)` | `void` | Upload balance history CSV |
129
+
130
+ ## Error Handling
131
+
132
+ ```ts
133
+ import {
134
+ MonarchMoneyError, // base class for all errors
135
+ RequireMFAException, // MFA required — call multiFactorAuthenticate()
136
+ LoginFailedException, // bad credentials (includes .statusCode)
137
+ RequestFailedException // API/GraphQL failure (includes .statusCode, .graphQLErrors)
138
+ } from "monarchmoney";
139
+
140
+ try {
141
+ await mm.getAccounts();
142
+ } catch (e) {
143
+ if (e instanceof RequestFailedException) {
144
+ console.error(e.statusCode); // HTTP status, if applicable
145
+ console.error(e.graphQLErrors); // GraphQL errors array, if applicable
146
+ console.error(e.code); // "HTTP_ERROR" | "REQUEST_FAILED"
147
+ }
148
+ }
149
+ ```
150
+
151
+ ## Configuration
152
+
153
+ ```ts
154
+ const mm = new MonarchMoney({
155
+ sessionFile: ".mm/mm_session.json", // session file path
156
+ timeout: 10, // API timeout in seconds
157
+ token: "pre-existing-token", // skip login
158
+ });
159
+
160
+ mm.setTimeout(30); // change timeout later
161
+ ```
162
+
163
+ ## Project Structure
164
+
165
+ ```
166
+ src/
167
+ index.ts — public exports
168
+ client.ts — MonarchMoney class with all API methods
169
+ errors.ts — error classes (MonarchMoneyError hierarchy)
170
+ endpoints.ts — API URL constants
171
+ queries.ts — all GraphQL query/mutation strings
172
+ types.ts — TypeScript interfaces for all API responses
173
+ ```
174
+
175
+ ## FAQ
176
+
177
+ **How do I use this if I login to Monarch via Google?**
178
+
179
+ Set a password on your Monarch account at [Settings > Security](https://app.monarchmoney.com/settings/security), then use that password with this library.
180
+
181
+ ## Contributing
182
+
183
+ Contributions welcome. Please ensure TypeScript compiles cleanly (`npm run build`).
184
+
185
+ ## License
186
+
187
+ MIT
@@ -0,0 +1,262 @@
1
+ import type { GetAccountsResponse, GetAccountTypeOptionsResponse, GetRecentAccountBalancesResponse, GetSnapshotsByAccountTypeResponse, GetAggregateSnapshotsResponse, GetAccountHoldingsResponse, AccountHistorySnapshot, GetInstitutionsResponse, GetBudgetsResponse, GetSubscriptionDetailsResponse, GetTransactionsSummaryResponse, GetTransactionsResponse, GetTransactionCategoriesResponse, GetTransactionCategoryGroupsResponse, GetTransactionTagsResponse, GetCashflowResponse, GetCashflowSummaryResponse, GetRecurringTransactionsResponse, CreateManualAccountResponse, UpdateAccountResponse, DeleteAccountResponse, CreateTransactionResponse, UpdateTransactionResponse, CreateCategoryResponse, CreateTransactionTagResponse, SetTransactionTagsResponse, UpdateTransactionSplitResponse, SetBudgetAmountResponse } from "./types.js";
2
+ export interface MonarchMoneyOptions {
3
+ /** Path to the session file. Default: `.mm/mm_session.json` */
4
+ sessionFile?: string;
5
+ /** Timeout for API calls in seconds. Default: `10` */
6
+ timeout?: number;
7
+ /** Pre-existing auth token. Skips login if provided. */
8
+ token?: string;
9
+ }
10
+ export declare class MonarchMoney {
11
+ private _headers;
12
+ private _sessionFile;
13
+ private _token;
14
+ private _timeout;
15
+ constructor(options?: MonarchMoneyOptions);
16
+ /** Timeout for API calls, in seconds. */
17
+ get timeout(): number;
18
+ /** Sets the timeout for API calls, in seconds. */
19
+ setTimeout(timeoutSecs: number): void;
20
+ /** The current auth token, or `null` if not logged in. */
21
+ get token(): string | null;
22
+ /** Sets the auth token directly (e.g. from an external source). */
23
+ setToken(token: string): void;
24
+ /**
25
+ * Logs into Monarch Money.
26
+ *
27
+ * @param email - Account email address.
28
+ * @param password - Account password.
29
+ * @param options.useSavedSession - Load token from disk if available. Default: `true`.
30
+ * @param options.saveSession - Persist token to disk after login. Default: `true`.
31
+ * @param options.mfaSecretKey - TOTP secret for automatic MFA (base32). Bypasses MFA prompt.
32
+ * @throws {RequireMFAException} If MFA is required. Call `multiFactorAuthenticate()` next.
33
+ * @throws {LoginFailedException} If credentials are invalid.
34
+ */
35
+ login(email?: string, password?: string, options?: {
36
+ useSavedSession?: boolean;
37
+ saveSession?: boolean;
38
+ mfaSecretKey?: string;
39
+ }): Promise<void>;
40
+ /**
41
+ * Completes the MFA step after a `RequireMFAException`.
42
+ *
43
+ * @param email - Account email address.
44
+ * @param password - Account password.
45
+ * @param code - The 6-digit TOTP code.
46
+ */
47
+ multiFactorAuthenticate(email: string, password: string, code: string): Promise<void>;
48
+ /**
49
+ * Interactive CLI login that prompts for email, password, and MFA code if needed.
50
+ */
51
+ interactiveLogin(options?: {
52
+ useSavedSession?: boolean;
53
+ saveSession?: boolean;
54
+ }): Promise<void>;
55
+ /** Saves the current session token to disk. */
56
+ saveSession(filename?: string): void;
57
+ /** Loads a previously saved session token from disk. */
58
+ loadSession(filename?: string): void;
59
+ /** Deletes the session file from disk. */
60
+ deleteSession(filename?: string): void;
61
+ private _loginUser;
62
+ private _multiFactorAuthenticate;
63
+ private gqlCall;
64
+ private _getStartOfCurrentMonth;
65
+ private _getEndOfCurrentMonth;
66
+ /** Gets all accounts linked to Monarch Money. */
67
+ getAccounts(): Promise<GetAccountsResponse>;
68
+ /** Gets all available account types and their subtypes. */
69
+ getAccountTypeOptions(): Promise<GetAccountTypeOptionsResponse>;
70
+ /**
71
+ * Gets daily account balances starting from `startDate`.
72
+ * Defaults to 31 days ago if not specified.
73
+ */
74
+ getRecentAccountBalances(startDate?: string): Promise<GetRecentAccountBalancesResponse>;
75
+ /**
76
+ * Gets net-value snapshots grouped by account type.
77
+ * @param timeframe - `"year"` or `"month"` granularity.
78
+ */
79
+ getAccountSnapshotsByType(startDate: string, timeframe: "year" | "month"): Promise<GetSnapshotsByAccountTypeResponse>;
80
+ /** Gets daily aggregate net value across all accounts. */
81
+ getAggregateSnapshots(options?: {
82
+ startDate?: string;
83
+ endDate?: string;
84
+ accountType?: string;
85
+ }): Promise<GetAggregateSnapshotsResponse>;
86
+ /** Gets holdings (securities) for a brokerage or investment account. */
87
+ getAccountHoldings(accountId: string): Promise<GetAccountHoldingsResponse>;
88
+ /** Gets daily balance history for a specific account. */
89
+ getAccountHistory(accountId: string): Promise<AccountHistorySnapshot[]>;
90
+ /** Gets linked institutions and their credentials. */
91
+ getInstitutions(): Promise<GetInstitutionsResponse>;
92
+ /**
93
+ * Gets budgets with actual amounts for the given date range.
94
+ * Defaults to previous month through next month.
95
+ */
96
+ getBudgets(startDate?: string, endDate?: string): Promise<GetBudgetsResponse>;
97
+ /** Gets Monarch Money subscription details (plan status, trial, etc.). */
98
+ getSubscriptionDetails(): Promise<GetSubscriptionDetailsResponse>;
99
+ /** Gets aggregate transaction summary (totals, averages, counts). */
100
+ getTransactionsSummary(): Promise<GetTransactionsSummaryResponse>;
101
+ /**
102
+ * Gets transactions with filtering, pagination, and sorting.
103
+ * Defaults to the most recent 100 transactions.
104
+ */
105
+ getTransactions(options?: {
106
+ limit?: number;
107
+ offset?: number;
108
+ startDate?: string;
109
+ endDate?: string;
110
+ search?: string;
111
+ categoryIds?: string[];
112
+ accountIds?: string[];
113
+ tagIds?: string[];
114
+ hasAttachments?: boolean;
115
+ hasNotes?: boolean;
116
+ hiddenFromReports?: boolean;
117
+ isSplit?: boolean;
118
+ isRecurring?: boolean;
119
+ importedFromMint?: boolean;
120
+ syncedFromInstitution?: boolean;
121
+ }): Promise<GetTransactionsResponse>;
122
+ /** Gets all transaction categories. */
123
+ getTransactionCategories(): Promise<GetTransactionCategoriesResponse>;
124
+ /** Gets all category groups. */
125
+ getTransactionCategoryGroups(): Promise<GetTransactionCategoryGroupsResponse>;
126
+ /** Gets detailed data for a single transaction. */
127
+ getTransactionDetails(transactionId: string): Promise<Record<string, unknown>>;
128
+ /** Gets the splits for a transaction. */
129
+ getTransactionSplits(transactionId: string): Promise<Record<string, unknown>>;
130
+ /** Gets all tags configured in the account. */
131
+ getTransactionTags(): Promise<GetTransactionTagsResponse>;
132
+ /**
133
+ * Gets cashflow data grouped by category, category group, and merchant.
134
+ * Defaults to the current month.
135
+ */
136
+ getCashflow(options?: {
137
+ startDate?: string;
138
+ endDate?: string;
139
+ }): Promise<GetCashflowResponse>;
140
+ /**
141
+ * Gets cashflow summary (income, expenses, savings, savings rate).
142
+ * Defaults to the current month.
143
+ */
144
+ getCashflowSummary(options?: {
145
+ startDate?: string;
146
+ endDate?: string;
147
+ }): Promise<GetCashflowSummaryResponse>;
148
+ /**
149
+ * Gets upcoming recurring transactions for a date range.
150
+ * Defaults to the current month.
151
+ */
152
+ getRecurringTransactions(startDate?: string, endDate?: string): Promise<GetRecurringTransactionsResponse>;
153
+ /** Checks whether a prior account refresh request has completed. */
154
+ isAccountsRefreshComplete(accountIds?: string[]): Promise<boolean>;
155
+ /** Creates a new manual account. */
156
+ createManualAccount(params: {
157
+ accountType: string;
158
+ accountSubType: string;
159
+ isInNetWorth: boolean;
160
+ accountName: string;
161
+ accountBalance?: number;
162
+ }): Promise<CreateManualAccountResponse>;
163
+ /** Updates an account's settings and/or balance. */
164
+ updateAccount(accountId: string, updates: {
165
+ accountName?: string;
166
+ accountBalance?: number;
167
+ accountType?: string;
168
+ accountSubType?: string;
169
+ includeInNetWorth?: boolean;
170
+ hideFromSummaryList?: boolean;
171
+ hideTransactionsFromReports?: boolean;
172
+ }): Promise<UpdateAccountResponse>;
173
+ /** Deletes an account by ID. */
174
+ deleteAccount(accountId: string): Promise<DeleteAccountResponse>;
175
+ /**
176
+ * Requests an account balance/transaction refresh. Non-blocking.
177
+ * Use `isAccountsRefreshComplete()` to poll for status.
178
+ */
179
+ requestAccountsRefresh(accountIds: string[]): Promise<boolean>;
180
+ /**
181
+ * Refreshes accounts and polls until complete or timeout.
182
+ * @returns `true` if all accounts refreshed within the timeout, `false` otherwise.
183
+ */
184
+ requestAccountsRefreshAndWait(options?: {
185
+ accountIds?: string[];
186
+ /** Timeout in seconds. Default: `300` */
187
+ timeout?: number;
188
+ /** Polling interval in seconds. Default: `10` */
189
+ delay?: number;
190
+ }): Promise<boolean>;
191
+ /** Creates a new transaction. */
192
+ createTransaction(params: {
193
+ date: string;
194
+ accountId: string;
195
+ amount: number;
196
+ merchantName: string;
197
+ categoryId: string;
198
+ notes?: string;
199
+ updateBalance?: boolean;
200
+ }): Promise<CreateTransactionResponse>;
201
+ /**
202
+ * Updates an existing transaction. Only provided fields are changed.
203
+ */
204
+ updateTransaction(transactionId: string, updates: {
205
+ categoryId?: string;
206
+ merchantName?: string;
207
+ goalId?: string;
208
+ amount?: number;
209
+ date?: string;
210
+ hideFromReports?: boolean;
211
+ needsReview?: boolean;
212
+ notes?: string;
213
+ }): Promise<UpdateTransactionResponse>;
214
+ /** Deletes a transaction by ID. */
215
+ deleteTransaction(transactionId: string): Promise<boolean>;
216
+ /** Deletes a transaction category. Optionally moves transactions to another category. */
217
+ deleteTransactionCategory(categoryId: string, moveToCategoryId?: string): Promise<boolean>;
218
+ /** Deletes multiple transaction categories. Returns results per category. */
219
+ deleteTransactionCategories(categoryIds: string[]): Promise<(boolean | Error)[]>;
220
+ /** Creates a new transaction category within a category group. */
221
+ createTransactionCategory(params: {
222
+ groupId: string;
223
+ name: string;
224
+ icon?: string;
225
+ rolloverStartMonth?: string;
226
+ rolloverEnabled?: boolean;
227
+ rolloverType?: string;
228
+ }): Promise<CreateCategoryResponse>;
229
+ /** Creates a new tag for transactions. */
230
+ createTransactionTag(name: string, color: string): Promise<CreateTransactionTagResponse>;
231
+ /** Sets (replaces) all tags on a transaction. */
232
+ setTransactionTags(transactionId: string, tagIds: string[]): Promise<SetTransactionTagsResponse>;
233
+ /**
234
+ * Creates, modifies, or removes splits on a transaction.
235
+ * Pass an empty array to remove all splits.
236
+ * The sum of split amounts must equal the transaction amount.
237
+ */
238
+ updateTransactionSplits(transactionId: string, splitData: Array<{
239
+ merchantName: string;
240
+ amount: number;
241
+ categoryId: string;
242
+ }>): Promise<UpdateTransactionSplitResponse>;
243
+ /**
244
+ * Sets a budget amount for a category or category group.
245
+ * A zero amount clears the budget. Exactly one of `categoryId` or `categoryGroupId` is required.
246
+ */
247
+ setBudgetAmount(params: {
248
+ amount: number;
249
+ categoryId?: string;
250
+ categoryGroupId?: string;
251
+ timeframe?: string;
252
+ startDate?: string;
253
+ applyToFuture?: boolean;
254
+ }): Promise<SetBudgetAmountResponse>;
255
+ /**
256
+ * Uploads a CSV file of balance history for a manual account.
257
+ * @param accountId - The account to apply history to.
258
+ * @param csvContent - CSV string content.
259
+ */
260
+ uploadAccountBalanceHistory(accountId: string, csvContent: string): Promise<void>;
261
+ }
262
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}