@lunch-money/v2-api-spec 2.11.0-preview.8 → 2.11.1-docs.1

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.
@@ -2,55 +2,62 @@ openapi: 3.0.2
2
2
  info:
3
3
  title: Lunch Money API - v2
4
4
  description: |-
5
- Welcome to the Lunch Money v2 API reference. This is the **v2.11.0** spec. It includes previews of the proposed `/crypto` and `/balance_history` endpoints. Only the mock service works with these endpoints.<br><br>
6
- The most recent stable version of the API is v2.9.4 and is available at:
7
- `https://api.lunchmoney.dev/v2`
8
-
9
- ------------------------------------------------------------------------------------------------
10
-
11
5
  ### Introduction
12
6
 
7
+ Welcome to the Lunch Money v2 API reference. This is the **v2.11.1** spec.
8
+
13
9
  The API is available at `https://api.lunchmoney.dev/v2`. Get your access token from the [Lunch Money developers page](https://my.lunchmoney.app/developers).
14
10
 
15
- <span class="red-text"><strong>The v2 API is in open alpha and is still subject to change. Use the mock server or a test budget when getting started.</strong></span>
11
+
12
+ **Try it from these docs**
16
13
 
17
- **Static Mock Server**
14
+ These docs are interactive — use **Test request** on any endpoint to call the API from this page.
15
+ Choose a LIVE or MOCK service from the Server dropdown.
16
+ Requests sent to `https://api.lunchmoney.dev/v2` can <span class="red-text"><strong>change or delete</strong></span> your data and are <span class="red-text"><strong>permanent</strong></span>.
17
+ See the [Getting Started Guide](https://lunchmoney.dev/v2/getting-started) before using the live API.
18
+
19
+ **Static mock server**
18
20
 
19
- Explore the API without an access token or risk to real data. Select **"Static Mock v2 Lunch Money API Server"** from the Server dropdown, then set your Bearer token to any string with 11 or more characters.
21
+ Explore without risk to real data. Select `http://mock.lunchmoney.dev/v2` in the Server dropdown to work with static mock data.
22
+ POST, PUT, and DELETE requests will return realistic responses, but do not change the mock data.
23
+
20
24
 
21
25
  **Client Libraries & SDKs**
22
26
 
23
- An official TypeScript SDK is available on [NPM](https://www.npmjs.com/package/@lunch-money/v2-api-spec) and [GitHub](https://github.com/lunch-money/lunch-money-js-v2). For Python or other languages, see [lunchmoney-clients](https://github.com/juftin/lunchmoney-clients) or generate a client from this OpenAPI spec.
27
+ An official TypeScript SDK is available on [NPM](https://www.npmjs.com/package/@lunch-money/v2-api-spec) and [GitHub](https://github.com/lunch-money/lunch-money-js-v2). For Python or other languages, see [lunchmoney-clients](https://github.com/juftin/lunchmoney-clients) or generate a client from [this OpenAPI spec](/v2/openapi).
24
28
 
25
29
  **Migrating from v1**
26
30
 
27
- The v2 API is not backwards compatible with v1. See the [Migration Guide](https://alpha.lunchmoney.dev/v2/migration-guide) for details.
31
+ The v2 API is not backwards compatible with v1. See the [Migration Guide](https://lunchmoney.dev/v2/migration-guide) for details.
28
32
 
29
33
  **Useful links**
30
- - [Developer Portal](https://alpha.lunchmoney.dev/v2/introduction)
31
- - [Getting Started Guide](https://alpha.lunchmoney.dev/v2/getting-started)
32
- - [v2 API Overview](https://alpha.lunchmoney.dev/v2/overview)
33
- - [Version History](https://alpha.lunchmoney.dev/v2/version-history)
34
- - [Migration Guide](https://alpha.lunchmoney.dev/v2/migration-guide)
35
- - [Rate Limits](https://alpha.lunchmoney.dev/v2/rate-limits)
34
+ - [Getting Started Guide](https://lunchmoney.dev/v2/getting-started)
35
+ - [v2 API Overview](https://lunchmoney.dev/v2/overview)
36
+ - [Version History](https://lunchmoney.dev/v2/version-history)
37
+ - [Migration Guide](https://lunchmoney.dev/v2/migration-guide)
38
+ - [Rate Limits](https://lunchmoney.dev/v2/rate-limits)
36
39
  termsOfService: https://lunchmoney.dev/#current-status
37
40
  contact:
38
41
  email: devsupport@lunchmoney.app
39
42
  license:
40
43
  name: Apache 2.0
41
44
  url: http://www.apache.org/licenses/LICENSE-2.0.html
42
- version: 2.11.0
45
+ version: 2.11.1
43
46
 
44
47
  servers:
45
48
  - url: https://api.lunchmoney.dev/v2
46
- description: v2 Lunch Money API Server - changes will affect real data!
47
- # - url: https://mock.lunchmoney.dev/v2
48
- - url: https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/
49
- description: Static mock version of the v2 Lunch Money API Server
49
+ description: ⚠ LIVE — changes real Lunch Money data
50
+ - url: http://mock.lunchmoney.dev/v2
51
+ description: MOCK — static demo data, no API key required
50
52
 
51
53
  tags:
52
54
  - name: me
53
- description: View details and settings for the current user and account
55
+ description: View details and settings for the current user and account.<p>
56
+ Use [/me/user/settings](#tag/me/GET/me/user/settings) for user-wide
57
+ preferences, [/me/account/settings](#tag/me/GET/me/account/settings) for
58
+ account-wide preferences, and
59
+ [/me/user/account/settings](#tag/me/GET/me/user/account/settings) for
60
+ preferences specific to the current user and budget account.
54
61
  - name: categories
55
62
  description: Work with categories
56
63
  externalDocs:
@@ -77,7 +84,11 @@ tags:
77
84
  description: Learn more about crypto assets
78
85
  url: https://support.lunchmoney.app/setup/crypto
79
86
  - name: balance_history
80
- description: View and update historical account balances. Balance history is what drives the [Net Worth](https://my.lunchmoney.app/net-worth) views in the Lunch Money app. Balance history is generated for each account's balance on the first day of each month and can be edited in the Lunch Money app or via the API.
87
+ description: >-
88
+ View and update monthly account balances used by the
89
+ [Net Worth](https://my.lunchmoney.app/net-worth) views in the Lunch Money app.
90
+ History is monthly. The current month may be calculated on demand when
91
+ requested.
81
92
  - name: recurring_items
82
93
  description: Work with recurring items
83
94
  externalDocs:
@@ -113,8 +124,10 @@ tags:
113
124
  description: Learn more about transactions
114
125
  url: https://support.lunchmoney.app/finances/transactions
115
126
  - name: budgets
116
- description: View settings and modify budget amounts.<p> Use the
117
- [/summary](#tag/summary) endpoint to view the budget details performance.
127
+ description: View settings and modify budget amounts.<p> Use
128
+ [/budgets/settings](#tag/budgets/GET/budgets/settings) to view budget
129
+ period settings.<p> Use the [/summary](#tag/summary) endpoint to view
130
+ the budget details performance.
118
131
  externalDocs:
119
132
  description: Learn more about budgets
120
133
  url: https://support.lunchmoney.app/finances/budgets
@@ -142,12 +155,18 @@ components:
142
155
  account_id:
143
156
  type: integer
144
157
  format: int64
145
- description: Unique ID for the linked budgeting account
158
+ description: Unique ID for the current budget account
146
159
  budget_name:
147
160
  type: string
148
- description: Name of the linked budgeting account
161
+ description: Name of the current budget account.<p> Also available
162
+ as `display_name` on
163
+ [/me/account/settings](#tag/me/GET/me/account/settings), which is
164
+ the preferred endpoint for reading and updating account settings.
149
165
  primary_currency:
150
- description: Primary currency set in the user's settings
166
+ description: Primary currency for the current budget account.<p>
167
+ Also available on [/me/account/settings](#tag/me/GET/me/account/settings),
168
+ which is the preferred endpoint for reading and updating account
169
+ settings.
151
170
  allOf:
152
171
  - $ref: "#/components/schemas/currencyEnum"
153
172
  api_key_label:
@@ -983,16 +1002,19 @@ components:
983
1002
  example: Cold Wallet BTC
984
1003
  display_name:
985
1004
  type: string
1005
+ nullable: true
986
1006
  minLength: 1
987
1007
  maxLength: 45
988
- description: Optional display name for the manual crypto asset. If
989
- omitted, clients may derive one from `institution_name` + `name`.
1008
+ description: Display name for the manual crypto asset. If omitted or
1009
+ `null`, clients may derive one from `institution_name` + `name`.
990
1010
  example: Cold Storage
991
1011
  institution_name:
992
1012
  type: string
1013
+ nullable: true
993
1014
  minLength: 1
994
1015
  maxLength: 50
995
- description: Optional institution or wallet provider display name
1016
+ description: Institution or wallet provider display name. If omitted
1017
+ or `null`, no institution name is set.
996
1018
  example: Ledger
997
1019
  balance:
998
1020
  oneOf:
@@ -1248,15 +1270,19 @@ components:
1248
1270
  example: My Savings Account
1249
1271
  institution_name:
1250
1272
  type: string
1273
+ nullable: true
1251
1274
  example: Bank of the West
1252
- description: Name of institution holding the manual account
1275
+ description: Name of the institution holding the manual account. If
1276
+ omitted or `null`, no institution name is set.
1253
1277
  minLength: 1
1254
1278
  maxLength: 50
1255
1279
  display_name:
1256
1280
  type: string
1257
- description: Display name of the manual account as set by user or
1258
- derived from the `institution_name` and `name` if not explicitly
1259
- set.<br> This must be unique for the budgeting account.
1281
+ nullable: true
1282
+ description: Display name of the manual account. If omitted or
1283
+ `null`, it is derived from `institution_name` and `name`. An
1284
+ explicitly set display name must be unique for the budget
1285
+ account.
1260
1286
  example: Savings
1261
1287
  type:
1262
1288
  description: The type of manual account
@@ -1264,8 +1290,10 @@ components:
1264
1290
  - $ref: "#/components/schemas/accountTypeEnum"
1265
1291
  subtype:
1266
1292
  type: string
1267
- description: An optional manual account subtype. Examples include<br>
1268
- - retirement - checking - savings - prepaid credit card
1293
+ nullable: true
1294
+ description: Manual account subtype. If omitted or `null`, no subtype
1295
+ is set. Examples include retirement, checking, savings, and prepaid
1296
+ credit card.
1269
1297
  minLength: 1
1270
1298
  maxLength: 100
1271
1299
  example: prepaid credit card
@@ -1639,7 +1667,7 @@ components:
1639
1667
  type:
1640
1668
  type: string
1641
1669
  enum: [manual]
1642
- description: Identifies this entry as belonging to a manually-managed account.
1670
+ description: Identifies this entry as belonging to a manual account.
1643
1671
  manual_account_id:
1644
1672
  type: integer
1645
1673
  format: int32
@@ -1668,14 +1696,14 @@ components:
1668
1696
 
1669
1697
  balanceHistorySourceCryptoManual:
1670
1698
  type: object
1671
- description: Source information for a manually-tracked cryptocurrency balance history entry.
1699
+ description: Source information for a manual cryptocurrency balance history entry.
1672
1700
  additionalProperties: false
1673
1701
  x-internal: true
1674
1702
  properties:
1675
1703
  type:
1676
1704
  type: string
1677
1705
  enum: [crypto_manual]
1678
- description: Identifies this entry as belonging to a manually-tracked crypto account.
1706
+ description: Identifies this entry as belonging to a manual crypto account.
1679
1707
  crypto_manual_id:
1680
1708
  type: integer
1681
1709
  format: int32
@@ -1718,10 +1746,11 @@ components:
1718
1746
  type: object
1719
1747
  x-internal: true
1720
1748
  description: >
1721
- Source information for a balance history entry whose account has since been deleted.
1749
+ Source information for balance history whose account has since been deleted.
1722
1750
  Historical balances are preserved when a user chooses to keep history on account deletion.
1723
1751
  This object contains details that can be used to display the deleted account in the UI.
1724
- The `deleted_account_id` can be passed to `PUT /v2/balance_history/deleted/{account_id}/details`
1752
+ The `deleted_account_id` can be passed to
1753
+ [PUT /balance_history/deleted/{account_id}/details](#tag/balance-history/PUT/balance_history/deleted/{account_id}/details)
1725
1754
  to update the archived source metadata.
1726
1755
  additionalProperties: false
1727
1756
  properties:
@@ -1752,11 +1781,11 @@ components:
1752
1781
  subtype:
1753
1782
  type: string
1754
1783
  nullable: true
1755
- description: Archived `subtype`` of the deleted account source
1784
+ description: Archived `subtype` of the deleted account source
1756
1785
  mask:
1757
1786
  type: string
1758
1787
  nullable: true
1759
- description: Archived account `mask` for a deleted plaid account source
1788
+ description: Archived account `mask` for a deleted Plaid account source
1760
1789
  symbol:
1761
1790
  type: string
1762
1791
  nullable: true
@@ -1778,12 +1807,14 @@ components:
1778
1807
  type: object
1779
1808
  title: balance history for an account object
1780
1809
  additionalProperties: false
1781
- description: Historical balance entries grouped under a single account source.
1810
+ description: Monthly balance entries grouped under a single account source.
1782
1811
  properties:
1783
1812
  source:
1784
1813
  description: >
1785
- Identifies the account this balance entry belongs to. The shape varies by
1786
- `source.type`. Use `source.type` to determine which account id field is present.
1814
+ Identifies the account these balance entries belong to. The shape varies by
1815
+ `source.type`. Each source type exposes a type-specific account id field
1816
+ (`manual_account_id`, `plaid_account_id`, `crypto_manual_id`,
1817
+ `crypto_synced_id`, or `deleted_account_id`).
1787
1818
  oneOf:
1788
1819
  - $ref: "#/components/schemas/balanceHistorySourceManual"
1789
1820
  - $ref: "#/components/schemas/balanceHistorySourcePlaid"
@@ -1801,38 +1832,48 @@ components:
1801
1832
  balances:
1802
1833
  type: array
1803
1834
  description: >
1804
- Monthly balance history entries for the source account. On GET responses,
1805
- this includes all entries in the requested range. On PUT upsert responses,
1806
- this includes only the entries modified by that request.
1835
+ Monthly balance entries for this account source. A `historical` entry is
1836
+ a stored snapshot of a past month and includes an `id`. A `current` entry
1837
+ is an ephemeral snapshot based on the account's current balances and has
1838
+ no balance-entry `id`. On PUT upsert responses, this array includes only
1839
+ the `type: historical` entries modified by that request.
1807
1840
  items:
1808
- $ref: "#/components/schemas/balanceHistoryObject"
1841
+ $ref: "#/components/schemas/balanceHistoryEntry"
1809
1842
  required:
1810
1843
  - source
1811
1844
  - balances
1812
1845
 
1813
- balanceHistoryObject:
1846
+ historicalBalanceHistoryEntry:
1814
1847
  type: object
1815
- title: balance history entry object
1848
+ title: historical balance history entry
1816
1849
  additionalProperties: false
1817
1850
  x-internal: true
1818
- description: A historical balance entry for a single account on a single date.
1851
+ description: >
1852
+ A stored monthly balance for a past month. The `id` may be used with
1853
+ balance history entry endpoints. The balance represents the account
1854
+ balance at or around the end of `month`.
1819
1855
  properties:
1856
+ type:
1857
+ type: string
1858
+ enum: [historical]
1859
+ description: Identifies this entry as a stored snapshot of a past month.
1820
1860
  id:
1821
1861
  type: integer
1822
1862
  format: int32
1823
- description: Unique identifier of this historical balance entry.
1824
- date:
1863
+ description: Unique identifier for this historical balance entry.
1864
+ month:
1825
1865
  type: string
1826
- format: date
1827
- description: Date of this historical balance entry in YYYY-MM-DD format. This is always the first day of a month.
1866
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
1867
+ description: Calendar month for this entry in YYYY-MM format.
1868
+ example: "2026-06"
1828
1869
  balance:
1829
1870
  type: string
1830
1871
  pattern: ^-?\d+(\.\d{1,4})?$
1831
- description: Historical balance stored for this entry, as a numeric string with up to four decimal places. Trailing zeros and decimal places are not guaranteed in responses. For manual and Plaid accounts this is in the account currency. For crypto accounts this is in the user's primary currency.
1872
+ description: Historical balance for this entry, as a numeric string with up to four decimal places. Trailing zeros and decimal places are not guaranteed in responses. For manual and Plaid accounts this is in the account currency. For crypto accounts this is in the user's primary currency.
1832
1873
  currency:
1833
1874
  allOf:
1834
1875
  - $ref: "#/components/schemas/currencyEnum"
1835
- description: Currency of the stored `balance`. For crypto entries this is the user's primary currency.
1876
+ description: Currency of `balance`. For crypto entries this is the user's primary currency.
1836
1877
  to_base:
1837
1878
  type: number
1838
1879
  format: double
@@ -1841,19 +1882,82 @@ components:
1841
1882
  type: string
1842
1883
  nullable: true
1843
1884
  pattern: ^-?\d+(\.\d{1,18})?$
1844
- description: Crypto quantity stored for this balance entry, when available. This may be present for crypto or deleted-account entries and is `null` otherwise.
1885
+ description: Crypto quantity for this balance entry, when available. This may be present for crypto or deleted-account entries and is `null` otherwise.
1845
1886
  required:
1887
+ - type
1846
1888
  - id
1847
- - date
1889
+ - month
1848
1890
  - balance
1849
1891
  - currency
1850
1892
  - to_base
1851
1893
  - crypto_balance
1852
1894
 
1895
+ currentBalanceHistoryEntry:
1896
+ type: object
1897
+ title: current balance history entry
1898
+ additionalProperties: false
1899
+ x-internal: true
1900
+ description: >
1901
+ An ephemeral snapshot based on the account's current balances. It may
1902
+ change between requests.
1903
+ properties:
1904
+ type:
1905
+ type: string
1906
+ enum: [current]
1907
+ description: Identifies this entry as an ephemeral current-month snapshot.
1908
+ month:
1909
+ type: string
1910
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
1911
+ description: Calendar month for this entry in YYYY-MM format. For current entries this is the current month.
1912
+ example: "2026-07"
1913
+ balance:
1914
+ type: string
1915
+ pattern: ^-?\d+(\.\d{1,4})?$
1916
+ description: Calculated balance for the current month, as a numeric string with up to four decimal places. Trailing zeros and decimal places are not guaranteed in responses. For manual and Plaid accounts this is in the account currency. For crypto accounts this is in the user's primary currency.
1917
+ currency:
1918
+ allOf:
1919
+ - $ref: "#/components/schemas/currencyEnum"
1920
+ description: Currency of the calculated `balance`. For crypto entries this is the user's primary currency.
1921
+ to_base:
1922
+ type: number
1923
+ format: double
1924
+ description: Calculated balance converted to the user's primary currency. When the entry currency is the user's primary currency, this is the numeric value of `balance`.
1925
+ crypto_balance:
1926
+ type: string
1927
+ nullable: true
1928
+ pattern: ^-?\d+(\.\d{1,18})?$
1929
+ description: Crypto quantity for this calculated entry, when available. This may be present for crypto entries and is `null` otherwise.
1930
+ required:
1931
+ - type
1932
+ - month
1933
+ - balance
1934
+ - currency
1935
+ - to_base
1936
+ - crypto_balance
1937
+
1938
+ balanceHistoryEntry:
1939
+ title: balance history entry
1940
+ x-internal: true
1941
+ description: >
1942
+ A monthly balance history entry. Discriminated by `type`. `historical`
1943
+ entries are stored snapshots of past months with an `id`. `current`
1944
+ entries are ephemeral snapshots with no balance-entry `id`.
1945
+ oneOf:
1946
+ - $ref: "#/components/schemas/historicalBalanceHistoryEntry"
1947
+ - $ref: "#/components/schemas/currentBalanceHistoryEntry"
1948
+ discriminator:
1949
+ propertyName: type
1950
+ mapping:
1951
+ historical: "#/components/schemas/historicalBalanceHistoryEntry"
1952
+ current: "#/components/schemas/currentBalanceHistoryEntry"
1953
+
1853
1954
  balanceHistoryListResponseObject:
1854
1955
  type: object
1855
1956
  additionalProperties: false
1856
1957
  x-internal: true
1958
+ description: >
1959
+ List response for balance history GET endpoints. Entries are grouped by
1960
+ account source under `balance_history`.
1857
1961
  properties:
1858
1962
  balance_history:
1859
1963
  type: array
@@ -1866,31 +1970,39 @@ components:
1866
1970
  type: object
1867
1971
  x-internal: true
1868
1972
  additionalProperties: false
1973
+ description: >
1974
+ A single monthly balance entry to upsert. Request bodies use this shape.
1975
+ Responses return `type: historical` entries instead.
1869
1976
  properties:
1870
1977
  id:
1871
1978
  type: integer
1872
1979
  format: int32
1873
1980
  description: System-defined balance history entry id. Ignored if set.
1874
1981
  x-updatable: false
1875
- date:
1982
+ month:
1876
1983
  type: string
1877
- format: date
1878
- description: Month to update, in YYYY-MM-DD format. This must be the first day of a month and must be in a past month.
1984
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
1985
+ description: >
1986
+ Calendar month to upsert, in YYYY-MM format. Must be a past month.
1987
+ The current month cannot be written through PUT endpoints.
1988
+ example: "2026-06"
1879
1989
  balance:
1880
1990
  oneOf:
1881
1991
  - type: number
1882
1992
  format: double
1883
1993
  - type: string
1884
1994
  pattern: ^-?\d+(\.\d{1,4})?$
1885
- description: Numeric value of the historical balance, up to four decimal places, as a number or string. For manual and Plaid accounts this is typically in the account currency. For crypto and deleted accounts this is typically in the user's primary currency. Do not include any special characters aside from a decimal point.
1995
+ description: Numeric value of the historical balance, up to four decimal places, as a number or string. For manual and Plaid accounts this is in the account currency. For crypto and deleted accounts this is in the user's primary currency. Do not include any special characters aside from a decimal point.
1886
1996
  symbol:
1887
1997
  type: string
1888
1998
  nullable: true
1889
1999
  minLength: 1
1890
2000
  maxLength: 25
1891
- description: Optional for crypto balances, but if set it must match the account's symbol.
1892
- Tolerated for deleted-account balances. Do not provide this for manual or Plaid balances.
1893
- If provided when using the synced crypto path-based endpoint, this must match the symbol in the path.
2001
+ description: >
2002
+ Optional for crypto balances. If set, it must match the account's
2003
+ symbol. Tolerated for deleted-account balances. Do not provide this
2004
+ for manual or Plaid balances. On the synced crypto path endpoint, if
2005
+ provided it must match the `symbol` path parameter.
1894
2006
  x-updatable: true
1895
2007
  crypto_balance:
1896
2008
  type: string
@@ -1906,10 +2018,10 @@ components:
1906
2018
  to_base:
1907
2019
  type: number
1908
2020
  format: double
1909
- description: System-defined historical balance converted to the user's primary currency. Ignored if set. Use `balance` to update the stored historical balance.
2021
+ description: System-defined historical balance converted to the user's primary currency. Ignored if set. Use `balance` to update the historical balance.
1910
2022
  x-updatable: false
1911
2023
  required:
1912
- - date
2024
+ - month
1913
2025
  - balance
1914
2026
 
1915
2027
  upsertBalanceHistoryRequestObject:
@@ -1920,7 +2032,11 @@ components:
1920
2032
  balances:
1921
2033
  type: array
1922
2034
  minItems: 1
1923
- description: One or more monthly balance history entries to upsert
2035
+ description: >
2036
+ One or more monthly balance history entries to upsert. Each entry uses
2037
+ `month` (YYYY-MM) and `balance`. Do not include response-only fields such
2038
+ as `type`. PUT responses return only the `type: historical` entries
2039
+ modified by the request.
1924
2040
  items:
1925
2041
  $ref: "#/components/schemas/balanceHistoryUpdateItemObject"
1926
2042
  required:
@@ -1935,51 +2051,58 @@ components:
1935
2051
  name:
1936
2052
  type: string
1937
2053
  nullable: true
1938
- description: New archived account name for the deleted account source.
2054
+ description: New archived account name for the deleted account source
1939
2055
  institution_name:
1940
2056
  type: string
1941
2057
  nullable: true
1942
- description: New archived institution name for the deleted account source.
2058
+ description: New archived institution name for the deleted account source
1943
2059
  display_name:
1944
2060
  type: string
1945
2061
  nullable: true
1946
- description: New display name for the deleted account source.
2062
+ description: New display name for the deleted account source
1947
2063
  account_type:
1948
2064
  type: string
1949
2065
  nullable: true
1950
- description: New archived account type for the deleted account source.
2066
+ description: New archived account type for the deleted account source
1951
2067
  subtype:
1952
2068
  type: string
1953
2069
  nullable: true
1954
- description: New archived subtype for the deleted account source.
2070
+ description: New archived subtype for the deleted account source
1955
2071
  mask:
1956
2072
  type: string
1957
2073
  nullable: true
1958
- description: New archived account mask for the deleted account source.
2074
+ description: New archived account mask for the deleted account source
1959
2075
 
1960
2076
  updateBalanceHistoryDetailsResponseObject:
1961
2077
  type: object
1962
2078
  x-internal: true
1963
2079
  additionalProperties: false
2080
+ description: Updated archived metadata for a deleted balance history source
1964
2081
  properties:
1965
2082
  name:
1966
2083
  type: string
1967
2084
  nullable: true
2085
+ description: Archived account name for the deleted account source
1968
2086
  institution_name:
1969
2087
  type: string
1970
2088
  nullable: true
2089
+ description: Archived institution name for the deleted account source
1971
2090
  display_name:
1972
2091
  type: string
1973
2092
  nullable: true
2093
+ description: Archived display name for the deleted account source
1974
2094
  account_type:
1975
2095
  type: string
1976
2096
  nullable: true
2097
+ description: Archived account type for the deleted account source
1977
2098
  subtype:
1978
2099
  type: string
1979
2100
  nullable: true
2101
+ description: Archived subtype for the deleted account source
1980
2102
  mask:
1981
2103
  type: string
1982
2104
  nullable: true
2105
+ description: Archived account mask for the deleted account source
1983
2106
  required:
1984
2107
  - name
1985
2108
  - institution_name
@@ -2935,7 +3058,7 @@ components:
2935
3058
  currency:
2936
3059
  description: Three-letter lowercase currency code of the transaction
2937
3060
  in ISO 4217 format. Must match one of the [supported
2938
- currencies](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/currencies). If not set
3061
+ currencies](https://lunchmoney.dev/v2/currencies). If not set
2939
3062
  defaults to the user account's primary currency.
2940
3063
  allOf:
2941
3064
  - $ref: "#/components/schemas/currencyEnum"
@@ -3080,6 +3203,7 @@ components:
3080
3203
  description: |
3081
3204
  The new payee for the transaction.
3082
3205
  minLength: 0
3206
+ x-updatable: true
3083
3207
  original_name:
3084
3208
  type: string
3085
3209
  nullable: true
@@ -3291,9 +3415,10 @@ components:
3291
3415
  category_id:
3292
3416
  type: integer
3293
3417
  format: int32
3294
- description: Unique identifier for associated category_id. Category
3295
- must already exist for the account. Will inherit category from the
3296
- parent if not defined.
3418
+ nullable: true
3419
+ description: Category ID for the child transaction. The category must
3420
+ already exist for the account. If omitted, the child inherits the
3421
+ parent category. If `null`, the child has no category.
3297
3422
  tag_ids:
3298
3423
  type: array
3299
3424
  description: The IDs of any tags to apply to this split child
@@ -3303,7 +3428,10 @@ components:
3303
3428
  format: int32
3304
3429
  notes:
3305
3430
  type: string
3306
- description: Will inherit notes from parent if not defined.
3431
+ nullable: true
3432
+ description: Notes for the child transaction. If omitted, the child
3433
+ inherits the parent notes. If `null` or an empty string, the child
3434
+ has no notes.
3307
3435
  required:
3308
3436
  - amount
3309
3437
 
@@ -3612,10 +3740,11 @@ components:
3612
3740
 
3613
3741
  # Response body for GET /budgets/settings (200)
3614
3742
  budgetSettingsResponseObject:
3615
- x-internal: true
3616
3743
  type: object
3744
+ title: budget settings object
3617
3745
  additionalProperties: false
3618
- description: Budget period and display settings
3746
+ description: Budget period and display settings for the current budget
3747
+ account.
3619
3748
  properties:
3620
3749
  budget_period_granularity:
3621
3750
  type: string
@@ -3627,8 +3756,8 @@ components:
3627
3756
  - twice a month
3628
3757
  description: Budget period granularity
3629
3758
  budget_period_quantity:
3630
- type: number
3631
- format: double
3759
+ type: integer
3760
+ format: int32
3632
3761
  description: The number of `granularity` units that make up a single
3633
3762
  budgeting period.
3634
3763
  budget_period_anchor_date:
@@ -3670,6 +3799,530 @@ components:
3670
3799
  - budget_income_option
3671
3800
  - budget_rollover_left_to_budget
3672
3801
 
3802
+ weekStartsOnEnum:
3803
+ x-internal: true
3804
+ type: string
3805
+ title: week starts on enum
3806
+ enum:
3807
+ - sunday
3808
+ - monday
3809
+ description: The day on which a calendar week begins.
3810
+
3811
+ monthYearFormatEnum:
3812
+ x-internal: true
3813
+ type: string
3814
+ title: month and year format enum
3815
+ description: Format string for displaying month and year values
3816
+ in the Lunch Money app.
3817
+ enum:
3818
+ - "MMMM YYYY"
3819
+ - "MMM YYYY"
3820
+ - "YYYY MMM"
3821
+ - "MM YYYY"
3822
+ - "MM-YYYY"
3823
+ - "MM.YYYY"
3824
+ - "MM/YYYY"
3825
+ - "M YYYY"
3826
+ - "M-YYYY"
3827
+ - "M.YYYY"
3828
+ - "M/YYYY"
3829
+ - "YYYY M"
3830
+ - "YYYY-M"
3831
+ - "YYYY.M"
3832
+ - "YYYY/M"
3833
+ - "YYYY MM"
3834
+ - "YYYY-MM"
3835
+ - "YYYY.MM"
3836
+ - "YYYY/MM"
3837
+
3838
+ monthDayYearFormatEnum:
3839
+ x-internal: true
3840
+ type: string
3841
+ title: month, day and year format enum
3842
+ description: Format string for displaying full dates in the
3843
+ Lunch Money app.
3844
+ enum:
3845
+ - "MMM D, YYYY"
3846
+ - "D MMM YYYY"
3847
+ - "YYYY MM DD"
3848
+ - "YYYY-MM-DD"
3849
+ - "YYYY.MM.DD"
3850
+ - "YYYY/MM/DD"
3851
+ - "YYYY M DD"
3852
+ - "YYYY-M-DD"
3853
+ - "YYYY.M.DD"
3854
+ - "YYYY/M/DD"
3855
+ - "YYYY MM D"
3856
+ - "YYYY-MM-D"
3857
+ - "YYYY.MM.D"
3858
+ - "YYYY/MM/D"
3859
+ - "YYYY M D"
3860
+ - "YYYY-M-D"
3861
+ - "YYYY.M.D"
3862
+ - "YYYY/M/D"
3863
+ - "DD MM YYYY"
3864
+ - "DD-MM-YYYY"
3865
+ - "DD.MM.YYYY"
3866
+ - "DD/MM/YYYY"
3867
+ - "DD M YYYY"
3868
+ - "DD-M-YYYY"
3869
+ - "DD.M.YYYY"
3870
+ - "DD/M/YYYY"
3871
+ - "D MM YYYY"
3872
+ - "D-MM-YYYY"
3873
+ - "D.MM.YYYY"
3874
+ - "D/MM/YYYY"
3875
+ - "D M YYYY"
3876
+ - "D-M-YYYY"
3877
+ - "D.M.YYYY"
3878
+ - "D/M/YYYY"
3879
+ - "M D YYYY"
3880
+ - "M-D-YYYY"
3881
+ - "M.D.YYYY"
3882
+ - "M/D/YYYY"
3883
+ - "MM D YYYY"
3884
+ - "MM-D-YYYY"
3885
+ - "MM.D.YYYY"
3886
+ - "MM/D/YYYY"
3887
+ - "MM DD YYYY"
3888
+ - "MM-DD-YYYY"
3889
+ - "MM.DD.YYYY"
3890
+ - "MM/DD/YYYY"
3891
+ - "M DD YYYY"
3892
+ - "M-DD-YYYY"
3893
+ - "M.DD.YYYY"
3894
+ - "M/DD/YYYY"
3895
+
3896
+ monthDayFormatEnum:
3897
+ x-internal: true
3898
+ type: string
3899
+ title: month and day format enum
3900
+ description: Format string for displaying month and day values
3901
+ without a year.
3902
+ enum:
3903
+ - "MMM D"
3904
+ - "MMM DD"
3905
+ - "D MMM"
3906
+ - "DD MMM"
3907
+ - "MM D"
3908
+ - "MM-D"
3909
+ - "MM.D"
3910
+ - "MM/D"
3911
+ - "MM DD"
3912
+ - "MM-DD"
3913
+ - "MM.DD"
3914
+ - "MM/DD"
3915
+ - "M D"
3916
+ - "M-D"
3917
+ - "M.D"
3918
+ - "M/D"
3919
+ - "M DD"
3920
+ - "M-DD"
3921
+ - "M.DD"
3922
+ - "M/DD"
3923
+ - "D MM"
3924
+ - "D-MM"
3925
+ - "D.MM"
3926
+ - "D/MM"
3927
+ - "DD MM"
3928
+ - "DD-MM"
3929
+ - "DD.MM"
3930
+ - "DD/MM"
3931
+ - "D M"
3932
+ - "D-M"
3933
+ - "D.M"
3934
+ - "D/M"
3935
+ - "DD M"
3936
+ - "DD-M"
3937
+ - "DD.M"
3938
+ - "DD/M"
3939
+
3940
+ localeEnum:
3941
+ type: string
3942
+ title: locale enum
3943
+ description: Locale used for formatting numbers and currency amounts in
3944
+ the Lunch Money app.
3945
+ example: en-US
3946
+ enum:
3947
+ - sq-AL # Albanian (Albania)
3948
+ - be-BY # Belarusian (Belarus)
3949
+ - bg-BG # Bulgarian (Bulgaria)
3950
+ - ca-ES # Catalan (Spain)
3951
+ - zh-CN # Chinese (Simplified) (China)
3952
+ - zh-HK # Chinese (Traditional) (Hong Kong)
3953
+ - zh-TW # Chinese (Traditional) (Taiwan)
3954
+ - hr-HR # Croatian (Croatia)
3955
+ - cs-CZ # Czech (Czech Republic)
3956
+ - da-DK # Danish (Denmark)
3957
+ - nl-BE # Dutch (Belgium)
3958
+ - nl-NL # Dutch (Netherlands)
3959
+ - en-AU # English (Australia)
3960
+ - en-CA # English (Canada)
3961
+ - en-IN # English (India)
3962
+ - en-IE # English (Ireland)
3963
+ - en-MT # English (Malta)
3964
+ - en-NZ # English (New Zealand)
3965
+ - en-PH # English (Philippines)
3966
+ - en-SG # English (Singapore)
3967
+ - en-ZA # English (South Africa)
3968
+ - en-GB # English (United Kingdom)
3969
+ - en-US # English (United States)
3970
+ - et-EE # Estonian (Estonia)
3971
+ - fi-FI # Finnish (Finland)
3972
+ - fr-BE # French (Belgium)
3973
+ - fr-CA # French (Canada)
3974
+ - fr-FR # French (France)
3975
+ - fr-LU # French (Luxembourg)
3976
+ - fr-CH # French (Switzerland)
3977
+ - de-AT # German (Austria)
3978
+ - de-DE # German (Germany)
3979
+ - de-LU # German (Luxembourg)
3980
+ - de-CH # German (Switzerland)
3981
+ - el-CY # Greek (Cyprus)
3982
+ - el-GR # Greek (Greece)
3983
+ - iw-IL # Hebrew (Israel); modern replacement: he-IL
3984
+ - hi-IN # Hindi (India)
3985
+ - hu-HU # Hungarian (Hungary)
3986
+ - is-IS # Icelandic (Iceland)
3987
+ - in-ID # Indonesian (Indonesia); modern replacement: id-ID
3988
+ - ga-IE # Irish (Ireland)
3989
+ - it-IT # Italian (Italy)
3990
+ - it-CH # Italian (Switzerland)
3991
+ - ja-JP # Japanese (Japan)
3992
+ - ko-KR # Korean (South Korea)
3993
+ - lv-LV # Latvian (Latvia)
3994
+ - lt-LT # Lithuanian (Lithuania)
3995
+ - mk-MK # Macedonian (Macedonia)
3996
+ - ms-MY # Malay (Malaysia)
3997
+ - mt-MT # Maltese (Malta)
3998
+ - no-NO # Norwegian (Norway)
3999
+ - pl-PL # Polish (Poland)
4000
+ - pt-BR # Portuguese (Brazil)
4001
+ - pt-PT # Portuguese (Portugal)
4002
+ - ro-RO # Romanian (Romania)
4003
+ - ru-RU # Russian (Russia)
4004
+ - sk-SK # Slovak (Slovakia)
4005
+ - sl-SI # Slovenian (Slovenia)
4006
+ - es-AR # Spanish (Argentina)
4007
+ - es-BO # Spanish (Bolivia)
4008
+ - es-CL # Spanish (Chile)
4009
+ - es-CO # Spanish (Colombia)
4010
+ - es-CR # Spanish (Costa Rica)
4011
+ - es-DO # Spanish (Dominican Republic)
4012
+ - es-EC # Spanish (Ecuador)
4013
+ - es-SV # Spanish (El Salvador)
4014
+ - es-GT # Spanish (Guatemala)
4015
+ - es-HN # Spanish (Honduras)
4016
+ - es-MX # Spanish (Mexico)
4017
+ - es-NI # Spanish (Nicaragua)
4018
+ - es-PA # Spanish (Panama)
4019
+ - es-PY # Spanish (Paraguay)
4020
+ - es-PE # Spanish (Peru)
4021
+ - es-PR # Spanish (Puerto Rico)
4022
+ - es-ES # Spanish (Spain)
4023
+ - es-US # Spanish (United States)
4024
+ - es-UY # Spanish (Uruguay)
4025
+ - es-VE # Spanish (Venezuela)
4026
+ - sv-SE # Swedish (Sweden)
4027
+ - th-TH # Thai (Thailand)
4028
+ - tr-TR # Turkish (Turkey)
4029
+ - uk-UA # Ukrainian (Ukraine)
4030
+ - vi-VN # Vietnamese (Vietnam)
4031
+
4032
+ accountSettingsObject:
4033
+ type: object
4034
+ title: account settings object
4035
+ additionalProperties: false
4036
+ description: Account-level settings for the budget account
4037
+ associated with the authorized API token.
4038
+ properties:
4039
+ primary_currency:
4040
+ description: Primary currency for the account.
4041
+ allOf:
4042
+ - $ref: "#/components/schemas/currencyEnum"
4043
+ supported_currencies:
4044
+ type: array
4045
+ items:
4046
+ $ref: "#/components/schemas/currencyEnum"
4047
+ description: Currencies available when creating or editing transactions,
4048
+ balances, and other amounts in the Lunch Money app.
4049
+ display_name:
4050
+ type: string
4051
+ nullable: true
4052
+ description: Display name of the budget account in the Lunch Money
4053
+ app.
4054
+ locale:
4055
+ allOf:
4056
+ - $ref: "#/components/schemas/localeEnum"
4057
+ example: en-US
4058
+ description: Locale used for formatting numbers and currency amounts
4059
+ in the Lunch Money app (for example, `en-US`). See
4060
+ [Supported Locales](https://lunchmoney.dev/v2/locales) for accepted
4061
+ values. Date presentation is configured separately through
4062
+ [GET /me/user/settings](#tag/me/GET/me/user/settings) and
4063
+ [PUT /me/user/settings](#tag/me/PUT/me/user/settings). When no
4064
+ locale is explicitly stored for the account, the effective locale
4065
+ is derived from the `default_locale` associated with
4066
+ `primary_currency` in the currencies table (for example, `usd` →
4067
+ `en-US`, `cad` → `en-CA`, `gbp` → `en-GB`).
4068
+ auto_create_category_rules:
4069
+ type: boolean
4070
+ default: true
4071
+ description: If `true`, category rules are created automatically when
4072
+ categorizing transactions.
4073
+ auto_create_suggested_transaction_rules:
4074
+ type: boolean
4075
+ default: true
4076
+ description: If `true`, suggested transaction rules are created
4077
+ automatically.
4078
+ include_pending_in_totals:
4079
+ type: boolean
4080
+ default: true
4081
+ description: If `true`, pending transactions are included in account
4082
+ totals.
4083
+ required:
4084
+ - primary_currency
4085
+ - supported_currencies
4086
+ - display_name
4087
+ - locale
4088
+ - auto_create_category_rules
4089
+ - auto_create_suggested_transaction_rules
4090
+ - include_pending_in_totals
4091
+
4092
+ updateAccountSettingsRequestObject:
4093
+ x-internal: true
4094
+ type: object
4095
+ additionalProperties: false
4096
+ minProperties: 1
4097
+ description: Request body for updating account settings. Include at least
4098
+ one property to update.
4099
+ properties:
4100
+ primary_currency:
4101
+ allOf:
4102
+ - $ref: "#/components/schemas/currencyEnum"
4103
+ description: If set, updates the account's primary currency.
4104
+ x-updatable: true
4105
+ supported_currencies:
4106
+ type: array
4107
+ items:
4108
+ $ref: "#/components/schemas/currencyEnum"
4109
+ description: If set, replaces the list of supported currencies for the
4110
+ account.
4111
+ x-updatable: true
4112
+ display_name:
4113
+ type: string
4114
+ nullable: true
4115
+ description: If set, updates the display name of the budget account.
4116
+ x-updatable: true
4117
+ locale:
4118
+ allOf:
4119
+ - $ref: "#/components/schemas/localeEnum"
4120
+ example: en-US
4121
+ description: If set, updates the locale used for formatting numbers
4122
+ and currency amounts in the Lunch Money app. See
4123
+ [Supported Locales](https://lunchmoney.dev/v2/locales) for accepted
4124
+ values. Date presentation is configured separately through
4125
+ [GET /me/user/settings](#tag/me/GET/me/user/settings) and
4126
+ [PUT /me/user/settings](#tag/me/PUT/me/user/settings).
4127
+ x-updatable: true
4128
+ auto_create_category_rules:
4129
+ type: boolean
4130
+ description: If set, updates whether category rules are created
4131
+ automatically.
4132
+ x-updatable: true
4133
+ auto_create_suggested_transaction_rules:
4134
+ type: boolean
4135
+ description: If set, updates whether suggested transaction rules are
4136
+ created automatically.
4137
+ x-updatable: true
4138
+ include_pending_in_totals:
4139
+ type: boolean
4140
+ description: If set, updates whether pending transactions are included
4141
+ in account totals.
4142
+ x-updatable: true
4143
+
4144
+ userAccountSettingsObject:
4145
+ type: object
4146
+ title: user account settings object
4147
+ additionalProperties: false
4148
+ description: Settings specific to the authorized user within the current
4149
+ budget account.
4150
+ properties:
4151
+ auto_review_transaction_on_update:
4152
+ type: boolean
4153
+ default: true
4154
+ description: If `true`, transactions are marked as reviewed when their
4155
+ date, category, payee, amount, account, or notes are changed.
4156
+ auto_review_transaction_on_creation:
4157
+ type: boolean
4158
+ default: true
4159
+ description: If `true`, new manual transactions start as reviewed. If
4160
+ `false`, they start as unreviewed.
4161
+ default_manual_account_id:
4162
+ type: integer
4163
+ nullable: true
4164
+ description: Manual account selected by default when the user creates a
4165
+ manual transaction in the current budget account. Must identify a
4166
+ manual account returned by
4167
+ [GET /manual_accounts](#tag/manual_accounts/GET/manual_accounts) for
4168
+ the current budget account. Set to `null` to clear the selection.
4169
+ required:
4170
+ - auto_review_transaction_on_update
4171
+ - auto_review_transaction_on_creation
4172
+ - default_manual_account_id
4173
+
4174
+ updateUserAccountSettingsRequestObject:
4175
+ x-internal: true
4176
+ type: object
4177
+ additionalProperties: false
4178
+ minProperties: 1
4179
+ description: Request body for updating settings specific to the authorized
4180
+ user within the current budget account. Include at least one property
4181
+ to update.
4182
+ properties:
4183
+ auto_review_transaction_on_update:
4184
+ type: boolean
4185
+ description: If set, updates whether transactions are marked as reviewed
4186
+ when their date, category, payee, amount, account, or notes are
4187
+ changed.
4188
+ x-updatable: true
4189
+ auto_review_transaction_on_creation:
4190
+ type: boolean
4191
+ description: If set, updates whether new manual transactions start as
4192
+ reviewed or unreviewed.
4193
+ x-updatable: true
4194
+ default_manual_account_id:
4195
+ type: integer
4196
+ nullable: true
4197
+ description: If set, updates the manual account selected by default when
4198
+ the user creates a manual transaction in the current budget
4199
+ account. Must identify a manual account returned by
4200
+ [GET /manual_accounts](#tag/manual_accounts/GET/manual_accounts) for
4201
+ the current budget account. Set to `null` to clear the selection.
4202
+ x-updatable: true
4203
+
4204
+ userSettingsObject:
4205
+ type: object
4206
+ title: user settings object
4207
+ additionalProperties: false
4208
+ description: User-level display and formatting preferences for the user
4209
+ associated with the authorized API token.
4210
+ properties:
4211
+ show_debits_as_negative:
4212
+ type: boolean
4213
+ default: true
4214
+ description: Display preference for how amounts are shown in the Lunch
4215
+ Money app. When `true`, debits are shown as negative values and
4216
+ credits as positive values.<p> This setting does **not** change
4217
+ amount sign conventions in API responses. Amount fields such as
4218
+ `amount` and `to_base` on transaction objects always use positive
4219
+ values for debits and negative values for credits.
4220
+ auto_suggest_payee:
4221
+ type: boolean
4222
+ default: true
4223
+ description: If `true`, payee suggestions are shown when entering
4224
+ transactions in the Lunch Money app.
4225
+ month_year_format:
4226
+ allOf:
4227
+ - $ref: "#/components/schemas/monthYearFormatEnum"
4228
+ default: "MMM YYYY"
4229
+ description: Format string used when displaying month and year values.
4230
+ month_day_year_format:
4231
+ allOf:
4232
+ - $ref: "#/components/schemas/monthDayYearFormatEnum"
4233
+ default: "MMM D, YYYY"
4234
+ description: Format string used when displaying full dates (month, day,
4235
+ and year).
4236
+ month_day_format:
4237
+ allOf:
4238
+ - $ref: "#/components/schemas/monthDayFormatEnum"
4239
+ default: "MMM D"
4240
+ description: Format string used when displaying month and day values
4241
+ without a year.
4242
+ show_am_pm:
4243
+ type: boolean
4244
+ default: true
4245
+ description: If `true`, times are displayed using a 12-hour clock with
4246
+ AM/PM. If `false`, times are displayed using a 24-hour clock.
4247
+ week_starts_on:
4248
+ allOf:
4249
+ - $ref: "#/components/schemas/weekStartsOnEnum"
4250
+ default: sunday
4251
+ description: The day on which a calendar week begins.
4252
+ always_display_year:
4253
+ type: boolean
4254
+ default: false
4255
+ description: If `true`, dates always include the year and
4256
+ `month_day_format` is not used.
4257
+ always_display_weekday:
4258
+ type: boolean
4259
+ default: true
4260
+ description: If `true`, weekday names are included when displaying
4261
+ dates.
4262
+ required:
4263
+ - show_debits_as_negative
4264
+ - auto_suggest_payee
4265
+ - month_year_format
4266
+ - month_day_year_format
4267
+ - month_day_format
4268
+ - show_am_pm
4269
+ - week_starts_on
4270
+ - always_display_year
4271
+ - always_display_weekday
4272
+
4273
+ updateUserSettingsRequestObject:
4274
+ x-internal: true
4275
+ type: object
4276
+ additionalProperties: false
4277
+ minProperties: 1
4278
+ description: Request body for updating user settings. Include at least one
4279
+ property to update.
4280
+ properties:
4281
+ show_debits_as_negative:
4282
+ type: boolean
4283
+ description: If set, updates the display preference for amount signs in
4284
+ the Lunch Money app. Does not affect amount sign conventions in API
4285
+ responses.
4286
+ x-updatable: true
4287
+ auto_suggest_payee:
4288
+ type: boolean
4289
+ description: If set, updates whether payee suggestions are shown.
4290
+ x-updatable: true
4291
+ month_year_format:
4292
+ allOf:
4293
+ - $ref: "#/components/schemas/monthYearFormatEnum"
4294
+ description: If set, updates the month and year display format.
4295
+ x-updatable: true
4296
+ month_day_year_format:
4297
+ allOf:
4298
+ - $ref: "#/components/schemas/monthDayYearFormatEnum"
4299
+ description: If set, updates the full date display format.
4300
+ x-updatable: true
4301
+ month_day_format:
4302
+ allOf:
4303
+ - $ref: "#/components/schemas/monthDayFormatEnum"
4304
+ description: If set, updates the month and day display format.
4305
+ x-updatable: true
4306
+ show_am_pm:
4307
+ type: boolean
4308
+ description: If set, updates whether times use a 12-hour (AM/PM) or
4309
+ 24-hour clock.
4310
+ x-updatable: true
4311
+ week_starts_on:
4312
+ allOf:
4313
+ - $ref: "#/components/schemas/weekStartsOnEnum"
4314
+ description: If set, updates the day on which a calendar week begins.
4315
+ x-updatable: true
4316
+ always_display_year:
4317
+ type: boolean
4318
+ description: If set, updates whether dates always include the year.
4319
+ x-updatable: true
4320
+ always_display_weekday:
4321
+ type: boolean
4322
+ description: If set, updates whether weekday names are shown when
4323
+ displaying dates.
4324
+ x-updatable: true
4325
+
3673
4326
  # Summary endpoint response schemas
3674
4327
  summaryResponseObject:
3675
4328
  type: object
@@ -4445,22 +5098,10 @@ components:
4445
5098
  securitySchemes:
4446
5099
  bearerSecurity:
4447
5100
  type: http
4448
- # TODO Make this shorter?
4449
- # description: The Lunch Money API uses API keys to authenticate requests. To use
4450
- # the v1 API you can view and manage your API keys on the [developers page
4451
- # in the Lunch Money app](https://my.lunchmoney.app/developers). <p> To
4452
- # interact with the Static Mock Server simply enter an API key of 11
4453
- # characters or more. <p> To interact with the v2 service implemented on
4454
- # top of the v1 API paste in a real API token associated with a Lunch
4455
- # Money Budget.
4456
- description: To interact with the Static Mock Server simply enter an API
4457
- key of 11 characters or more.
5101
+ description: >-
5102
+ Required for the LIVE server. Optional for MOCK.
4458
5103
  scheme: bearer
4459
5104
  bearerFormat: JWT
4460
- cookieAuth:
4461
- type: apiKey
4462
- in: cookie
4463
- name: _lm_access_token
4464
5105
 
4465
5106
  paths:
4466
5107
  /me:
@@ -4468,8 +5109,16 @@ paths:
4468
5109
  tags:
4469
5110
  - me
4470
5111
  summary: Get current user
4471
- description: Get details about the user associated with the supplied
4472
- authorization token.
5112
+ description: |-
5113
+ Get details about the user associated with the supplied authorization
5114
+ token.<p> Use [/me/user/settings](#tag/me/GET/me/user/settings) for
5115
+ user-wide preferences,
5116
+ [/me/account/settings](#tag/me/GET/me/account/settings) for account-wide
5117
+ preferences, and
5118
+ [/me/user/account/settings](#tag/me/GET/me/user/account/settings) for
5119
+ preferences specific to the current user and budget account.
5120
+ Properties such as `primary_currency` and `budget_name` remain on this
5121
+ response for backwards compatibility.
4473
5122
  operationId: getMe
4474
5123
  parameters: []
4475
5124
  responses:
@@ -4493,6 +5142,247 @@ paths:
4493
5142
  $ref: "#/components/responses/rateLimited"
4494
5143
  "500":
4495
5144
  $ref: "#/components/responses/serverError"
5145
+ /me/account/settings:
5146
+ get:
5147
+ tags:
5148
+ - me
5149
+ summary: Get account settings
5150
+ description: >-
5151
+ Returns settings for the current budget account. These settings apply
5152
+ regardless of which user is accessing the account.
5153
+ operationId: getAccountSettings
5154
+ responses:
5155
+ "200":
5156
+ description: Account settings for the current budget account
5157
+ content:
5158
+ application/json:
5159
+ schema:
5160
+ $ref: "#/components/schemas/accountSettingsObject"
5161
+ example:
5162
+ primary_currency: usd
5163
+ supported_currencies:
5164
+ - usd
5165
+ - cad
5166
+ - jpy
5167
+ display_name: "\U0001F3E0 Family budget"
5168
+ locale: en-US
5169
+ auto_create_category_rules: true
5170
+ auto_create_suggested_transaction_rules: true
5171
+ include_pending_in_totals: true
5172
+ "401":
5173
+ $ref: "#/components/responses/unauthorizedToken"
5174
+ "429":
5175
+ $ref: "#/components/responses/rateLimited"
5176
+ "500":
5177
+ $ref: "#/components/responses/serverError"
5178
+ put:
5179
+ tags:
5180
+ - me
5181
+ summary: Update account settings
5182
+ description: |-
5183
+ Updates account-level settings for the budget account
5184
+ associated with the authorized API token. Submit the full response from
5185
+ `GET /me/account/settings` with one or more properties changed, or
5186
+ provide only the properties to update. The request body must include at
5187
+ least one property.
5188
+ operationId: updateAccountSettings
5189
+ requestBody:
5190
+ required: true
5191
+ content:
5192
+ application/json:
5193
+ schema:
5194
+ $ref: "#/components/schemas/updateAccountSettingsRequestObject"
5195
+ examples:
5196
+ Update display name:
5197
+ value:
5198
+ display_name: "Travel budget"
5199
+ Update automation preferences:
5200
+ value:
5201
+ auto_create_category_rules: false
5202
+ include_pending_in_totals: false
5203
+ responses:
5204
+ "200":
5205
+ description: Account settings updated successfully
5206
+ content:
5207
+ application/json:
5208
+ schema:
5209
+ $ref: "#/components/schemas/accountSettingsObject"
5210
+ "400":
5211
+ description: Invalid request body
5212
+ content:
5213
+ application/json:
5214
+ schema:
5215
+ $ref: "#/components/schemas/errorResponseObject"
5216
+ "401":
5217
+ $ref: "#/components/responses/unauthorizedToken"
5218
+ "429":
5219
+ $ref: "#/components/responses/rateLimited"
5220
+ "500":
5221
+ $ref: "#/components/responses/serverError"
5222
+ /me/user/settings:
5223
+ get:
5224
+ tags:
5225
+ - me
5226
+ summary: Get user settings
5227
+ description: >-
5228
+ Returns display and formatting preferences for the authorized user.
5229
+ These settings apply across every budget account the user owns or
5230
+ collaborates on.
5231
+ operationId: getUserSettings
5232
+ responses:
5233
+ "200":
5234
+ description: User settings for the authorized user
5235
+ content:
5236
+ application/json:
5237
+ schema:
5238
+ $ref: "#/components/schemas/userSettingsObject"
5239
+ example:
5240
+ show_debits_as_negative: true
5241
+ auto_suggest_payee: true
5242
+ month_year_format: "MMM YYYY"
5243
+ month_day_year_format: "MMM D, YYYY"
5244
+ month_day_format: "MMM D"
5245
+ show_am_pm: true
5246
+ week_starts_on: sunday
5247
+ always_display_year: false
5248
+ always_display_weekday: true
5249
+ "401":
5250
+ $ref: "#/components/responses/unauthorizedToken"
5251
+ "429":
5252
+ $ref: "#/components/responses/rateLimited"
5253
+ "500":
5254
+ $ref: "#/components/responses/serverError"
5255
+ put:
5256
+ tags:
5257
+ - me
5258
+ summary: Update user settings
5259
+ description: |-
5260
+ Updates user-level display and formatting preferences for the user
5261
+ associated with the authorized API token. Submit the full response from
5262
+ `GET /me/user/settings` with one or more properties changed, or provide
5263
+ only the properties to update. The request body must include at least
5264
+ one property.<p> Updating
5265
+ `show_debits_as_negative` affects display in the Lunch Money app only.
5266
+ Amount fields in API responses always use positive values for debits and
5267
+ negative values for credits.
5268
+ operationId: updateUserSettings
5269
+ requestBody:
5270
+ required: true
5271
+ content:
5272
+ application/json:
5273
+ schema:
5274
+ $ref: "#/components/schemas/updateUserSettingsRequestObject"
5275
+ examples:
5276
+ Update date formats:
5277
+ value:
5278
+ month_year_format: "YYYY-MM"
5279
+ month_day_year_format: "YYYY-MM-DD"
5280
+ month_day_format: "MM-DD"
5281
+ Use 24-hour time and Monday week start:
5282
+ value:
5283
+ show_am_pm: false
5284
+ week_starts_on: monday
5285
+ responses:
5286
+ "200":
5287
+ description: User settings updated successfully
5288
+ content:
5289
+ application/json:
5290
+ schema:
5291
+ $ref: "#/components/schemas/userSettingsObject"
5292
+ "400":
5293
+ description: Invalid request body
5294
+ content:
5295
+ application/json:
5296
+ schema:
5297
+ $ref: "#/components/schemas/errorResponseObject"
5298
+ "401":
5299
+ $ref: "#/components/responses/unauthorizedToken"
5300
+ "429":
5301
+ $ref: "#/components/responses/rateLimited"
5302
+ "500":
5303
+ $ref: "#/components/responses/serverError"
5304
+ /me/user/account/settings:
5305
+ get:
5306
+ tags:
5307
+ - me
5308
+ summary: Get user account settings
5309
+ description: >-
5310
+ Returns settings specific to the authorized user within the current
5311
+ budget account. These settings do not affect other users or the
5312
+ authorized user's settings in other budget accounts.
5313
+ operationId: getUserAccountSettings
5314
+ responses:
5315
+ "200":
5316
+ description: Settings for the authorized user in the current budget
5317
+ account
5318
+ content:
5319
+ application/json:
5320
+ schema:
5321
+ $ref: "#/components/schemas/userAccountSettingsObject"
5322
+ example:
5323
+ auto_review_transaction_on_update: true
5324
+ auto_review_transaction_on_creation: true
5325
+ default_manual_account_id: null
5326
+ "401":
5327
+ $ref: "#/components/responses/unauthorizedToken"
5328
+ "429":
5329
+ $ref: "#/components/responses/rateLimited"
5330
+ "500":
5331
+ $ref: "#/components/responses/serverError"
5332
+ put:
5333
+ tags:
5334
+ - me
5335
+ summary: Update user account settings
5336
+ description: |-
5337
+ Updates settings specific to the authorized user within the current
5338
+ budget account. Submit the full response from
5339
+ `GET /me/user/account/settings` with one or more properties changed, or
5340
+ provide only the properties to update. The request body must include at
5341
+ least one property.
5342
+ operationId: updateUserAccountSettings
5343
+ requestBody:
5344
+ required: true
5345
+ content:
5346
+ application/json:
5347
+ schema:
5348
+ $ref: "#/components/schemas/updateUserAccountSettingsRequestObject"
5349
+ examples:
5350
+ Update review preference:
5351
+ value:
5352
+ auto_review_transaction_on_creation: false
5353
+ Clear default manual account:
5354
+ value:
5355
+ default_manual_account_id: null
5356
+ responses:
5357
+ "200":
5358
+ description: User account settings updated successfully
5359
+ content:
5360
+ application/json:
5361
+ schema:
5362
+ $ref: "#/components/schemas/userAccountSettingsObject"
5363
+ examples:
5364
+ Update review preference:
5365
+ value:
5366
+ auto_review_transaction_on_update: true
5367
+ auto_review_transaction_on_creation: false
5368
+ default_manual_account_id: null
5369
+ Clear default manual account:
5370
+ value:
5371
+ auto_review_transaction_on_update: true
5372
+ auto_review_transaction_on_creation: true
5373
+ default_manual_account_id: null
5374
+ "400":
5375
+ description: Invalid request body
5376
+ content:
5377
+ application/json:
5378
+ schema:
5379
+ $ref: "#/components/schemas/errorResponseObject"
5380
+ "401":
5381
+ $ref: "#/components/responses/unauthorizedToken"
5382
+ "429":
5383
+ $ref: "#/components/responses/rateLimited"
5384
+ "500":
5385
+ $ref: "#/components/responses/serverError"
4496
5386
  /summary:
4497
5387
  get:
4498
5388
  tags:
@@ -5740,12 +6630,9 @@ paths:
5740
6630
  tags:
5741
6631
  - crypto-manual
5742
6632
  summary: Get all supported cryptocurrencies
5743
- description: >
6633
+ description: |-
5744
6634
  Retrieve the list of cryptocurrencies currently supported for manual tracking.<p>
5745
-
5746
- When creating a new manual crypto balance via `POST /crypto/manual`, the
5747
- `symbol` you specify must match the `symbol` of one of the entries
5748
- returned by this endpoint.
6635
+ When creating a new manual crypto balance via `POST /crypto/manual`, the `symbol` you specify must match the `symbol` of one of the entries returned by this endpoint.
5749
6636
  operationId: getAllCryptocurrencies
5750
6637
  responses:
5751
6638
  "200":
@@ -5783,16 +6670,9 @@ paths:
5783
6670
  - crypto-manual
5784
6671
  summary: Add a new supported cryptocurrency
5785
6672
  operationId: createCryptocurrency
5786
- description: >-
6673
+ description: |-
5787
6674
  Adds a new cryptocurrency to the supported manual-crypto list.<br><br>
5788
-
5789
- Lunch Money uses [CoinGecko](https://www.coingecko.com/us/coins/ethereum)
5790
- to convert crypto balances to the user's primary currency. Users add a
5791
- new supported cryptocurrency by submitting a CoinGecko coin-page URL.
5792
- The server validates the URL, extracts the id from `/coins/{id}`,
5793
- checks for an existing supported `coingecko_id`, validates the id
5794
- against CoinGecko, then confirms the resolved symbol is not already
5795
- supported before creating the new entry.
6675
+ Lunch Money uses [CoinGecko](https://www.coingecko.com/us/coins/ethereum) to convert crypto balances to the user's primary currency. Users add a new supported cryptocurrency by submitting a CoinGecko coin-page URL. The server validates the URL, extracts the id from `/coins/{id}`, checks for an existing supported `coingecko_id`, validates the id against CoinGecko, then confirms the resolved symbol is not already supported before creating the new entry.
5796
6676
  requestBody:
5797
6677
  required: true
5798
6678
  content:
@@ -5871,8 +6751,8 @@ paths:
5871
6751
  tags:
5872
6752
  - crypto-manual
5873
6753
  summary: Get all manual crypto balances
5874
- description: Retrieve all manually managed crypto balances associated with
5875
- the user's account.
6754
+ description: |-
6755
+ Retrieve all manually managed crypto balances associated with the user's account.
5876
6756
  operationId: getAllCryptoManual
5877
6757
  responses:
5878
6758
  "200":
@@ -5906,11 +6786,9 @@ paths:
5906
6786
  tags:
5907
6787
  - crypto-manual
5908
6788
  summary: Create a manual crypto balance
5909
- description: >-
6789
+ description: |-
5910
6790
  Create a manually managed crypto asset.<br><br>
5911
-
5912
- If `display_name` is `null`, clients may derive one from
5913
- `institution_name` + `name`.
6791
+ If `display_name` is `null`, clients may derive one from `institution_name` + `name`.
5914
6792
  operationId: createCryptoManual
5915
6793
  requestBody:
5916
6794
  required: true
@@ -5995,7 +6873,8 @@ paths:
5995
6873
  tags:
5996
6874
  - crypto-manual
5997
6875
  summary: Get a single manual crypto balance
5998
- description: Retrieve a single manually managed crypto balance by ID.
6876
+ description: |-
6877
+ Retrieve a single manually managed crypto balance by ID.
5999
6878
  operationId: getCryptoManualById
6000
6879
  parameters:
6001
6880
  - name: id
@@ -6063,11 +6942,9 @@ paths:
6063
6942
  tags:
6064
6943
  - crypto-manual
6065
6944
  summary: Update a manual crypto balance
6066
- description: >-
6945
+ description: |-
6067
6946
  Modify a manually managed crypto balance.<br><br>
6068
-
6069
- You may submit the response from `GET /crypto/manual/{id}` as the request body. System-defined properties
6070
- are accepted according to the `x-updatable` metadata in the update schema.
6947
+ You may submit the response from `GET /crypto/manual/{id}` as the request body. System-defined properties are accepted according to the `x-updatable` metadata in the update schema.
6071
6948
  operationId: updateCryptoManual
6072
6949
  parameters:
6073
6950
  - name: id
@@ -6164,10 +7041,8 @@ paths:
6164
7041
  tags:
6165
7042
  - crypto-manual
6166
7043
  summary: Delete a manual crypto balance
6167
- description: Delete a single manually managed crypto asset by ID.<p> If
6168
- this crypto asset has a balance history, and you do not explicitly set
6169
- the query parameter`keep_history`, a 422 response will be returned
6170
- requesting you to explicitly set `keep_history` to `true` or `false`.
7044
+ description: |-
7045
+ Delete a single manually managed crypto asset by ID.<p> If this crypto asset has a balance history, and you do not explicitly set the query parameter`keep_history`, a 422 response will be returned requesting you to explicitly set `keep_history` to `true` or `false`.
6171
7046
  operationId: deleteCryptoManual
6172
7047
  parameters:
6173
7048
  - name: id
@@ -6232,8 +7107,8 @@ paths:
6232
7107
  tags:
6233
7108
  - crypto-synced
6234
7109
  summary: Get all synced crypto accounts
6235
- description: Retrieves all synced crypto accounts
6236
- associated with the user's account.
7110
+ description: |-
7111
+ Retrieves all synced crypto accounts associated with the user's account.
6237
7112
  operationId: getAllCryptoSynced
6238
7113
  responses:
6239
7114
  "200":
@@ -6295,8 +7170,8 @@ paths:
6295
7170
  tags:
6296
7171
  - crypto-synced
6297
7172
  summary: Get a single synced crypto account
6298
- description: Retrieves the synced crypto account and all nested balances
6299
- for the specified synced crypto account ID.
7173
+ description: |-
7174
+ Retrieves the synced crypto account and all nested balances for the specified synced crypto account ID.
6300
7175
  operationId: getCryptoSyncedById
6301
7176
  parameters:
6302
7177
  - name: id
@@ -6376,8 +7251,8 @@ paths:
6376
7251
  tags:
6377
7252
  - crypto-synced
6378
7253
  summary: Get a synced crypto balance by symbol
6379
- description: Retrieves a single balance from the specified synced crypto
6380
- account using the crypto symbol.
7254
+ description: |-
7255
+ Retrieves a single balance from the specified synced crypto account using the crypto symbol.
6381
7256
  operationId: getCryptoSyncedBalanceBySymbol
6382
7257
  parameters:
6383
7258
  - name: id
@@ -6456,8 +7331,8 @@ paths:
6456
7331
  tags:
6457
7332
  - crypto-synced
6458
7333
  summary: Refresh balances for a synced crypto account
6459
- description: Trigger a balance refresh for the specified synced crypto
6460
- account. Returns the refreshed synced crypto account.
7334
+ description: |-
7335
+ Trigger a balance refresh for the specified synced crypto account. Returns the refreshed synced crypto account.
6461
7336
  operationId: refreshCryptoSynced
6462
7337
  parameters:
6463
7338
  - name: id
@@ -6526,51 +7401,55 @@ paths:
6526
7401
  tags:
6527
7402
  - balance_history
6528
7403
  summary: Get balance history
6529
- description: >-
6530
- Retrieve historical balance entries.<br><br>
6531
-
6532
- Balance history is monthly. When `start_date` and `end_date` are both provided,
6533
- they must be first-of-month dates. `start_date` must not be in the future,
6534
- while `end_date` may be in the future. If one of `start_date` or `end_date`
6535
- is provided, the other is required. If neither is provided, all available
6536
- balance history is returned.<br><br>
6537
-
6538
- The response groups entries by source account. Each item in
6539
- `balance_history` contains a `source` object plus a `balances` array
6540
- containing one balance entry per month in the requested range, or all
6541
- stored entries when no range is provided.<br><br>
6542
-
6543
- Historical entries for accounts that have been deleted may still
6544
- be returned. These entries use `source.type: deleted` and include
6545
- `deleted_account_id`, archived display fields, and account metadata on the
6546
- `source` object.
7404
+ description: |-
7405
+ Retrieve monthly balance history for all account sources.<br><br>
7406
+ Balance history is monthly. Each entry represents the account balance at or around the end of the specified month. System-generated entries are generally captured near the boundary between months.<br><br>
7407
+ Query with optional `start_month` and `end_month` in YYYY-MM format. The range is inclusive. If either parameter is provided, both are required. `start_month` must not be in the future. `end_month` may not be earlier than `start_month` and must not be in the future. Values must be valid calendar months in exact YYYY-MM format. A full date such as `2026-06-01` is invalid. If neither is provided, all available balance history is returned, including an ephemeral `current` entry for the current month when applicable.<br><br>
7408
+ The response groups entries by source account. Each item in `balance_history` contains a `source` object plus a `balances` array. Within a requested range (or across all history when no range is provided), the array includes only months that have data — months with no data are omitted. A `current` entry is also included when the requested range includes the current month.<br><br>
7409
+ Each balance entry has a `type`:<br>
7410
+ - `historical`: stored snapshot of a past month for an active or deleted account. Includes an `id` that can be used with balance history entry endpoints<br>
7411
+ - `current`: snapshot based on the account's current balances. It is ephemeral and may change between requests. To inspect the underlying account, use the type-specific source id for the `source.type` values:<br>
7412
+ &nbsp;&nbsp;&nbsp;&nbsp;- `manual`: `source.manual_account_id` with [GET /manual_accounts/{id}](#tag/manual-accounts/GET/manual_accounts/{id})<br>
7413
+ &nbsp;&nbsp;&nbsp;&nbsp;- `plaid`: `source.plaid_account_id` with [GET /plaid_accounts/{id}](#tag/plaid-accounts/GET/plaid_accounts/{id})<br>
7414
+ &nbsp;&nbsp;&nbsp;&nbsp;- `crypto_manual`: `source.crypto_manual_id` with [GET /crypto/manual/{id}](#tag/crypto-manual/GET/crypto/manual/{id})<br>
7415
+ &nbsp;&nbsp;&nbsp;&nbsp;- `crypto_synced`: `source.crypto_synced_id` and `source.symbol` with [GET /crypto/synced/{id}/{symbol}](#tag/crypto-synced/GET/crypto/synced/{id}/{symbol})
6547
7416
  operationId: getBalanceHistory
6548
7417
  parameters:
6549
- - name: start_date
7418
+ - name: start_month
6550
7419
  in: query
6551
- description: Optional start date for the requested history range in YYYY-MM-DD format. If set, `end_date` is also required. This must be the first day of a month and must not be in the future.
7420
+ description: >-
7421
+ Optional start of the requested history range as a calendar month in
7422
+ YYYY-MM format (for example `2026-06`). If set, `end_month` is also
7423
+ required. The range is inclusive. `start_month` must not be in the
7424
+ future. A full date such as `2026-06-01` is invalid.
6552
7425
  required: false
6553
7426
  schema:
6554
7427
  type: string
6555
- format: date
7428
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
6556
7429
  examples:
6557
7430
  range start:
6558
- summary: Start date
6559
- value: "2026-01-01"
6560
- - name: end_date
7431
+ summary: Start month
7432
+ value: "2026-01"
7433
+ - name: end_month
6561
7434
  in: query
6562
- description: Optional end date for the requested history range in YYYY-MM-DD format. If set, `start_date` is also required. This must be the first day of a month. For a single month, set this to the same first-of-month date as `start_date`.
7435
+ description: >-
7436
+ Optional end of the requested history range as a calendar month in
7437
+ YYYY-MM format (for example `2026-06`). If set, `start_month` is also
7438
+ required. The range is inclusive. `end_month` may not be earlier than
7439
+ `start_month` and must not be in the future. A full date such as
7440
+ `2026-06-01` is invalid. For a single month, set this to the same
7441
+ value as `start_month`.
6563
7442
  required: false
6564
7443
  schema:
6565
7444
  type: string
6566
- format: date
7445
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
6567
7446
  examples:
6568
7447
  range end:
6569
- summary: End date
6570
- value: "2026-03-01"
7448
+ summary: End month
7449
+ value: "2026-03"
6571
7450
  responses:
6572
7451
  "200":
6573
- description: Historical balance entries for the requested date range
7452
+ description: Monthly balance history for the requested month range
6574
7453
  content:
6575
7454
  application/json:
6576
7455
  schema:
@@ -6583,14 +7462,16 @@ paths:
6583
7462
  type: manual
6584
7463
  manual_account_id: 119807
6585
7464
  balances:
6586
- - id: 101
6587
- date: "2026-01-01"
7465
+ - type: historical
7466
+ id: 101
7467
+ month: "2026-01"
6588
7468
  balance: "41000.0000"
6589
7469
  currency: usd
6590
7470
  to_base: 41000
6591
7471
  crypto_balance: null
6592
- - id: 102
6593
- date: "2026-02-01"
7472
+ - type: historical
7473
+ id: 102
7474
+ month: "2026-02"
6594
7475
  balance: "41211.8000"
6595
7476
  currency: usd
6596
7477
  to_base: 41211.8
@@ -6599,8 +7480,9 @@ paths:
6599
7480
  type: plaid
6600
7481
  plaid_account_id: 119808
6601
7482
  balances:
6602
- - id: 103
6603
- date: "2026-01-01"
7483
+ - type: historical
7484
+ id: 103
7485
+ month: "2026-01"
6604
7486
  balance: "5498.2800"
6605
7487
  currency: usd
6606
7488
  to_base: 5498.28
@@ -6610,8 +7492,9 @@ paths:
6610
7492
  crypto_manual_id: 22001
6611
7493
  symbol: btc
6612
7494
  balances:
6613
- - id: 104
6614
- date: "2026-01-01"
7495
+ - type: historical
7496
+ id: 104
7497
+ month: "2026-01"
6615
7498
  balance: "53124.7200"
6616
7499
  currency: usd
6617
7500
  to_base: 53124.72
@@ -6621,8 +7504,9 @@ paths:
6621
7504
  crypto_synced_id: 33004
6622
7505
  symbol: btc
6623
7506
  balances:
6624
- - id: 105
6625
- date: "2026-01-01"
7507
+ - type: historical
7508
+ id: 105
7509
+ month: "2026-01"
6626
7510
  balance: "6231.2800"
6627
7511
  currency: usd
6628
7512
  to_base: 6231.28
@@ -6638,12 +7522,34 @@ paths:
6638
7522
  mask: "1234"
6639
7523
  symbol: null
6640
7524
  balances:
6641
- - id: 106
6642
- date: "2026-01-01"
7525
+ - type: historical
7526
+ id: 106
7527
+ month: "2026-01"
6643
7528
  balance: "1250.0000"
6644
7529
  currency: usd
6645
7530
  to_base: 1250
6646
7531
  crypto_balance: null
7532
+ historical and current:
7533
+ summary: Historical month plus ephemeral current month
7534
+ value:
7535
+ balance_history:
7536
+ - source:
7537
+ type: manual
7538
+ manual_account_id: 162003
7539
+ balances:
7540
+ - type: historical
7541
+ id: 7437356
7542
+ month: "2026-06"
7543
+ balance: "62.8"
7544
+ currency: usd
7545
+ to_base: 62.8
7546
+ crypto_balance: null
7547
+ - type: current
7548
+ month: "2026-07"
7549
+ balance: "71.2"
7550
+ currency: usd
7551
+ to_base: 71.2
7552
+ crypto_balance: null
6647
7553
  manual account history:
6648
7554
  value:
6649
7555
  balance_history:
@@ -6651,14 +7557,16 @@ paths:
6651
7557
  type: manual
6652
7558
  manual_account_id: 119807
6653
7559
  balances:
6654
- - id: 201
6655
- date: "2026-01-01"
7560
+ - type: historical
7561
+ id: 201
7562
+ month: "2026-01"
6656
7563
  balance: "41000.0000"
6657
7564
  currency: usd
6658
7565
  to_base: 41000
6659
7566
  crypto_balance: null
6660
- - id: 202
6661
- date: "2026-02-01"
7567
+ - type: historical
7568
+ id: 202
7569
+ month: "2026-02"
6662
7570
  balance: "41211.8000"
6663
7571
  currency: usd
6664
7572
  to_base: 41211.8
@@ -6670,8 +7578,9 @@ paths:
6670
7578
  type: plaid
6671
7579
  plaid_account_id: 119808
6672
7580
  balances:
6673
- - id: 301
6674
- date: "2026-02-01"
7581
+ - type: historical
7582
+ id: 301
7583
+ month: "2026-02"
6675
7584
  balance: "5498.2800"
6676
7585
  currency: usd
6677
7586
  to_base: 5498.28
@@ -6684,8 +7593,9 @@ paths:
6684
7593
  crypto_synced_id: 33004
6685
7594
  symbol: btc
6686
7595
  balances:
6687
- - id: 401
6688
- date: "2026-02-01"
7596
+ - type: historical
7597
+ id: 401
7598
+ month: "2026-02"
6689
7599
  balance: "6231.2800"
6690
7600
  currency: usd
6691
7601
  to_base: 6231.28
@@ -6704,8 +7614,9 @@ paths:
6704
7614
  mask: "1234"
6705
7615
  symbol: null
6706
7616
  balances:
6707
- - id: 501
6708
- date: "2026-01-01"
7617
+ - type: historical
7618
+ id: 501
7619
+ month: "2026-01"
6709
7620
  balance: "1250.0000"
6710
7621
  currency: usd
6711
7622
  to_base: 1250
@@ -6717,26 +7628,31 @@ paths:
6717
7628
  schema:
6718
7629
  $ref: "#/components/schemas/errorResponseObject"
6719
7630
  examples:
6720
- missing paired date:
7631
+ missing paired month:
6721
7632
  value:
6722
7633
  message: Request Validation Failure
6723
7634
  errors:
6724
- - errMsg: "`start_date` and `end_date` must either both be provided or both be omitted."
7635
+ - errMsg: "`start_month` and `end_month` must either both be provided or both be omitted."
6725
7636
  invalid range:
6726
7637
  value:
6727
7638
  message: Request Validation Failure
6728
7639
  errors:
6729
- - errMsg: "`start_date` must be before or equal to `end_date`."
6730
- not first of month:
7640
+ - errMsg: "`end_month` may not be earlier than `start_month`."
7641
+ invalid month format:
7642
+ value:
7643
+ message: Invalid Request Parameters
7644
+ errors:
7645
+ - errMsg: "Invalid value for parameter: 'start_month'. '2026-06-01' is not a valid month in YYYY-MM format."
7646
+ future start month:
6731
7647
  value:
6732
7648
  message: Request Validation Failure
6733
7649
  errors:
6734
- - errMsg: "`start_date` and `end_date` must both be the first day of a month."
6735
- future start date:
7650
+ - errMsg: "`start_month` must not be in the future."
7651
+ future end month:
6736
7652
  value:
6737
7653
  message: Request Validation Failure
6738
7654
  errors:
6739
- - errMsg: "`start_date` must not be in the future."
7655
+ - errMsg: "`end_month` must not be in the future."
6740
7656
  "401":
6741
7657
  $ref: "#/components/responses/unauthorizedToken"
6742
7658
  "429":
@@ -6748,23 +7664,16 @@ paths:
6748
7664
  tags:
6749
7665
  - balance_history
6750
7666
  summary: Get balance history for an account
6751
- description: >-
6752
- Retrieve historical balance entries for one manual, Plaid, manual crypto,
6753
- or deleted account. Crypto synced accounts require an additional `symbol` path parameter.<br><br>
6754
-
6755
- The `account_type` path parameter identifies the type of account and the
6756
- `account_id` path parameter identifies the specific id for that account type.<br><br>
6757
-
6758
- When `start_date` and `end_date` are both provided, they must be first-of-month
6759
- dates. `start_date` must not be in the future, while `end_date` may be in the future.
6760
- If one of `start_date` or `end_date` is provided, the other is required. If neither is
6761
- provided, all available history for the source is returned.
7667
+ description: |-
7668
+ Retrieve monthly balance history for one manual, Plaid, manual crypto, or deleted account. For synced crypto symbol streams, use [GET /balance_history/crypto_synced/{account_id}/{symbol}](#tag/balance-history/GET/balance_history/crypto_synced/{account_id}/{symbol}).<br><br>
7669
+ The `account_type` path parameter identifies the account family (`manual`, `plaid`, `crypto_manual`, or `deleted`) and `account_id` identifies the account within that family.<br><br>
7670
+ `start_month`, `end_month`, and current-month entries behave as described in [GET /balance_history](#tag/balance-history/GET/balance_history).
6762
7671
  operationId: getBalanceHistoryForAccount
6763
7672
  parameters:
6764
7673
  - name: account_type
6765
7674
  in: path
6766
7675
  required: true
6767
- description: Source family to retrieve. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
7676
+ description: Account family to retrieve. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
6768
7677
  schema:
6769
7678
  type: string
6770
7679
  enum: [manual, plaid, crypto_manual, deleted]
@@ -6775,23 +7684,27 @@ paths:
6775
7684
  schema:
6776
7685
  type: integer
6777
7686
  format: int32
6778
- - name: start_date
7687
+ - name: start_month
6779
7688
  in: query
6780
- description: Optional start date for the requested history range in YYYY-MM-DD format. If set, `end_date` is also required. This must be the first day of a month and must not be in the future.
7689
+ description: >-
7690
+ Optional. Same format and constraints as `start_month` on
7691
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
6781
7692
  required: false
6782
7693
  schema:
6783
7694
  type: string
6784
- format: date
6785
- - name: end_date
7695
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7696
+ - name: end_month
6786
7697
  in: query
6787
- description: Optional end date for the requested history range in YYYY-MM-DD format. If set, `start_date` is also required. This must be the first day of a month.
7698
+ description: >-
7699
+ Optional. Same format and constraints as `end_month` on
7700
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
6788
7701
  required: false
6789
7702
  schema:
6790
7703
  type: string
6791
- format: date
7704
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
6792
7705
  responses:
6793
7706
  "200":
6794
- description: Historical balance entries for the requested source
7707
+ description: Monthly balance history for the requested source
6795
7708
  content:
6796
7709
  application/json:
6797
7710
  schema:
@@ -6804,14 +7717,16 @@ paths:
6804
7717
  type: manual
6805
7718
  manual_account_id: 119807
6806
7719
  balances:
6807
- - id: 201
6808
- date: "2026-01-01"
7720
+ - type: historical
7721
+ id: 201
7722
+ month: "2026-01"
6809
7723
  balance: "41000.0000"
6810
7724
  currency: usd
6811
7725
  to_base: 41000
6812
7726
  crypto_balance: null
6813
- - id: 202
6814
- date: "2026-02-01"
7727
+ - type: historical
7728
+ id: 202
7729
+ month: "2026-02"
6815
7730
  balance: "41211.8000"
6816
7731
  currency: usd
6817
7732
  to_base: 41211.8
@@ -6830,8 +7745,9 @@ paths:
6830
7745
  mask: "1234"
6831
7746
  symbol: null
6832
7747
  balances:
6833
- - id: 501
6834
- date: "2026-01-01"
7748
+ - type: historical
7749
+ id: 501
7750
+ month: "2026-01"
6835
7751
  balance: "1250.0000"
6836
7752
  currency: usd
6837
7753
  to_base: 1250
@@ -6843,16 +7759,16 @@ paths:
6843
7759
  schema:
6844
7760
  $ref: "#/components/schemas/errorResponseObject"
6845
7761
  examples:
6846
- missing paired date:
7762
+ missing paired month:
6847
7763
  value:
6848
7764
  message: Request Validation Failure
6849
7765
  errors:
6850
- - errMsg: "`start_date` and `end_date` must either both be provided or both be omitted."
6851
- invalid range:
7766
+ - errMsg: "`start_month` and `end_month` must either both be provided or both be omitted."
7767
+ invalid month format:
6852
7768
  value:
6853
- message: Request Validation Failure
7769
+ message: Invalid Request Parameters
6854
7770
  errors:
6855
- - errMsg: "`start_date` must be before or equal to `end_date`."
7771
+ - errMsg: "Invalid value for parameter: 'start_month'. '2026-06-01' is not a valid month in YYYY-MM format."
6856
7772
  "401":
6857
7773
  $ref: "#/components/responses/unauthorizedToken"
6858
7774
  "404":
@@ -6880,37 +7796,20 @@ paths:
6880
7796
  tags:
6881
7797
  - balance_history
6882
7798
  summary: Upsert balance history for an account
6883
- description: >-
6884
- Upsert one or more historical balance entries for a single manual, Plaid,
6885
- manual crypto, or deleted account. Crypto synced accounts require an additional `symbol` path parameter.<br><br>
6886
-
6887
- The `account_type` path parameter identifies the type of account and the
6888
- `account_id` path parameter identifies the specific id for that account type.<br><br>
6889
-
6890
- Submit one or more entries in the `balances` array. Each entry must specify
6891
- a `date` and `balance` value.<br><br>
6892
-
6893
- Balance history is monthly. Each entry's `date` must be the first day of
6894
- a month and must be in a past month.<br><br>
6895
-
6896
- `currency` may be provided for any balance entry. If omitted, it defaults
6897
- to the account currency for manual/Plaid accounts, or the user's primary
6898
- currency for crypto/deleted accounts.<br><br>
6899
-
6900
- `symbol` may only be set when `account_type` is `crypto_manual` or
6901
- `crypto_synced`. It is optional for `crypto_manual` accounts and tolerated
6902
- for `deleted` accounts.<br><br>
6903
-
6904
- `crypto_balance` may be provided for `crypto_manual`, `crypto_synced`, and
6905
- `deleted` accounts, and is invalid for `manual` or `plaid` accounts.<br><br>
6906
-
6907
- The response contains only the balance entries that were submitted in this request.
7799
+ description: |-
7800
+ Upsert one or more historical balance entries for a single manual, Plaid, manual crypto, or deleted account. For synced crypto symbol streams, use [PUT /balance_history/crypto_synced/{account_id}/{symbol}](#tag/balance-history/PUT/balance_history/crypto_synced/{account_id}/{symbol}).<br><br>
7801
+ The `account_type` path parameter identifies the account family (`manual`, `plaid`, `crypto_manual`, or `deleted`) and `account_id` identifies the account within that family.<br><br>
7802
+ Submit one or more entries in the `balances` array. Each entry must specify a `month` (YYYY-MM) and `balance` value. `month` must be a past calendar month. The current month cannot be written through this endpoint.<br><br>
7803
+ `currency` may be provided for any balance entry. If omitted, it defaults to the account currency for manual/Plaid accounts, or the user's primary currency for crypto/deleted accounts.<br><br>
7804
+ `symbol` may be set for `crypto_manual` (optional) and `deleted` (tolerated) accounts. Do not provide it for `manual` or `plaid` accounts.<br><br>
7805
+ `crypto_balance` may be provided for `crypto_manual` and `deleted` accounts. It is invalid for `manual` or `plaid` accounts.<br><br>
7806
+ The response contains only the `type: historical` balance entries that were submitted in this request.
6908
7807
  operationId: upsertBalanceHistoryForAccount
6909
7808
  parameters:
6910
7809
  - name: account_type
6911
7810
  in: path
6912
7811
  required: true
6913
- description: Source family to update. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
7812
+ description: Account family to update. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
6914
7813
  schema:
6915
7814
  type: string
6916
7815
  enum: [manual, plaid, crypto_manual, deleted]
@@ -6931,21 +7830,21 @@ paths:
6931
7830
  manual account bulk upsert:
6932
7831
  value:
6933
7832
  balances:
6934
- - date: "2026-03-01"
7833
+ - month: "2026-03"
6935
7834
  balance: "41500.0000"
6936
- - date: "2026-04-01"
7835
+ - month: "2026-04"
6937
7836
  balance: "41625.5000"
6938
7837
  crypto manual balance with symbol:
6939
7838
  value:
6940
7839
  balances:
6941
- - date: "2026-03-01"
7840
+ - month: "2026-03"
6942
7841
  balance: "56011.1200"
6943
7842
  symbol: btc
6944
7843
  crypto_balance: "0.852341920145782301"
6945
7844
  deleted account bulk upsert:
6946
7845
  value:
6947
7846
  balances:
6948
- - date: "2026-03-01"
7847
+ - month: "2026-03"
6949
7848
  symbol: btc
6950
7849
  crypto_balance: "0.020000000000000000"
6951
7850
  currency: usd
@@ -6954,55 +7853,59 @@ paths:
6954
7853
  value:
6955
7854
  balances:
6956
7855
  - id: 601
6957
- date: "2026-03-01"
7856
+ month: "2026-03"
6958
7857
  balance: "41500.0000"
6959
7858
  currency: usd
6960
7859
  to_base: 41500
6961
7860
  crypto_balance: null
6962
7861
  responses:
6963
7862
  "200":
6964
- description: Returns the modified balance entries only. Other historical
6965
- entries for the account are omitted from `balances`.
7863
+ description: >-
7864
+ Returns only the `type: historical` entries modified by this request.
7865
+ Other historical entries for the account are omitted from `balances`.
6966
7866
  content:
6967
7867
  application/json:
6968
7868
  schema:
6969
7869
  $ref: "#/components/schemas/balanceHistoryAccountObject"
6970
7870
  examples:
6971
7871
  manual account bulk upsert:
6972
- summary: Two upserted rows returned (not full account history)
7872
+ summary: Two upserted entries returned (not full account history)
6973
7873
  value:
6974
7874
  source:
6975
7875
  type: manual
6976
7876
  manual_account_id: 119807
6977
7877
  balances:
6978
- - id: 601
6979
- date: "2026-03-01"
7878
+ - type: historical
7879
+ id: 601
7880
+ month: "2026-03"
6980
7881
  balance: "41500.0000"
6981
7882
  currency: usd
6982
7883
  to_base: 41500
6983
7884
  crypto_balance: null
6984
- - id: 602
6985
- date: "2026-04-01"
7885
+ - type: historical
7886
+ id: 602
7887
+ month: "2026-04"
6986
7888
  balance: "41625.5000"
6987
7889
  currency: usd
6988
7890
  to_base: 41625.5
6989
7891
  crypto_balance: null
6990
7892
  crypto manual balance with symbol:
6991
- summary: Single upserted row returned
7893
+ summary: Single upserted entry returned
6992
7894
  value:
6993
7895
  source:
6994
7896
  type: crypto_manual
6995
7897
  crypto_manual_id: 22001
6996
7898
  symbol: btc
6997
7899
  balances:
6998
- - id: 603
6999
- date: "2026-03-01"
7900
+ - type: historical
7901
+ id: 603
7902
+ month: "2026-03"
7000
7903
  balance: "56011.1200"
7001
7904
  currency: usd
7002
7905
  to_base: 56011.12
7003
7906
  crypto_balance: "0.852341920145782301"
7004
7907
  deleted account bulk upsert:
7005
- summary: Single upserted row returned
7908
+ summary: Single upserted entry returned
7006
7909
  value:
7007
7910
  source:
7008
7911
  type: deleted
@@ -7015,15 +7918,17 @@ paths:
7015
7918
  mask: "1234"
7016
7919
  symbol: btc
7017
7920
  balances:
7018
- - id: 504
7019
- date: "2026-03-01"
7921
+ - type: historical
7922
+ id: 504
7923
+ month: "2026-03"
7020
7924
  balance: "1255"
7021
7925
  currency: usd
7022
7926
  to_base: 1255
7023
7927
  crypto_balance: "0.020000000000000000"
7024
7928
  "400":
7025
- description: Bad Request. The entire request is rejected if any row in
7026
- `balances` fails validation; no rows are updated.
7929
+ description: >-
7930
+ Bad Request. If any entry in `balances` fails validation, the entire
7931
+ request is rejected and no entries are updated.
7027
7932
  content:
7028
7933
  application/json:
7029
7934
  schema:
@@ -7044,30 +7949,34 @@ paths:
7044
7949
  message: Invalid Request Body
7045
7950
  errors:
7046
7951
  - errMsg: "Invalid property 'foo' in request body."
7047
- invalid date:
7952
+ invalid month format:
7953
+ value:
7954
+ message: Invalid Request Body
7955
+ errors:
7956
+ - errMsg: "Invalid value for property 'balances.0.month'. '2026-06-01' is not a valid month in YYYY-MM format."
7957
+ current month:
7048
7958
  value:
7049
7959
  message: Request Validation Failure
7050
7960
  errors:
7051
- - errMsg: "`date` must be the first day of a month."
7961
+ - errMsg: "`month` must not be the current month."
7052
7962
  request_balances_index: 0
7053
- code: VALIDATION_ERROR
7054
- future date:
7963
+ future month:
7055
7964
  value:
7056
7965
  message: Request Validation Failure
7057
7966
  errors:
7058
- - errMsg: "`date` must be in a past month."
7967
+ - errMsg: "`month` must not be in the future."
7059
7968
  request_balances_index: 1
7060
7969
  crypto balance not allowed:
7061
7970
  value:
7062
7971
  message: Request Validation Failure
7063
7972
  errors:
7064
- - errMsg: "`crypto_balance` may only be set when `account_type` is `crypto_manual`, `crypto_synced`, or `deleted`."
7973
+ - errMsg: "`crypto_balance` may only be set when `account_type` is `crypto_manual` or `deleted`."
7065
7974
  request_balances_index: 0
7066
- invalid row in bulk request:
7975
+ invalid entry in bulk request:
7067
7976
  value:
7068
7977
  message: Request Validation Failure
7069
7978
  errors:
7070
- - errMsg: "`symbol` may only be set when `account_type` is `crypto_manual` or `crypto_synced`."
7979
+ - errMsg: "`symbol` may only be set when `account_type` is `crypto_manual` or `deleted`."
7071
7980
  request_balances_index: 1
7072
7981
  "401":
7073
7982
  $ref: "#/components/responses/unauthorizedToken"
@@ -7089,15 +7998,14 @@ paths:
7089
7998
  tags:
7090
7999
  - balance_history
7091
8000
  summary: Delete all balance history for an account
7092
- description: >-
7093
- Delete all historical balance entries for a single manual, Plaid,
7094
- manual crypto, or deleted account. Crypto synced accounts require an additional `symbol` path parameter.
8001
+ description: |-
8002
+ Delete all historical balance entries for a single manual, Plaid, manual crypto, or deleted account. For synced crypto symbol streams, use [DELETE /balance_history/crypto_synced/{account_id}/{symbol}](#tag/balance-history/DELETE/balance_history/crypto_synced/{account_id}/{symbol}).
7095
8003
  operationId: deleteBalanceHistoryForAccount
7096
8004
  parameters:
7097
8005
  - name: account_type
7098
8006
  in: path
7099
8007
  required: true
7100
- description: Source family to delete. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
8008
+ description: Account family to delete. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
7101
8009
  schema:
7102
8010
  type: string
7103
8011
  enum: [manual, plaid, crypto_manual, deleted]
@@ -7134,16 +8042,10 @@ paths:
7134
8042
  tags:
7135
8043
  - balance_history
7136
8044
  summary: Get balance history for a synced crypto symbol
7137
- description: >-
7138
- Retrieve historical balance entries for a single synced crypto symbol stream.<br><br>
7139
-
7140
- Use the `crypto_synced` account id together with a `symbol` path parameter
7141
- to select one balance stream within that synced crypto account.<br><br>
7142
-
7143
- When `start_date` and `end_date` are both provided, they must be first-of-month
7144
- dates. `start_date` must not be in the future, while `end_date` may be in the future.
7145
- If one of `start_date` or `end_date` is provided, the other is required. If neither is
7146
- provided, all available history for the symbol stream is returned.
8045
+ description: |-
8046
+ Retrieve monthly balance history for a single synced crypto symbol stream.<br><br>
8047
+ The path selects one balance stream with a synced crypto account id and `symbol`.<br><br>
8048
+ `start_month`, `end_month`, and current-month entries behave as described in [GET /balance_history](#tag/balance-history/GET/balance_history).
7147
8049
  operationId: getBalanceHistoryForCryptoSynced
7148
8050
  parameters:
7149
8051
  - name: account_id
@@ -7161,23 +8063,27 @@ paths:
7161
8063
  type: string
7162
8064
  minLength: 1
7163
8065
  maxLength: 25
7164
- - name: start_date
8066
+ - name: start_month
7165
8067
  in: query
7166
- description: Optional start date for the requested history range in YYYY-MM-DD format. If set, `end_date` is also required. This must be the first day of a month and must not be in the future.
8068
+ description: >-
8069
+ Optional. Same format and constraints as `start_month` on
8070
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
7167
8071
  required: false
7168
8072
  schema:
7169
8073
  type: string
7170
- format: date
7171
- - name: end_date
8074
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
8075
+ - name: end_month
7172
8076
  in: query
7173
- description: Optional end date for the requested history range in YYYY-MM-DD format. If set, `start_date` is also required. This must be the first day of a month.
8077
+ description: >-
8078
+ Optional. Same format and constraints as `end_month` on
8079
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
7174
8080
  required: false
7175
8081
  schema:
7176
8082
  type: string
7177
- format: date
8083
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7178
8084
  responses:
7179
8085
  "200":
7180
- description: Historical balance entries for the synced crypto symbol stream
8086
+ description: Monthly balance history for the synced crypto symbol stream
7181
8087
  content:
7182
8088
  application/json:
7183
8089
  schema:
@@ -7189,8 +8095,9 @@ paths:
7189
8095
  crypto_synced_id: 33004
7190
8096
  symbol: btc
7191
8097
  balances:
7192
- - id: 401
7193
- date: "2026-02-01"
8098
+ - type: historical
8099
+ id: 401
8100
+ month: "2026-02"
7194
8101
  balance: "6231.2800"
7195
8102
  currency: usd
7196
8103
  to_base: 6231.28
@@ -7202,16 +8109,16 @@ paths:
7202
8109
  schema:
7203
8110
  $ref: "#/components/schemas/errorResponseObject"
7204
8111
  examples:
7205
- missing paired date:
8112
+ missing paired month:
7206
8113
  value:
7207
8114
  message: Request Validation Failure
7208
8115
  errors:
7209
- - errMsg: "`start_date` and `end_date` must either both be provided or both be omitted."
7210
- invalid range:
8116
+ - errMsg: "`start_month` and `end_month` must either both be provided or both be omitted."
8117
+ invalid month format:
7211
8118
  value:
7212
- message: Request Validation Failure
8119
+ message: Invalid Request Parameters
7213
8120
  errors:
7214
- - errMsg: "`start_date` must be before or equal to `end_date`."
8121
+ - errMsg: "Invalid value for parameter: 'start_month'. '2026-06-01' is not a valid month in YYYY-MM format."
7215
8122
  "401":
7216
8123
  $ref: "#/components/responses/unauthorizedToken"
7217
8124
  "404":
@@ -7239,28 +8146,14 @@ paths:
7239
8146
  tags:
7240
8147
  - balance_history
7241
8148
  summary: Upsert balance history for a synced crypto symbol
7242
- description: >-
7243
- Upsert one or more historical balance entries for a single synced crypto
7244
- symbol stream.<br><br>
7245
-
8149
+ description: |-
8150
+ Upsert one or more historical balance entries for a single synced crypto symbol stream.<br><br>
7246
8151
  The path identifies both the synced crypto account and the symbol being updated.<br><br>
7247
-
7248
- Submit one or more entries in the `balances` array. Each entry must specify
7249
- a `date` and `balance` value.<br><br>
7250
-
7251
- Balance history is monthly. Each entry's `date` must be the first day of
7252
- a month and must be in a past month.<br><br>
7253
-
7254
- The request body may include an optional `symbol` on each balance entry. If
7255
- provided, it must match the `symbol` path parameter. Omit `symbol` to use
7256
- the path value.<br><br>
7257
-
7258
- `currency` may be provided for any balance entry. If omitted, it defaults
7259
- to the user's primary currency for synced crypto balances.<br><br>
7260
-
8152
+ Submit one or more entries in the `balances` array. Each entry must specify a `month` (YYYY-MM) and `balance` value. `month` must be a past calendar month. The current month cannot be written through this endpoint.<br><br>
8153
+ The request body may include an optional `symbol` on each balance entry. If provided, it must match the `symbol` path parameter. Omit `symbol` to use the path value.<br><br>
8154
+ `currency` may be provided for any balance entry. If omitted, it defaults to the user's primary currency for synced crypto balances.<br><br>
7261
8155
  `crypto_balance` may be provided for synced crypto balances.<br><br>
7262
-
7263
- The response contains only the balance entries that were submitted in this request.
8156
+ The response contains only the `type: historical` balance entries that were submitted in this request.
7264
8157
  operationId: upsertBalanceHistoryForCryptoSynced
7265
8158
  parameters:
7266
8159
  - name: account_id
@@ -7288,44 +8181,49 @@ paths:
7288
8181
  synced crypto bulk upsert:
7289
8182
  value:
7290
8183
  balances:
7291
- - date: "2026-03-01"
8184
+ - month: "2026-03"
7292
8185
  balance: "6400.0000"
7293
8186
  crypto_balance: "0.100020003000400050"
7294
- - date: "2026-04-01"
8187
+ - month: "2026-04"
7295
8188
  balance: "6500.0000"
7296
8189
  crypto_balance: "0.100020003000400050"
7297
8190
  responses:
7298
8191
  "200":
7299
- description: Returns the modified balance entries only. Other historical
7300
- entries for the symbol stream are omitted from `balances`.
8192
+ description: >-
8193
+ Returns only the `type: historical` entries modified by this request.
8194
+ Other historical entries for the symbol stream are omitted from
8195
+ `balances`.
7301
8196
  content:
7302
8197
  application/json:
7303
8198
  schema:
7304
8199
  $ref: "#/components/schemas/balanceHistoryAccountObject"
7305
8200
  examples:
7306
8201
  synced crypto bulk upsert:
7307
- summary: Two upserted rows returned (not full symbol history)
8202
+ summary: Two upserted entries returned (not full symbol history)
7308
8203
  value:
7309
8204
  source:
7310
8205
  type: crypto_synced
7311
8206
  crypto_synced_id: 33004
7312
8207
  symbol: btc
7313
8208
  balances:
7314
- - id: 604
7315
- date: "2026-03-01"
8209
+ - type: historical
8210
+ id: 604
8211
+ month: "2026-03"
7316
8212
  balance: "6400.0000"
7317
8213
  currency: usd
7318
8214
  to_base: 6400
7319
8215
  crypto_balance: "0.100020003000400050"
7320
- - id: 605
7321
- date: "2026-04-01"
8216
+ - type: historical
8217
+ id: 605
8218
+ month: "2026-04"
7322
8219
  balance: "6500.0000"
7323
8220
  currency: usd
7324
8221
  to_base: 6500
7325
8222
  crypto_balance: "0.100020003000400050"
7326
8223
  "400":
7327
- description: Bad Request. The entire request is rejected if any row in
7328
- `balances` fails validation; no rows are updated.
8224
+ description: >-
8225
+ Bad Request. If any entry in `balances` fails validation, the entire
8226
+ request is rejected and no entries are updated.
7329
8227
  content:
7330
8228
  application/json:
7331
8229
  schema:
@@ -7341,17 +8239,22 @@ paths:
7341
8239
  message: Invalid Request Body
7342
8240
  errors:
7343
8241
  - errMsg: "Invalid value for property 'balances'. Array must contain at least 1 element(s)"
7344
- invalid date:
8242
+ invalid month format:
8243
+ value:
8244
+ message: Invalid Request Body
8245
+ errors:
8246
+ - errMsg: "Invalid value for property 'balances.0.month'. '2026-06-01' is not a valid month in YYYY-MM format."
8247
+ current month:
7345
8248
  value:
7346
8249
  message: Request Validation Failure
7347
8250
  errors:
7348
- - errMsg: "`date` must be the first day of a month."
8251
+ - errMsg: "`month` must not be the current month."
7349
8252
  request_balances_index: 0
7350
- future date:
8253
+ future month:
7351
8254
  value:
7352
8255
  message: Request Validation Failure
7353
8256
  errors:
7354
- - errMsg: "`date` must be in a past month."
8257
+ - errMsg: "`month` must not be in the future."
7355
8258
  request_balances_index: 1
7356
8259
  symbol mismatch:
7357
8260
  value:
@@ -7359,9 +8262,9 @@ paths:
7359
8262
  errors:
7360
8263
  - errMsg: "`symbol` in request body (doge) does not match the path symbol (eth)."
7361
8264
  request_balances_index: 0
7362
- invalid row in bulk request:
8265
+ invalid entry in bulk request:
7363
8266
  value:
7364
- message: Request Validation Failure
8267
+ message: Invalid Request Body
7365
8268
  errors:
7366
8269
  - errMsg: "`balance` must be a valid numeric string or number."
7367
8270
  request_balances_index: 1
@@ -7392,11 +8295,9 @@ paths:
7392
8295
  tags:
7393
8296
  - balance_history
7394
8297
  summary: Delete all balance history for a synced crypto symbol
7395
- description: >-
8298
+ description: |-
7396
8299
  Delete all historical balance entries for a single synced crypto symbol stream.<br><br>
7397
-
7398
- The path identifies both the synced crypto account and the symbol whose
7399
- history should be deleted.
8300
+ The path identifies both the synced crypto account and the symbol whose history should be deleted.
7400
8301
  operationId: deleteBalanceHistoryForCryptoSynced
7401
8302
  parameters:
7402
8303
  - name: account_id
@@ -7438,14 +8339,14 @@ paths:
7438
8339
  tags:
7439
8340
  - balance_history
7440
8341
  summary: Delete a balance history entry
7441
- description: >-
7442
- Delete a single monthly balance history entry by its id.
8342
+ description: |-
8343
+ Delete a single stored (`type: historical`) monthly balance history entry by its id. Ephemeral `current` entries cannot be deleted this way.
7443
8344
  operationId: deleteBalanceHistoryEntry
7444
8345
  parameters:
7445
8346
  - name: id
7446
8347
  in: path
7447
8348
  required: true
7448
- description: Balance history row identifier to delete.
8349
+ description: Historical balance entry identifier to delete.
7449
8350
  schema:
7450
8351
  type: integer
7451
8352
  format: int32
@@ -7459,7 +8360,7 @@ paths:
7459
8360
  schema:
7460
8361
  $ref: "#/components/schemas/errorResponseObject"
7461
8362
  example:
7462
- message: Request Validation Failure
8363
+ message: Invalid Path Parameters
7463
8364
  errors:
7464
8365
  - errMsg: "Invalid value type for path parameter: 'id'. Expected 'number', received 'string'."
7465
8366
  "401":
@@ -7483,12 +8384,9 @@ paths:
7483
8384
  tags:
7484
8385
  - balance_history
7485
8386
  summary: Update details for a deleted account
7486
- description: >-
8387
+ description: |-
7487
8388
  Update archived metadata for a deleted balance history source.<br><br>
7488
-
7489
- Pass the `deleted` source id returned on `source.deleted_account_id`.
7490
- This endpoint updates the stored deleted-source metadata used for all
7491
- historical entries associated with that deleted source.
8389
+ Pass the `deleted_account_id` from a `source.type: deleted` entry. The update applies to all historical entries associated with that deleted source.
7492
8390
  operationId: updateBalanceHistoryDetails
7493
8391
  parameters:
7494
8392
  - name: account_id
@@ -8562,19 +9460,19 @@ paths:
8562
9460
  description: Sets the maximum number of transactions to return. If
8563
9461
  more match the filter criteria, the response will include a
8564
9462
  `has_more` attribute set to `true`. See
8565
- [Pagination](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/pagination)
9463
+ [Pagination](https://lunchmoney.dev/v2/pagination)
8566
9464
  - name: offset
8567
9465
  in: query
8568
9466
  schema:
8569
9467
  type: integer
8570
9468
  description: Sets the offset for the records returned. This is
8571
9469
  typically set automatically in the header. See
8572
- [Pagination](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/pagination)
9470
+ [Pagination](https://lunchmoney.dev/v2/pagination)
8573
9471
  responses:
8574
9472
  "200":
8575
9473
  description: Returns an array of transactions. <br><br>The `has_more`
8576
9474
  property is set to `true` if more transactions are available. See
8577
- [Pagination](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/pagination)
9475
+ [Pagination](https://lunchmoney.dev/v2/pagination)
8578
9476
  content:
8579
9477
  application/json:
8580
9478
  schema:
@@ -10798,9 +11696,8 @@ paths:
10798
11696
  - transactions (files)
10799
11697
  summary: Attach a file to a transaction
10800
11698
  operationId: attachFileToTransaction
10801
- description: >-
10802
- Attaches a file to a transaction. The file must be less than 10MB in size.<br><br>
10803
- The file will be attached to the transaction and can be downloaded from the link returned by a `GET /transactions/attachments/{file_id}` request.
11699
+ description: |-
11700
+ Attaches a file to a transaction. The file must be less than 10MB in size.<br><br> The file will be attached to the transaction and can be downloaded from the link returned by a `GET /transactions/attachments/{file_id}` request.
10804
11701
  parameters:
10805
11702
  - name: transaction_id
10806
11703
  in: path
@@ -10883,8 +11780,8 @@ paths:
10883
11780
  /transactions/attachments/{file_id}:
10884
11781
  get:
10885
11782
  summary: Get a url to download a file attachment
10886
- description: Returns a signed url that can be used to download the file
10887
- attachment.
11783
+ description: |-
11784
+ Returns a signed url that can be used to download the file attachment.
10888
11785
  operationId: getTransactionAttachmentUrl
10889
11786
  tags:
10890
11787
  - transactions (files)
@@ -11617,12 +12514,17 @@ paths:
11617
12514
  get:
11618
12515
  tags:
11619
12516
  - budgets
11620
- summary: Get budget settings
11621
- description: Returns the budget-related settings for the user's account.
12517
+ summary: Get budget period settings
12518
+ description: |-
12519
+ Returns budget period and display settings for the budget
12520
+ associated with this API token.<p> These control how budget **periods** are calculated
12521
+ (granularity, anchor date, rollover, and related options). For general
12522
+ budget preferences such as currency and locale, see
12523
+ [/me/account/settings](#tag/me/GET/me/account/settings).
11622
12524
  operationId: getBudgetSettings
11623
12525
  responses:
11624
12526
  "200":
11625
- description: Budget settings for the account
12527
+ description: Budget period settings for the current budget
11626
12528
  content:
11627
12529
  application/json:
11628
12530
  schema:
@@ -11645,7 +12547,7 @@ paths:
11645
12547
  Note that `start_date` **must** be a valid budget period start for the account (based on the account's
11646
12548
  budget period settings). If an invalid `start_date` is provided, the request will fail with an error that indicates what the previous and next valid start dates are.<p>
11647
12549
 
11648
- Use the [budgets/settings](#tag/budgets/GET/budgets/settings) endpoint to view the account's budget settings.<br>
12550
+ Use the [/budgets/settings](#tag/budgets/GET/budgets/settings) endpoint to view the budget period settings for the account.<br>
11649
12551
  To view details for existing budgets, use the [summary](#tag/summary) endpoint.
11650
12552
  operationId: upsertBudget
11651
12553
  requestBody:
@@ -11716,7 +12618,7 @@ paths:
11716
12618
  period settings). If an invalid `start_date` is provided, the request
11717
12619
  will fail with an error that indicates what the previous and next valid
11718
12620
  start dates are.<p> Use the
11719
- [budgets/settings](#tag/budgets/GET/budgets/settings) endpoint to view
12621
+ [/budgets/settings](#tag/budgets/GET/budgets/settings) endpoint to view
11720
12622
  the account's budget settings.<br> To view details for existing budgets,
11721
12623
  use the [summary](#tag/summary) endpoint.
11722
12624
  operationId: deleteBudget
@@ -11774,4 +12676,3 @@ paths:
11774
12676
 
11775
12677
  security:
11776
12678
  - bearerSecurity: []
11777
- - cookieAuth: []