@lunch-money/developer-docs 2.11.1-preview.4 → 2.11.1-preview.6

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,17 +2,42 @@ openapi: 3.0.2
2
2
  info:
3
3
  title: Lunch Money API - v2
4
4
  description: |-
5
+ ### Introduction
6
+
5
7
  Welcome to the Lunch Money v2 API reference. This is the **v2.11.1** spec.
6
8
 
7
- ### Introduction
9
+ > [!warning]
10
+ > **Preview endpoints (subject to change)**
11
+ >
12
+ > - [`GET /v2/me/account/settings`](#tag/me/GET/me/account/settings)
13
+ > - [`PUT /v2/me/account/settings`](#tag/me/PUT/me/account/settings)
14
+ > - [`GET /v2/me/user/settings`](#tag/me/GET/me/user/settings)
15
+ > - [`PUT /v2/me/user/settings`](#tag/me/PUT/me/user/settings)
16
+ >
17
+ > <p class="preview-endpoints-footer" style="margin:0.85em 0 0;padding:0;text-align:left;width:100%;box-sizing:border-box">Do not release production apps using these endpoints. Feedback is welcome. <a href="mailto:dev-support@lunchmoney.app">Email dev-support@lunchmoney.app</a> or join us in the <a href="https://discord.com/channels/842337014556262411/1134594318414389258">developers channel</a> on the <a href="https://lunchmoney.app/discord">Lunch Money Discord</a>.</p>
18
+
19
+ The most recent stable version of the API is v2.11.0 and is available at:
20
+ `https://api.lunchmoney.dev/v2`
21
+
22
+ See the [stable Developer Portal](https://lunchmoney.dev/v2).
23
+
24
+ ------------------------------------------------------------------------------------------------
8
25
 
9
- The API is available at `https://lunchmoney.dev/v2`. Get your access token from the [Lunch Money developers page](https://my.lunchmoney.app/developers).
26
+ The API is available at `https://api-beta.lunchmoney.app/v2`. Get your access token from the [Lunch Money developers page](https://my.lunchmoney.app/developers).
10
27
 
11
- API calls can <span class="red-text"><strong>change or delete</strong></span> your data. Any changes you make are <span class="red-text"><strong>permanent</strong></span>, just like they would be if you made changes using the web or mobile app. Please refer to the [Getting Started Guide](https://lunchmoney.dev/v2/getting-started) before using the API.
28
+
29
+ **Try it from these docs**
12
30
 
13
- **Static Mock Server**
31
+ These docs are interactive — use **Test request** on any endpoint to call the API from this page.
32
+ Choose a LIVE or MOCK service from the Server dropdown.
33
+ Requests sent to `https://api-beta.lunchmoney.app/v2` can <span class="red-text"><strong>change or delete</strong></span> your data and are <span class="red-text"><strong>permanent</strong></span>.
34
+ See the [Getting Started Guide](https://beta.lunchmoney.dev/v2/getting-started) before using the live API.
35
+
36
+ **Static mock server**
14
37
 
15
- 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.
38
+ Explore without risk to real data. Select `https://beta-mock.lunchmoney.dev/v2` in the Server dropdown to work with static mock data.
39
+ POST, PUT, and DELETE requests will return realistic responses, but do not change the mock data.
40
+
16
41
 
17
42
  **Client Libraries & SDKs**
18
43
 
@@ -20,15 +45,14 @@ info:
20
45
 
21
46
  **Migrating from v1**
22
47
 
23
- The v2 API is not backwards compatible with v1. See the [Migration Guide](https://lunchmoney.dev/v2/migration-guide) for details.
48
+ The v2 API is not backwards compatible with v1. See the [Migration Guide](https://beta.lunchmoney.dev/v2/migration-guide) for details.
24
49
 
25
50
  **Useful links**
26
- - [Developer Portal](https://lunchmoney.dev/v2/introduction)
27
- - [Getting Started Guide](https://lunchmoney.dev/v2/getting-started)
28
- - [v2 API Overview](https://lunchmoney.dev/v2/overview)
29
- - [Version History](https://lunchmoney.dev/v2/version-history)
30
- - [Migration Guide](https://lunchmoney.dev/v2/migration-guide)
31
- - [Rate Limits](https://lunchmoney.dev/v2/rate-limits)
51
+ - [Getting Started Guide](https://beta.lunchmoney.dev/v2/getting-started)
52
+ - [v2 API Overview](https://beta.lunchmoney.dev/v2/overview)
53
+ - [Version History](https://beta.lunchmoney.dev/v2/version-history)
54
+ - [Migration Guide](https://beta.lunchmoney.dev/v2/migration-guide)
55
+ - [Rate Limits](https://beta.lunchmoney.dev/v2/rate-limits)
32
56
  termsOfService: https://lunchmoney.dev/#current-status
33
57
  contact:
34
58
  email: devsupport@lunchmoney.app
@@ -38,11 +62,10 @@ info:
38
62
  version: 2.11.1
39
63
 
40
64
  servers:
41
- - url: https://api.lunchmoney.dev/v2
42
- description: v2 Lunch Money API Server - changes will affect real data!
43
- # - url: https://lunchmoney.dev/v2
44
- - url: https://lunchmoney.dev/v2
45
- description: Static mock version of the v2 Lunch Money API Server
65
+ - url: https://api-beta.lunchmoney.app/v2
66
+ description: ⚠ LIVE — changes real Lunch Money data
67
+ - url: https://beta-mock.lunchmoney.dev/v2
68
+ description: MOCK — static demo data, no API key required
46
69
 
47
70
  tags:
48
71
  - name: me
@@ -76,7 +99,11 @@ tags:
76
99
  description: Learn more about crypto assets
77
100
  url: https://support.lunchmoney.app/setup/crypto
78
101
  - name: balance_history
79
- 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.
102
+ description: >-
103
+ View and update monthly account balances used by the
104
+ [Net Worth](https://my.lunchmoney.app/net-worth) views in the Lunch Money app.
105
+ History is monthly. The current month may be calculated on demand when
106
+ requested.
80
107
  - name: recurring_items
81
108
  description: Work with recurring items
82
109
  externalDocs:
@@ -990,16 +1017,19 @@ components:
990
1017
  example: Cold Wallet BTC
991
1018
  display_name:
992
1019
  type: string
1020
+ nullable: true
993
1021
  minLength: 1
994
1022
  maxLength: 45
995
- description: Optional display name for the manual crypto asset. If
996
- omitted, clients may derive one from `institution_name` + `name`.
1023
+ description: Display name for the manual crypto asset. If omitted or
1024
+ `null`, clients may derive one from `institution_name` + `name`.
997
1025
  example: Cold Storage
998
1026
  institution_name:
999
1027
  type: string
1028
+ nullable: true
1000
1029
  minLength: 1
1001
1030
  maxLength: 50
1002
- description: Optional institution or wallet provider display name
1031
+ description: Institution or wallet provider display name. If omitted
1032
+ or `null`, no institution name is set.
1003
1033
  example: Ledger
1004
1034
  balance:
1005
1035
  oneOf:
@@ -1255,15 +1285,19 @@ components:
1255
1285
  example: My Savings Account
1256
1286
  institution_name:
1257
1287
  type: string
1288
+ nullable: true
1258
1289
  example: Bank of the West
1259
- description: Name of institution holding the manual account
1290
+ description: Name of the institution holding the manual account. If
1291
+ omitted or `null`, no institution name is set.
1260
1292
  minLength: 1
1261
1293
  maxLength: 50
1262
1294
  display_name:
1263
1295
  type: string
1264
- description: Display name of the manual account as set by user or
1265
- derived from the `institution_name` and `name` if not explicitly
1266
- set.<br> This must be unique for the budgeting account.
1296
+ nullable: true
1297
+ description: Display name of the manual account. If omitted or
1298
+ `null`, it is derived from `institution_name` and `name`. An
1299
+ explicitly set display name must be unique for the budgeting
1300
+ account.
1267
1301
  example: Savings
1268
1302
  type:
1269
1303
  description: The type of manual account
@@ -1271,8 +1305,10 @@ components:
1271
1305
  - $ref: "#/components/schemas/accountTypeEnum"
1272
1306
  subtype:
1273
1307
  type: string
1274
- description: An optional manual account subtype. Examples include<br>
1275
- - retirement - checking - savings - prepaid credit card
1308
+ nullable: true
1309
+ description: Manual account subtype. If omitted or `null`, no subtype
1310
+ is set. Examples include retirement, checking, savings, and prepaid
1311
+ credit card.
1276
1312
  minLength: 1
1277
1313
  maxLength: 100
1278
1314
  example: prepaid credit card
@@ -1646,7 +1682,7 @@ components:
1646
1682
  type:
1647
1683
  type: string
1648
1684
  enum: [manual]
1649
- description: Identifies this entry as belonging to a manually-managed account.
1685
+ description: Identifies this entry as belonging to a manual account.
1650
1686
  manual_account_id:
1651
1687
  type: integer
1652
1688
  format: int32
@@ -1675,14 +1711,14 @@ components:
1675
1711
 
1676
1712
  balanceHistorySourceCryptoManual:
1677
1713
  type: object
1678
- description: Source information for a manually-tracked cryptocurrency balance history entry.
1714
+ description: Source information for a manual cryptocurrency balance history entry.
1679
1715
  additionalProperties: false
1680
1716
  x-internal: true
1681
1717
  properties:
1682
1718
  type:
1683
1719
  type: string
1684
1720
  enum: [crypto_manual]
1685
- description: Identifies this entry as belonging to a manually-tracked crypto account.
1721
+ description: Identifies this entry as belonging to a manual crypto account.
1686
1722
  crypto_manual_id:
1687
1723
  type: integer
1688
1724
  format: int32
@@ -1725,10 +1761,11 @@ components:
1725
1761
  type: object
1726
1762
  x-internal: true
1727
1763
  description: >
1728
- Source information for a balance history entry whose account has since been deleted.
1764
+ Source information for balance history whose account has since been deleted.
1729
1765
  Historical balances are preserved when a user chooses to keep history on account deletion.
1730
1766
  This object contains details that can be used to display the deleted account in the UI.
1731
- The `deleted_account_id` can be passed to `PUT /v2/balance_history/deleted/{account_id}/details`
1767
+ The `deleted_account_id` can be passed to
1768
+ [PUT /balance_history/deleted/{account_id}/details](#tag/balance-history/PUT/balance_history/deleted/{account_id}/details)
1732
1769
  to update the archived source metadata.
1733
1770
  additionalProperties: false
1734
1771
  properties:
@@ -1759,11 +1796,11 @@ components:
1759
1796
  subtype:
1760
1797
  type: string
1761
1798
  nullable: true
1762
- description: Archived `subtype`` of the deleted account source
1799
+ description: Archived `subtype` of the deleted account source
1763
1800
  mask:
1764
1801
  type: string
1765
1802
  nullable: true
1766
- description: Archived account `mask` for a deleted plaid account source
1803
+ description: Archived account `mask` for a deleted Plaid account source
1767
1804
  symbol:
1768
1805
  type: string
1769
1806
  nullable: true
@@ -1785,12 +1822,14 @@ components:
1785
1822
  type: object
1786
1823
  title: balance history for an account object
1787
1824
  additionalProperties: false
1788
- description: Historical balance entries grouped under a single account source.
1825
+ description: Monthly balance entries grouped under a single account source.
1789
1826
  properties:
1790
1827
  source:
1791
1828
  description: >
1792
- Identifies the account this balance entry belongs to. The shape varies by
1793
- `source.type`. Use `source.type` to determine which account id field is present.
1829
+ Identifies the account these balance entries belong to. The shape varies by
1830
+ `source.type`. Each source type exposes a type-specific account id field
1831
+ (`manual_account_id`, `plaid_account_id`, `crypto_manual_id`,
1832
+ `crypto_synced_id`, or `deleted_account_id`).
1794
1833
  oneOf:
1795
1834
  - $ref: "#/components/schemas/balanceHistorySourceManual"
1796
1835
  - $ref: "#/components/schemas/balanceHistorySourcePlaid"
@@ -1808,38 +1847,48 @@ components:
1808
1847
  balances:
1809
1848
  type: array
1810
1849
  description: >
1811
- Monthly balance history entries for the source account. On GET responses,
1812
- this includes all entries in the requested range. On PUT upsert responses,
1813
- this includes only the entries modified by that request.
1850
+ Monthly balance entries for this account source. A `historical` entry is
1851
+ a stored snapshot of a past month and includes an `id`. A `current` entry
1852
+ is an ephemeral snapshot based on the account's current balances and has
1853
+ no balance-entry `id`. On PUT upsert responses, this array includes only
1854
+ the `type: historical` entries modified by that request.
1814
1855
  items:
1815
- $ref: "#/components/schemas/balanceHistoryObject"
1856
+ $ref: "#/components/schemas/balanceHistoryEntry"
1816
1857
  required:
1817
1858
  - source
1818
1859
  - balances
1819
1860
 
1820
- balanceHistoryObject:
1861
+ historicalBalanceHistoryEntry:
1821
1862
  type: object
1822
- title: balance history entry object
1863
+ title: historical balance history entry
1823
1864
  additionalProperties: false
1824
1865
  x-internal: true
1825
- description: A historical balance entry for a single account on a single date.
1866
+ description: >
1867
+ A stored monthly balance for a past month. The `id` may be used with
1868
+ balance history entry endpoints. The balance represents the account
1869
+ balance at or around the end of `month`.
1826
1870
  properties:
1871
+ type:
1872
+ type: string
1873
+ enum: [historical]
1874
+ description: Identifies this entry as a stored snapshot of a past month.
1827
1875
  id:
1828
1876
  type: integer
1829
1877
  format: int32
1830
- description: Unique identifier of this historical balance entry.
1831
- date:
1878
+ description: Unique identifier for this historical balance entry.
1879
+ month:
1832
1880
  type: string
1833
- format: date
1834
- description: Date of this historical balance entry in YYYY-MM-DD format. This is always the first day of a month.
1881
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
1882
+ description: Calendar month for this entry in YYYY-MM format.
1883
+ example: "2026-06"
1835
1884
  balance:
1836
1885
  type: string
1837
1886
  pattern: ^-?\d+(\.\d{1,4})?$
1838
- 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.
1887
+ 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.
1839
1888
  currency:
1840
1889
  allOf:
1841
1890
  - $ref: "#/components/schemas/currencyEnum"
1842
- description: Currency of the stored `balance`. For crypto entries this is the user's primary currency.
1891
+ description: Currency of `balance`. For crypto entries this is the user's primary currency.
1843
1892
  to_base:
1844
1893
  type: number
1845
1894
  format: double
@@ -1848,19 +1897,82 @@ components:
1848
1897
  type: string
1849
1898
  nullable: true
1850
1899
  pattern: ^-?\d+(\.\d{1,18})?$
1851
- description: Crypto quantity stored for this balance entry, when available. This may be present for crypto or deleted-account entries and is `null` otherwise.
1900
+ description: Crypto quantity for this balance entry, when available. This may be present for crypto or deleted-account entries and is `null` otherwise.
1852
1901
  required:
1902
+ - type
1853
1903
  - id
1854
- - date
1904
+ - month
1855
1905
  - balance
1856
1906
  - currency
1857
1907
  - to_base
1858
1908
  - crypto_balance
1859
1909
 
1910
+ currentBalanceHistoryEntry:
1911
+ type: object
1912
+ title: current balance history entry
1913
+ additionalProperties: false
1914
+ x-internal: true
1915
+ description: >
1916
+ An ephemeral snapshot based on the account's current balances. It may
1917
+ change between requests.
1918
+ properties:
1919
+ type:
1920
+ type: string
1921
+ enum: [current]
1922
+ description: Identifies this entry as an ephemeral current-month snapshot.
1923
+ month:
1924
+ type: string
1925
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
1926
+ description: Calendar month for this entry in YYYY-MM format. For current entries this is the current month.
1927
+ example: "2026-07"
1928
+ balance:
1929
+ type: string
1930
+ pattern: ^-?\d+(\.\d{1,4})?$
1931
+ 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.
1932
+ currency:
1933
+ allOf:
1934
+ - $ref: "#/components/schemas/currencyEnum"
1935
+ description: Currency of the calculated `balance`. For crypto entries this is the user's primary currency.
1936
+ to_base:
1937
+ type: number
1938
+ format: double
1939
+ 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`.
1940
+ crypto_balance:
1941
+ type: string
1942
+ nullable: true
1943
+ pattern: ^-?\d+(\.\d{1,18})?$
1944
+ description: Crypto quantity for this calculated entry, when available. This may be present for crypto entries and is `null` otherwise.
1945
+ required:
1946
+ - type
1947
+ - month
1948
+ - balance
1949
+ - currency
1950
+ - to_base
1951
+ - crypto_balance
1952
+
1953
+ balanceHistoryEntry:
1954
+ title: balance history entry
1955
+ x-internal: true
1956
+ description: >
1957
+ A monthly balance history entry. Discriminated by `type`. `historical`
1958
+ entries are stored snapshots of past months with an `id`. `current`
1959
+ entries are ephemeral snapshots with no balance-entry `id`.
1960
+ oneOf:
1961
+ - $ref: "#/components/schemas/historicalBalanceHistoryEntry"
1962
+ - $ref: "#/components/schemas/currentBalanceHistoryEntry"
1963
+ discriminator:
1964
+ propertyName: type
1965
+ mapping:
1966
+ historical: "#/components/schemas/historicalBalanceHistoryEntry"
1967
+ current: "#/components/schemas/currentBalanceHistoryEntry"
1968
+
1860
1969
  balanceHistoryListResponseObject:
1861
1970
  type: object
1862
1971
  additionalProperties: false
1863
1972
  x-internal: true
1973
+ description: >
1974
+ List response for balance history GET endpoints. Entries are grouped by
1975
+ account source under `balance_history`.
1864
1976
  properties:
1865
1977
  balance_history:
1866
1978
  type: array
@@ -1873,31 +1985,39 @@ components:
1873
1985
  type: object
1874
1986
  x-internal: true
1875
1987
  additionalProperties: false
1988
+ description: >
1989
+ A single monthly balance entry to upsert. Request bodies use this shape.
1990
+ Responses return `type: historical` entries instead.
1876
1991
  properties:
1877
1992
  id:
1878
1993
  type: integer
1879
1994
  format: int32
1880
1995
  description: System-defined balance history entry id. Ignored if set.
1881
1996
  x-updatable: false
1882
- date:
1997
+ month:
1883
1998
  type: string
1884
- format: date
1885
- 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.
1999
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
2000
+ description: >
2001
+ Calendar month to upsert, in YYYY-MM format. Must be a past month.
2002
+ The current month cannot be written through PUT endpoints.
2003
+ example: "2026-06"
1886
2004
  balance:
1887
2005
  oneOf:
1888
2006
  - type: number
1889
2007
  format: double
1890
2008
  - type: string
1891
2009
  pattern: ^-?\d+(\.\d{1,4})?$
1892
- 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.
2010
+ 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.
1893
2011
  symbol:
1894
2012
  type: string
1895
2013
  nullable: true
1896
2014
  minLength: 1
1897
2015
  maxLength: 25
1898
- description: Optional for crypto balances, but if set it must match the account's symbol.
1899
- Tolerated for deleted-account balances. Do not provide this for manual or Plaid balances.
1900
- If provided when using the synced crypto path-based endpoint, this must match the symbol in the path.
2016
+ description: >
2017
+ Optional for crypto balances. If set, it must match the account's
2018
+ symbol. Tolerated for deleted-account balances. Do not provide this
2019
+ for manual or Plaid balances. On the synced crypto path endpoint, if
2020
+ provided it must match the `symbol` path parameter.
1901
2021
  x-updatable: true
1902
2022
  crypto_balance:
1903
2023
  type: string
@@ -1913,10 +2033,10 @@ components:
1913
2033
  to_base:
1914
2034
  type: number
1915
2035
  format: double
1916
- description: System-defined historical balance converted to the user's primary currency. Ignored if set. Use `balance` to update the stored historical balance.
2036
+ description: System-defined historical balance converted to the user's primary currency. Ignored if set. Use `balance` to update the historical balance.
1917
2037
  x-updatable: false
1918
2038
  required:
1919
- - date
2039
+ - month
1920
2040
  - balance
1921
2041
 
1922
2042
  upsertBalanceHistoryRequestObject:
@@ -1927,7 +2047,11 @@ components:
1927
2047
  balances:
1928
2048
  type: array
1929
2049
  minItems: 1
1930
- description: One or more monthly balance history entries to upsert
2050
+ description: >
2051
+ One or more monthly balance history entries to upsert. Each entry uses
2052
+ `month` (YYYY-MM) and `balance`. Do not include response-only fields such
2053
+ as `type`. PUT responses return only the `type: historical` entries
2054
+ modified by the request.
1931
2055
  items:
1932
2056
  $ref: "#/components/schemas/balanceHistoryUpdateItemObject"
1933
2057
  required:
@@ -1942,51 +2066,58 @@ components:
1942
2066
  name:
1943
2067
  type: string
1944
2068
  nullable: true
1945
- description: New archived account name for the deleted account source.
2069
+ description: New archived account name for the deleted account source
1946
2070
  institution_name:
1947
2071
  type: string
1948
2072
  nullable: true
1949
- description: New archived institution name for the deleted account source.
2073
+ description: New archived institution name for the deleted account source
1950
2074
  display_name:
1951
2075
  type: string
1952
2076
  nullable: true
1953
- description: New display name for the deleted account source.
2077
+ description: New display name for the deleted account source
1954
2078
  account_type:
1955
2079
  type: string
1956
2080
  nullable: true
1957
- description: New archived account type for the deleted account source.
2081
+ description: New archived account type for the deleted account source
1958
2082
  subtype:
1959
2083
  type: string
1960
2084
  nullable: true
1961
- description: New archived subtype for the deleted account source.
2085
+ description: New archived subtype for the deleted account source
1962
2086
  mask:
1963
2087
  type: string
1964
2088
  nullable: true
1965
- description: New archived account mask for the deleted account source.
2089
+ description: New archived account mask for the deleted account source
1966
2090
 
1967
2091
  updateBalanceHistoryDetailsResponseObject:
1968
2092
  type: object
1969
2093
  x-internal: true
1970
2094
  additionalProperties: false
2095
+ description: Updated archived metadata for a deleted balance history source
1971
2096
  properties:
1972
2097
  name:
1973
2098
  type: string
1974
2099
  nullable: true
2100
+ description: Archived account name for the deleted account source
1975
2101
  institution_name:
1976
2102
  type: string
1977
2103
  nullable: true
2104
+ description: Archived institution name for the deleted account source
1978
2105
  display_name:
1979
2106
  type: string
1980
2107
  nullable: true
2108
+ description: Archived display name for the deleted account source
1981
2109
  account_type:
1982
2110
  type: string
1983
2111
  nullable: true
2112
+ description: Archived account type for the deleted account source
1984
2113
  subtype:
1985
2114
  type: string
1986
2115
  nullable: true
2116
+ description: Archived subtype for the deleted account source
1987
2117
  mask:
1988
2118
  type: string
1989
2119
  nullable: true
2120
+ description: Archived account mask for the deleted account source
1990
2121
  required:
1991
2122
  - name
1992
2123
  - institution_name
@@ -2942,7 +3073,7 @@ components:
2942
3073
  currency:
2943
3074
  description: Three-letter lowercase currency code of the transaction
2944
3075
  in ISO 4217 format. Must match one of the [supported
2945
- currencies](https://lunchmoney.dev/v2/currencies). If not set
3076
+ currencies](https://beta.lunchmoney.dev/v2/currencies). If not set
2946
3077
  defaults to the user account's primary currency.
2947
3078
  allOf:
2948
3079
  - $ref: "#/components/schemas/currencyEnum"
@@ -3087,6 +3218,7 @@ components:
3087
3218
  description: |
3088
3219
  The new payee for the transaction.
3089
3220
  minLength: 0
3221
+ x-updatable: true
3090
3222
  original_name:
3091
3223
  type: string
3092
3224
  nullable: true
@@ -3298,9 +3430,10 @@ components:
3298
3430
  category_id:
3299
3431
  type: integer
3300
3432
  format: int32
3301
- description: Unique identifier for associated category_id. Category
3302
- must already exist for the account. Will inherit category from the
3303
- parent if not defined.
3433
+ nullable: true
3434
+ description: Category ID for the child transaction. The category must
3435
+ already exist for the account. If omitted, the child inherits the
3436
+ parent category. If `null`, the child has no category.
3304
3437
  tag_ids:
3305
3438
  type: array
3306
3439
  description: The IDs of any tags to apply to this split child
@@ -3310,7 +3443,10 @@ components:
3310
3443
  format: int32
3311
3444
  notes:
3312
3445
  type: string
3313
- description: Will inherit notes from parent if not defined.
3446
+ nullable: true
3447
+ description: Notes for the child transaction. If omitted, the child
3448
+ inherits the parent notes. If `null` or an empty string, the child
3449
+ has no notes.
3314
3450
  required:
3315
3451
  - amount
3316
3452
 
@@ -4818,22 +4954,10 @@ components:
4818
4954
  securitySchemes:
4819
4955
  bearerSecurity:
4820
4956
  type: http
4821
- # TODO Make this shorter?
4822
- # description: The Lunch Money API uses API keys to authenticate requests. To use
4823
- # the v1 API you can view and manage your API keys on the [developers page
4824
- # in the Lunch Money app](https://my.lunchmoney.app/developers). <p> To
4825
- # interact with the Static Mock Server simply enter an API key of 11
4826
- # characters or more. <p> To interact with the v2 service implemented on
4827
- # top of the v1 API paste in a real API token associated with a Lunch
4828
- # Money Budget.
4829
- description: To interact with the Static Mock Server simply enter an API
4830
- key of 11 characters or more.
4957
+ description: >-
4958
+ Required for the LIVE server. Optional for MOCK.
4831
4959
  scheme: bearer
4832
4960
  bearerFormat: JWT
4833
- cookieAuth:
4834
- type: apiKey
4835
- in: cookie
4836
- name: _lm_access_token
4837
4961
 
4838
4962
  paths:
4839
4963
  /me:
@@ -4876,8 +5000,13 @@ paths:
4876
5000
  tags:
4877
5001
  - me
4878
5002
  summary: Get account settings
4879
- description: Returns account-level settings for the budgeting
4880
- account associated with the authorized API token.
5003
+ description: |-
5004
+ > [!warning]
5005
+ > **Preview endpoint** — behavior is subject to change. This endpoint is available in the mock server but not implemented yet on the live api service. Design feedback is welcome. [Email dev-support@lunchmoney.app](mailto:dev-support@lunchmoney.app) or join us in the [developers channel](https://discord.com/channels/842337014556262411/1134594318414389258) on the [Lunch Money Discord](https://lunchmoney.app/discord).
5006
+
5007
+
5008
+ Returns account-level settings for the budgeting account associated with the authorized API token.<p>
5009
+ These settings apply only to this budgeting account; a user with access to multiple budgets has separate account settings for each.
4881
5010
  operationId: getAccountSettings
4882
5011
  responses:
4883
5012
  "200":
@@ -4909,8 +5038,14 @@ paths:
4909
5038
  - me
4910
5039
  summary: Update account settings
4911
5040
  description: |-
5041
+ > [!warning]
5042
+ > **Preview endpoint** — behavior is subject to change. This endpoint is available in the mock server but not implemented yet on the live api service. Design feedback is welcome. [Email dev-support@lunchmoney.app](mailto:dev-support@lunchmoney.app) or join us in the [developers channel](https://discord.com/channels/842337014556262411/1134594318414389258) on the [Lunch Money Discord](https://lunchmoney.app/discord).
5043
+
5044
+
4912
5045
  Updates account-level settings for the budgeting account
4913
- associated with the authorized API token.<p> You may submit the response from a
5046
+ associated with the authorized API token.<p>
5047
+ These settings apply only to this budgeting account; a user with access to multiple budgets has separate account settings for each.<p>
5048
+ You may submit the response from a
4914
5049
  `GET /me/account/settings` as the request body; however, only certain
4915
5050
  properties can be updated.<p> It is also possible to provide only the
4916
5051
  properties to be updated in the request body, as long as the request
@@ -4954,8 +5089,13 @@ paths:
4954
5089
  tags:
4955
5090
  - me
4956
5091
  summary: Get user settings
4957
- description: Returns user-level display and formatting preferences for the
4958
- user associated with the authorized API token.
5092
+ description: |-
5093
+ > [!warning]
5094
+ > **Preview endpoint** — behavior is subject to change. This endpoint is available in the mock server but not implemented yet on the live api service. Design feedback is welcome. [Email dev-support@lunchmoney.app](mailto:dev-support@lunchmoney.app) or join us in the [developers channel](https://discord.com/channels/842337014556262411/1134594318414389258) on the [Lunch Money Discord](https://lunchmoney.app/discord).
5095
+
5096
+
5097
+ Returns user-level display and formatting preferences for the user associated with the authorized API token.<p>
5098
+ User settings belong to the user and apply across all budgets they can access.
4959
5099
  operationId: getUserSettings
4960
5100
  responses:
4961
5101
  "200":
@@ -4985,8 +5125,14 @@ paths:
4985
5125
  - me
4986
5126
  summary: Update user settings
4987
5127
  description: |-
5128
+ > [!warning]
5129
+ > **Preview endpoint** — behavior is subject to change. This endpoint is available in the mock server but not implemented yet on the live api service. Design feedback is welcome. [Email dev-support@lunchmoney.app](mailto:dev-support@lunchmoney.app) or join us in the [developers channel](https://discord.com/channels/842337014556262411/1134594318414389258) on the [Lunch Money Discord](https://lunchmoney.app/discord).
5130
+
5131
+
4988
5132
  Updates user-level display and formatting preferences for the user
4989
- associated with the authorized API token.<p> You may submit the response
5133
+ associated with the authorized API token.<p>
5134
+ User settings belong to the user and apply across all budgets they can access.<p>
5135
+ You may submit the response from a
4990
5136
  from a `GET /me/user/settings` as the request body; however, only
4991
5137
  certain properties can be updated.<p> It is also possible to provide
4992
5138
  only the properties to be updated in the request body, as long as the
@@ -6277,12 +6423,9 @@ paths:
6277
6423
  tags:
6278
6424
  - crypto-manual
6279
6425
  summary: Get all supported cryptocurrencies
6280
- description: >
6426
+ description: |-
6281
6427
  Retrieve the list of cryptocurrencies currently supported for manual tracking.<p>
6282
-
6283
- When creating a new manual crypto balance via `POST /crypto/manual`, the
6284
- `symbol` you specify must match the `symbol` of one of the entries
6285
- returned by this endpoint.
6428
+ 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.
6286
6429
  operationId: getAllCryptocurrencies
6287
6430
  responses:
6288
6431
  "200":
@@ -6320,16 +6463,9 @@ paths:
6320
6463
  - crypto-manual
6321
6464
  summary: Add a new supported cryptocurrency
6322
6465
  operationId: createCryptocurrency
6323
- description: >-
6466
+ description: |-
6324
6467
  Adds a new cryptocurrency to the supported manual-crypto list.<br><br>
6325
-
6326
- Lunch Money uses [CoinGecko](https://www.coingecko.com/us/coins/ethereum)
6327
- to convert crypto balances to the user's primary currency. Users add a
6328
- new supported cryptocurrency by submitting a CoinGecko coin-page URL.
6329
- The server validates the URL, extracts the id from `/coins/{id}`,
6330
- checks for an existing supported `coingecko_id`, validates the id
6331
- against CoinGecko, then confirms the resolved symbol is not already
6332
- supported before creating the new entry.
6468
+ 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.
6333
6469
  requestBody:
6334
6470
  required: true
6335
6471
  content:
@@ -6408,8 +6544,8 @@ paths:
6408
6544
  tags:
6409
6545
  - crypto-manual
6410
6546
  summary: Get all manual crypto balances
6411
- description: Retrieve all manually managed crypto balances associated with
6412
- the user's account.
6547
+ description: |-
6548
+ Retrieve all manually managed crypto balances associated with the user's account.
6413
6549
  operationId: getAllCryptoManual
6414
6550
  responses:
6415
6551
  "200":
@@ -6443,11 +6579,9 @@ paths:
6443
6579
  tags:
6444
6580
  - crypto-manual
6445
6581
  summary: Create a manual crypto balance
6446
- description: >-
6582
+ description: |-
6447
6583
  Create a manually managed crypto asset.<br><br>
6448
-
6449
- If `display_name` is `null`, clients may derive one from
6450
- `institution_name` + `name`.
6584
+ If `display_name` is `null`, clients may derive one from `institution_name` + `name`.
6451
6585
  operationId: createCryptoManual
6452
6586
  requestBody:
6453
6587
  required: true
@@ -6532,7 +6666,8 @@ paths:
6532
6666
  tags:
6533
6667
  - crypto-manual
6534
6668
  summary: Get a single manual crypto balance
6535
- description: Retrieve a single manually managed crypto balance by ID.
6669
+ description: |-
6670
+ Retrieve a single manually managed crypto balance by ID.
6536
6671
  operationId: getCryptoManualById
6537
6672
  parameters:
6538
6673
  - name: id
@@ -6600,11 +6735,9 @@ paths:
6600
6735
  tags:
6601
6736
  - crypto-manual
6602
6737
  summary: Update a manual crypto balance
6603
- description: >-
6738
+ description: |-
6604
6739
  Modify a manually managed crypto balance.<br><br>
6605
-
6606
- You may submit the response from `GET /crypto/manual/{id}` as the request body. System-defined properties
6607
- are accepted according to the `x-updatable` metadata in the update schema.
6740
+ 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.
6608
6741
  operationId: updateCryptoManual
6609
6742
  parameters:
6610
6743
  - name: id
@@ -6701,10 +6834,8 @@ paths:
6701
6834
  tags:
6702
6835
  - crypto-manual
6703
6836
  summary: Delete a manual crypto balance
6704
- description: Delete a single manually managed crypto asset by ID.<p> If
6705
- this crypto asset has a balance history, and you do not explicitly set
6706
- the query parameter`keep_history`, a 422 response will be returned
6707
- requesting you to explicitly set `keep_history` to `true` or `false`.
6837
+ description: |-
6838
+ 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`.
6708
6839
  operationId: deleteCryptoManual
6709
6840
  parameters:
6710
6841
  - name: id
@@ -6769,8 +6900,8 @@ paths:
6769
6900
  tags:
6770
6901
  - crypto-synced
6771
6902
  summary: Get all synced crypto accounts
6772
- description: Retrieves all synced crypto accounts
6773
- associated with the user's account.
6903
+ description: |-
6904
+ Retrieves all synced crypto accounts associated with the user's account.
6774
6905
  operationId: getAllCryptoSynced
6775
6906
  responses:
6776
6907
  "200":
@@ -6832,8 +6963,8 @@ paths:
6832
6963
  tags:
6833
6964
  - crypto-synced
6834
6965
  summary: Get a single synced crypto account
6835
- description: Retrieves the synced crypto account and all nested balances
6836
- for the specified synced crypto account ID.
6966
+ description: |-
6967
+ Retrieves the synced crypto account and all nested balances for the specified synced crypto account ID.
6837
6968
  operationId: getCryptoSyncedById
6838
6969
  parameters:
6839
6970
  - name: id
@@ -6913,8 +7044,8 @@ paths:
6913
7044
  tags:
6914
7045
  - crypto-synced
6915
7046
  summary: Get a synced crypto balance by symbol
6916
- description: Retrieves a single balance from the specified synced crypto
6917
- account using the crypto symbol.
7047
+ description: |-
7048
+ Retrieves a single balance from the specified synced crypto account using the crypto symbol.
6918
7049
  operationId: getCryptoSyncedBalanceBySymbol
6919
7050
  parameters:
6920
7051
  - name: id
@@ -6993,8 +7124,8 @@ paths:
6993
7124
  tags:
6994
7125
  - crypto-synced
6995
7126
  summary: Refresh balances for a synced crypto account
6996
- description: Trigger a balance refresh for the specified synced crypto
6997
- account. Returns the refreshed synced crypto account.
7127
+ description: |-
7128
+ Trigger a balance refresh for the specified synced crypto account. Returns the refreshed synced crypto account.
6998
7129
  operationId: refreshCryptoSynced
6999
7130
  parameters:
7000
7131
  - name: id
@@ -7063,51 +7194,55 @@ paths:
7063
7194
  tags:
7064
7195
  - balance_history
7065
7196
  summary: Get balance history
7066
- description: >-
7067
- Retrieve historical balance entries.<br><br>
7068
-
7069
- Balance history is monthly. When `start_date` and `end_date` are both provided,
7070
- they must be first-of-month dates. `start_date` must not be in the future,
7071
- while `end_date` may be in the future. If one of `start_date` or `end_date`
7072
- is provided, the other is required. If neither is provided, all available
7073
- balance history is returned.<br><br>
7074
-
7075
- The response groups entries by source account. Each item in
7076
- `balance_history` contains a `source` object plus a `balances` array
7077
- containing one balance entry per month in the requested range, or all
7078
- stored entries when no range is provided.<br><br>
7079
-
7080
- Historical entries for accounts that have been deleted may still
7081
- be returned. These entries use `source.type: deleted` and include
7082
- `deleted_account_id`, archived display fields, and account metadata on the
7083
- `source` object.
7197
+ description: |-
7198
+ Retrieve monthly balance history for all account sources.<br><br>
7199
+ 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>
7200
+ 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>
7201
+ 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>
7202
+ Each balance entry has a `type`:<br>
7203
+ - `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>
7204
+ - `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>
7205
+ &nbsp;&nbsp;&nbsp;&nbsp;- `manual`: `source.manual_account_id` with [GET /manual_accounts/{id}](#tag/manual-accounts/GET/manual_accounts/{id})<br>
7206
+ &nbsp;&nbsp;&nbsp;&nbsp;- `plaid`: `source.plaid_account_id` with [GET /plaid_accounts/{id}](#tag/plaid-accounts/GET/plaid_accounts/{id})<br>
7207
+ &nbsp;&nbsp;&nbsp;&nbsp;- `crypto_manual`: `source.crypto_manual_id` with [GET /crypto/manual/{id}](#tag/crypto-manual/GET/crypto/manual/{id})<br>
7208
+ &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})
7084
7209
  operationId: getBalanceHistory
7085
7210
  parameters:
7086
- - name: start_date
7211
+ - name: start_month
7087
7212
  in: query
7088
- 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.
7213
+ description: >-
7214
+ Optional start of the requested history range as a calendar month in
7215
+ YYYY-MM format (for example `2026-06`). If set, `end_month` is also
7216
+ required. The range is inclusive. `start_month` must not be in the
7217
+ future. A full date such as `2026-06-01` is invalid.
7089
7218
  required: false
7090
7219
  schema:
7091
7220
  type: string
7092
- format: date
7221
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7093
7222
  examples:
7094
7223
  range start:
7095
- summary: Start date
7096
- value: "2026-01-01"
7097
- - name: end_date
7224
+ summary: Start month
7225
+ value: "2026-01"
7226
+ - name: end_month
7098
7227
  in: query
7099
- 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`.
7228
+ description: >-
7229
+ Optional end of the requested history range as a calendar month in
7230
+ YYYY-MM format (for example `2026-06`). If set, `start_month` is also
7231
+ required. The range is inclusive. `end_month` may not be earlier than
7232
+ `start_month` and must not be in the future. A full date such as
7233
+ `2026-06-01` is invalid. For a single month, set this to the same
7234
+ value as `start_month`.
7100
7235
  required: false
7101
7236
  schema:
7102
7237
  type: string
7103
- format: date
7238
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7104
7239
  examples:
7105
7240
  range end:
7106
- summary: End date
7107
- value: "2026-03-01"
7241
+ summary: End month
7242
+ value: "2026-03"
7108
7243
  responses:
7109
7244
  "200":
7110
- description: Historical balance entries for the requested date range
7245
+ description: Monthly balance history for the requested month range
7111
7246
  content:
7112
7247
  application/json:
7113
7248
  schema:
@@ -7120,14 +7255,16 @@ paths:
7120
7255
  type: manual
7121
7256
  manual_account_id: 119807
7122
7257
  balances:
7123
- - id: 101
7124
- date: "2026-01-01"
7258
+ - type: historical
7259
+ id: 101
7260
+ month: "2026-01"
7125
7261
  balance: "41000.0000"
7126
7262
  currency: usd
7127
7263
  to_base: 41000
7128
7264
  crypto_balance: null
7129
- - id: 102
7130
- date: "2026-02-01"
7265
+ - type: historical
7266
+ id: 102
7267
+ month: "2026-02"
7131
7268
  balance: "41211.8000"
7132
7269
  currency: usd
7133
7270
  to_base: 41211.8
@@ -7136,8 +7273,9 @@ paths:
7136
7273
  type: plaid
7137
7274
  plaid_account_id: 119808
7138
7275
  balances:
7139
- - id: 103
7140
- date: "2026-01-01"
7276
+ - type: historical
7277
+ id: 103
7278
+ month: "2026-01"
7141
7279
  balance: "5498.2800"
7142
7280
  currency: usd
7143
7281
  to_base: 5498.28
@@ -7147,8 +7285,9 @@ paths:
7147
7285
  crypto_manual_id: 22001
7148
7286
  symbol: btc
7149
7287
  balances:
7150
- - id: 104
7151
- date: "2026-01-01"
7288
+ - type: historical
7289
+ id: 104
7290
+ month: "2026-01"
7152
7291
  balance: "53124.7200"
7153
7292
  currency: usd
7154
7293
  to_base: 53124.72
@@ -7158,8 +7297,9 @@ paths:
7158
7297
  crypto_synced_id: 33004
7159
7298
  symbol: btc
7160
7299
  balances:
7161
- - id: 105
7162
- date: "2026-01-01"
7300
+ - type: historical
7301
+ id: 105
7302
+ month: "2026-01"
7163
7303
  balance: "6231.2800"
7164
7304
  currency: usd
7165
7305
  to_base: 6231.28
@@ -7175,12 +7315,34 @@ paths:
7175
7315
  mask: "1234"
7176
7316
  symbol: null
7177
7317
  balances:
7178
- - id: 106
7179
- date: "2026-01-01"
7318
+ - type: historical
7319
+ id: 106
7320
+ month: "2026-01"
7180
7321
  balance: "1250.0000"
7181
7322
  currency: usd
7182
7323
  to_base: 1250
7183
7324
  crypto_balance: null
7325
+ historical and current:
7326
+ summary: Historical month plus ephemeral current month
7327
+ value:
7328
+ balance_history:
7329
+ - source:
7330
+ type: manual
7331
+ manual_account_id: 162003
7332
+ balances:
7333
+ - type: historical
7334
+ id: 7437356
7335
+ month: "2026-06"
7336
+ balance: "62.8"
7337
+ currency: usd
7338
+ to_base: 62.8
7339
+ crypto_balance: null
7340
+ - type: current
7341
+ month: "2026-07"
7342
+ balance: "71.2"
7343
+ currency: usd
7344
+ to_base: 71.2
7345
+ crypto_balance: null
7184
7346
  manual account history:
7185
7347
  value:
7186
7348
  balance_history:
@@ -7188,14 +7350,16 @@ paths:
7188
7350
  type: manual
7189
7351
  manual_account_id: 119807
7190
7352
  balances:
7191
- - id: 201
7192
- date: "2026-01-01"
7353
+ - type: historical
7354
+ id: 201
7355
+ month: "2026-01"
7193
7356
  balance: "41000.0000"
7194
7357
  currency: usd
7195
7358
  to_base: 41000
7196
7359
  crypto_balance: null
7197
- - id: 202
7198
- date: "2026-02-01"
7360
+ - type: historical
7361
+ id: 202
7362
+ month: "2026-02"
7199
7363
  balance: "41211.8000"
7200
7364
  currency: usd
7201
7365
  to_base: 41211.8
@@ -7207,8 +7371,9 @@ paths:
7207
7371
  type: plaid
7208
7372
  plaid_account_id: 119808
7209
7373
  balances:
7210
- - id: 301
7211
- date: "2026-02-01"
7374
+ - type: historical
7375
+ id: 301
7376
+ month: "2026-02"
7212
7377
  balance: "5498.2800"
7213
7378
  currency: usd
7214
7379
  to_base: 5498.28
@@ -7221,8 +7386,9 @@ paths:
7221
7386
  crypto_synced_id: 33004
7222
7387
  symbol: btc
7223
7388
  balances:
7224
- - id: 401
7225
- date: "2026-02-01"
7389
+ - type: historical
7390
+ id: 401
7391
+ month: "2026-02"
7226
7392
  balance: "6231.2800"
7227
7393
  currency: usd
7228
7394
  to_base: 6231.28
@@ -7241,8 +7407,9 @@ paths:
7241
7407
  mask: "1234"
7242
7408
  symbol: null
7243
7409
  balances:
7244
- - id: 501
7245
- date: "2026-01-01"
7410
+ - type: historical
7411
+ id: 501
7412
+ month: "2026-01"
7246
7413
  balance: "1250.0000"
7247
7414
  currency: usd
7248
7415
  to_base: 1250
@@ -7254,26 +7421,31 @@ paths:
7254
7421
  schema:
7255
7422
  $ref: "#/components/schemas/errorResponseObject"
7256
7423
  examples:
7257
- missing paired date:
7424
+ missing paired month:
7258
7425
  value:
7259
7426
  message: Request Validation Failure
7260
7427
  errors:
7261
- - errMsg: "`start_date` and `end_date` must either both be provided or both be omitted."
7428
+ - errMsg: "`start_month` and `end_month` must either both be provided or both be omitted."
7262
7429
  invalid range:
7263
7430
  value:
7264
7431
  message: Request Validation Failure
7265
7432
  errors:
7266
- - errMsg: "`start_date` must be before or equal to `end_date`."
7267
- not first of month:
7433
+ - errMsg: "`end_month` may not be earlier than `start_month`."
7434
+ invalid month format:
7435
+ value:
7436
+ message: Invalid Request Parameters
7437
+ errors:
7438
+ - errMsg: "Invalid value for parameter: 'start_month'. '2026-06-01' is not a valid month in YYYY-MM format."
7439
+ future start month:
7268
7440
  value:
7269
7441
  message: Request Validation Failure
7270
7442
  errors:
7271
- - errMsg: "`start_date` and `end_date` must both be the first day of a month."
7272
- future start date:
7443
+ - errMsg: "`start_month` must not be in the future."
7444
+ future end month:
7273
7445
  value:
7274
7446
  message: Request Validation Failure
7275
7447
  errors:
7276
- - errMsg: "`start_date` must not be in the future."
7448
+ - errMsg: "`end_month` must not be in the future."
7277
7449
  "401":
7278
7450
  $ref: "#/components/responses/unauthorizedToken"
7279
7451
  "429":
@@ -7285,23 +7457,16 @@ paths:
7285
7457
  tags:
7286
7458
  - balance_history
7287
7459
  summary: Get balance history for an account
7288
- description: >-
7289
- Retrieve historical balance entries for one manual, Plaid, manual crypto,
7290
- or deleted account. Crypto synced accounts require an additional `symbol` path parameter.<br><br>
7291
-
7292
- The `account_type` path parameter identifies the type of account and the
7293
- `account_id` path parameter identifies the specific id for that account type.<br><br>
7294
-
7295
- When `start_date` and `end_date` are both provided, they must be first-of-month
7296
- dates. `start_date` must not be in the future, while `end_date` may be in the future.
7297
- If one of `start_date` or `end_date` is provided, the other is required. If neither is
7298
- provided, all available history for the source is returned.
7460
+ description: |-
7461
+ 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>
7462
+ 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>
7463
+ `start_month`, `end_month`, and current-month entries behave as described in [GET /balance_history](#tag/balance-history/GET/balance_history).
7299
7464
  operationId: getBalanceHistoryForAccount
7300
7465
  parameters:
7301
7466
  - name: account_type
7302
7467
  in: path
7303
7468
  required: true
7304
- description: Source family to retrieve. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
7469
+ description: Account family to retrieve. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
7305
7470
  schema:
7306
7471
  type: string
7307
7472
  enum: [manual, plaid, crypto_manual, deleted]
@@ -7312,23 +7477,27 @@ paths:
7312
7477
  schema:
7313
7478
  type: integer
7314
7479
  format: int32
7315
- - name: start_date
7480
+ - name: start_month
7316
7481
  in: query
7317
- 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.
7482
+ description: >-
7483
+ Optional. Same format and constraints as `start_month` on
7484
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
7318
7485
  required: false
7319
7486
  schema:
7320
7487
  type: string
7321
- format: date
7322
- - name: end_date
7488
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7489
+ - name: end_month
7323
7490
  in: query
7324
- 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.
7491
+ description: >-
7492
+ Optional. Same format and constraints as `end_month` on
7493
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
7325
7494
  required: false
7326
7495
  schema:
7327
7496
  type: string
7328
- format: date
7497
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7329
7498
  responses:
7330
7499
  "200":
7331
- description: Historical balance entries for the requested source
7500
+ description: Monthly balance history for the requested source
7332
7501
  content:
7333
7502
  application/json:
7334
7503
  schema:
@@ -7341,14 +7510,16 @@ paths:
7341
7510
  type: manual
7342
7511
  manual_account_id: 119807
7343
7512
  balances:
7344
- - id: 201
7345
- date: "2026-01-01"
7513
+ - type: historical
7514
+ id: 201
7515
+ month: "2026-01"
7346
7516
  balance: "41000.0000"
7347
7517
  currency: usd
7348
7518
  to_base: 41000
7349
7519
  crypto_balance: null
7350
- - id: 202
7351
- date: "2026-02-01"
7520
+ - type: historical
7521
+ id: 202
7522
+ month: "2026-02"
7352
7523
  balance: "41211.8000"
7353
7524
  currency: usd
7354
7525
  to_base: 41211.8
@@ -7367,8 +7538,9 @@ paths:
7367
7538
  mask: "1234"
7368
7539
  symbol: null
7369
7540
  balances:
7370
- - id: 501
7371
- date: "2026-01-01"
7541
+ - type: historical
7542
+ id: 501
7543
+ month: "2026-01"
7372
7544
  balance: "1250.0000"
7373
7545
  currency: usd
7374
7546
  to_base: 1250
@@ -7380,16 +7552,16 @@ paths:
7380
7552
  schema:
7381
7553
  $ref: "#/components/schemas/errorResponseObject"
7382
7554
  examples:
7383
- missing paired date:
7555
+ missing paired month:
7384
7556
  value:
7385
7557
  message: Request Validation Failure
7386
7558
  errors:
7387
- - errMsg: "`start_date` and `end_date` must either both be provided or both be omitted."
7388
- invalid range:
7559
+ - errMsg: "`start_month` and `end_month` must either both be provided or both be omitted."
7560
+ invalid month format:
7389
7561
  value:
7390
- message: Request Validation Failure
7562
+ message: Invalid Request Parameters
7391
7563
  errors:
7392
- - errMsg: "`start_date` must be before or equal to `end_date`."
7564
+ - errMsg: "Invalid value for parameter: 'start_month'. '2026-06-01' is not a valid month in YYYY-MM format."
7393
7565
  "401":
7394
7566
  $ref: "#/components/responses/unauthorizedToken"
7395
7567
  "404":
@@ -7417,37 +7589,20 @@ paths:
7417
7589
  tags:
7418
7590
  - balance_history
7419
7591
  summary: Upsert balance history for an account
7420
- description: >-
7421
- Upsert one or more historical balance entries for a single manual, Plaid,
7422
- manual crypto, or deleted account. Crypto synced accounts require an additional `symbol` path parameter.<br><br>
7423
-
7424
- The `account_type` path parameter identifies the type of account and the
7425
- `account_id` path parameter identifies the specific id for that account type.<br><br>
7426
-
7427
- Submit one or more entries in the `balances` array. Each entry must specify
7428
- a `date` and `balance` value.<br><br>
7429
-
7430
- Balance history is monthly. Each entry's `date` must be the first day of
7431
- a month and must be in a past month.<br><br>
7432
-
7433
- `currency` may be provided for any balance entry. If omitted, it defaults
7434
- to the account currency for manual/Plaid accounts, or the user's primary
7435
- currency for crypto/deleted accounts.<br><br>
7436
-
7437
- `symbol` may only be set when `account_type` is `crypto_manual` or
7438
- `crypto_synced`. It is optional for `crypto_manual` accounts and tolerated
7439
- for `deleted` accounts.<br><br>
7440
-
7441
- `crypto_balance` may be provided for `crypto_manual`, `crypto_synced`, and
7442
- `deleted` accounts, and is invalid for `manual` or `plaid` accounts.<br><br>
7443
-
7444
- The response contains only the balance entries that were submitted in this request.
7592
+ description: |-
7593
+ 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>
7594
+ 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>
7595
+ 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>
7596
+ `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>
7597
+ `symbol` may be set for `crypto_manual` (optional) and `deleted` (tolerated) accounts. Do not provide it for `manual` or `plaid` accounts.<br><br>
7598
+ `crypto_balance` may be provided for `crypto_manual` and `deleted` accounts. It is invalid for `manual` or `plaid` accounts.<br><br>
7599
+ The response contains only the `type: historical` balance entries that were submitted in this request.
7445
7600
  operationId: upsertBalanceHistoryForAccount
7446
7601
  parameters:
7447
7602
  - name: account_type
7448
7603
  in: path
7449
7604
  required: true
7450
- description: Source family to update. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
7605
+ description: Account family to update. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
7451
7606
  schema:
7452
7607
  type: string
7453
7608
  enum: [manual, plaid, crypto_manual, deleted]
@@ -7468,21 +7623,21 @@ paths:
7468
7623
  manual account bulk upsert:
7469
7624
  value:
7470
7625
  balances:
7471
- - date: "2026-03-01"
7626
+ - month: "2026-03"
7472
7627
  balance: "41500.0000"
7473
- - date: "2026-04-01"
7628
+ - month: "2026-04"
7474
7629
  balance: "41625.5000"
7475
7630
  crypto manual balance with symbol:
7476
7631
  value:
7477
7632
  balances:
7478
- - date: "2026-03-01"
7633
+ - month: "2026-03"
7479
7634
  balance: "56011.1200"
7480
7635
  symbol: btc
7481
7636
  crypto_balance: "0.852341920145782301"
7482
7637
  deleted account bulk upsert:
7483
7638
  value:
7484
7639
  balances:
7485
- - date: "2026-03-01"
7640
+ - month: "2026-03"
7486
7641
  symbol: btc
7487
7642
  crypto_balance: "0.020000000000000000"
7488
7643
  currency: usd
@@ -7491,55 +7646,59 @@ paths:
7491
7646
  value:
7492
7647
  balances:
7493
7648
  - id: 601
7494
- date: "2026-03-01"
7649
+ month: "2026-03"
7495
7650
  balance: "41500.0000"
7496
7651
  currency: usd
7497
7652
  to_base: 41500
7498
7653
  crypto_balance: null
7499
7654
  responses:
7500
7655
  "200":
7501
- description: Returns the modified balance entries only. Other historical
7502
- entries for the account are omitted from `balances`.
7656
+ description: >-
7657
+ Returns only the `type: historical` entries modified by this request.
7658
+ Other historical entries for the account are omitted from `balances`.
7503
7659
  content:
7504
7660
  application/json:
7505
7661
  schema:
7506
7662
  $ref: "#/components/schemas/balanceHistoryAccountObject"
7507
7663
  examples:
7508
7664
  manual account bulk upsert:
7509
- summary: Two upserted rows returned (not full account history)
7665
+ summary: Two upserted entries returned (not full account history)
7510
7666
  value:
7511
7667
  source:
7512
7668
  type: manual
7513
7669
  manual_account_id: 119807
7514
7670
  balances:
7515
- - id: 601
7516
- date: "2026-03-01"
7671
+ - type: historical
7672
+ id: 601
7673
+ month: "2026-03"
7517
7674
  balance: "41500.0000"
7518
7675
  currency: usd
7519
7676
  to_base: 41500
7520
7677
  crypto_balance: null
7521
- - id: 602
7522
- date: "2026-04-01"
7678
+ - type: historical
7679
+ id: 602
7680
+ month: "2026-04"
7523
7681
  balance: "41625.5000"
7524
7682
  currency: usd
7525
7683
  to_base: 41625.5
7526
7684
  crypto_balance: null
7527
7685
  crypto manual balance with symbol:
7528
- summary: Single upserted row returned
7686
+ summary: Single upserted entry returned
7529
7687
  value:
7530
7688
  source:
7531
7689
  type: crypto_manual
7532
7690
  crypto_manual_id: 22001
7533
7691
  symbol: btc
7534
7692
  balances:
7535
- - id: 603
7536
- date: "2026-03-01"
7693
+ - type: historical
7694
+ id: 603
7695
+ month: "2026-03"
7537
7696
  balance: "56011.1200"
7538
7697
  currency: usd
7539
7698
  to_base: 56011.12
7540
7699
  crypto_balance: "0.852341920145782301"
7541
7700
  deleted account bulk upsert:
7542
- summary: Single upserted row returned
7701
+ summary: Single upserted entry returned
7543
7702
  value:
7544
7703
  source:
7545
7704
  type: deleted
@@ -7552,15 +7711,17 @@ paths:
7552
7711
  mask: "1234"
7553
7712
  symbol: btc
7554
7713
  balances:
7555
- - id: 504
7556
- date: "2026-03-01"
7714
+ - type: historical
7715
+ id: 504
7716
+ month: "2026-03"
7557
7717
  balance: "1255"
7558
7718
  currency: usd
7559
7719
  to_base: 1255
7560
7720
  crypto_balance: "0.020000000000000000"
7561
7721
  "400":
7562
- description: Bad Request. The entire request is rejected if any row in
7563
- `balances` fails validation; no rows are updated.
7722
+ description: >-
7723
+ Bad Request. If any entry in `balances` fails validation, the entire
7724
+ request is rejected and no entries are updated.
7564
7725
  content:
7565
7726
  application/json:
7566
7727
  schema:
@@ -7581,30 +7742,34 @@ paths:
7581
7742
  message: Invalid Request Body
7582
7743
  errors:
7583
7744
  - errMsg: "Invalid property 'foo' in request body."
7584
- invalid date:
7745
+ invalid month format:
7746
+ value:
7747
+ message: Invalid Request Body
7748
+ errors:
7749
+ - errMsg: "Invalid value for property 'balances.0.month'. '2026-06-01' is not a valid month in YYYY-MM format."
7750
+ current month:
7585
7751
  value:
7586
7752
  message: Request Validation Failure
7587
7753
  errors:
7588
- - errMsg: "`date` must be the first day of a month."
7754
+ - errMsg: "`month` must not be the current month."
7589
7755
  request_balances_index: 0
7590
- code: VALIDATION_ERROR
7591
- future date:
7756
+ future month:
7592
7757
  value:
7593
7758
  message: Request Validation Failure
7594
7759
  errors:
7595
- - errMsg: "`date` must be in a past month."
7760
+ - errMsg: "`month` must not be in the future."
7596
7761
  request_balances_index: 1
7597
7762
  crypto balance not allowed:
7598
7763
  value:
7599
7764
  message: Request Validation Failure
7600
7765
  errors:
7601
- - errMsg: "`crypto_balance` may only be set when `account_type` is `crypto_manual`, `crypto_synced`, or `deleted`."
7766
+ - errMsg: "`crypto_balance` may only be set when `account_type` is `crypto_manual` or `deleted`."
7602
7767
  request_balances_index: 0
7603
- invalid row in bulk request:
7768
+ invalid entry in bulk request:
7604
7769
  value:
7605
7770
  message: Request Validation Failure
7606
7771
  errors:
7607
- - errMsg: "`symbol` may only be set when `account_type` is `crypto_manual` or `crypto_synced`."
7772
+ - errMsg: "`symbol` may only be set when `account_type` is `crypto_manual` or `deleted`."
7608
7773
  request_balances_index: 1
7609
7774
  "401":
7610
7775
  $ref: "#/components/responses/unauthorizedToken"
@@ -7626,15 +7791,14 @@ paths:
7626
7791
  tags:
7627
7792
  - balance_history
7628
7793
  summary: Delete all balance history for an account
7629
- description: >-
7630
- Delete all historical balance entries for a single manual, Plaid,
7631
- manual crypto, or deleted account. Crypto synced accounts require an additional `symbol` path parameter.
7794
+ description: |-
7795
+ 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}).
7632
7796
  operationId: deleteBalanceHistoryForAccount
7633
7797
  parameters:
7634
7798
  - name: account_type
7635
7799
  in: path
7636
7800
  required: true
7637
- description: Source family to delete. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
7801
+ description: Account family to delete. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
7638
7802
  schema:
7639
7803
  type: string
7640
7804
  enum: [manual, plaid, crypto_manual, deleted]
@@ -7671,16 +7835,10 @@ paths:
7671
7835
  tags:
7672
7836
  - balance_history
7673
7837
  summary: Get balance history for a synced crypto symbol
7674
- description: >-
7675
- Retrieve historical balance entries for a single synced crypto symbol stream.<br><br>
7676
-
7677
- Use the `crypto_synced` account id together with a `symbol` path parameter
7678
- to select one balance stream within that synced crypto account.<br><br>
7679
-
7680
- When `start_date` and `end_date` are both provided, they must be first-of-month
7681
- dates. `start_date` must not be in the future, while `end_date` may be in the future.
7682
- If one of `start_date` or `end_date` is provided, the other is required. If neither is
7683
- provided, all available history for the symbol stream is returned.
7838
+ description: |-
7839
+ Retrieve monthly balance history for a single synced crypto symbol stream.<br><br>
7840
+ The path selects one balance stream with a synced crypto account id and `symbol`.<br><br>
7841
+ `start_month`, `end_month`, and current-month entries behave as described in [GET /balance_history](#tag/balance-history/GET/balance_history).
7684
7842
  operationId: getBalanceHistoryForCryptoSynced
7685
7843
  parameters:
7686
7844
  - name: account_id
@@ -7698,23 +7856,27 @@ paths:
7698
7856
  type: string
7699
7857
  minLength: 1
7700
7858
  maxLength: 25
7701
- - name: start_date
7859
+ - name: start_month
7702
7860
  in: query
7703
- 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.
7861
+ description: >-
7862
+ Optional. Same format and constraints as `start_month` on
7863
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
7704
7864
  required: false
7705
7865
  schema:
7706
7866
  type: string
7707
- format: date
7708
- - name: end_date
7867
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7868
+ - name: end_month
7709
7869
  in: query
7710
- 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.
7870
+ description: >-
7871
+ Optional. Same format and constraints as `end_month` on
7872
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
7711
7873
  required: false
7712
7874
  schema:
7713
7875
  type: string
7714
- format: date
7876
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7715
7877
  responses:
7716
7878
  "200":
7717
- description: Historical balance entries for the synced crypto symbol stream
7879
+ description: Monthly balance history for the synced crypto symbol stream
7718
7880
  content:
7719
7881
  application/json:
7720
7882
  schema:
@@ -7726,8 +7888,9 @@ paths:
7726
7888
  crypto_synced_id: 33004
7727
7889
  symbol: btc
7728
7890
  balances:
7729
- - id: 401
7730
- date: "2026-02-01"
7891
+ - type: historical
7892
+ id: 401
7893
+ month: "2026-02"
7731
7894
  balance: "6231.2800"
7732
7895
  currency: usd
7733
7896
  to_base: 6231.28
@@ -7739,16 +7902,16 @@ paths:
7739
7902
  schema:
7740
7903
  $ref: "#/components/schemas/errorResponseObject"
7741
7904
  examples:
7742
- missing paired date:
7905
+ missing paired month:
7743
7906
  value:
7744
7907
  message: Request Validation Failure
7745
7908
  errors:
7746
- - errMsg: "`start_date` and `end_date` must either both be provided or both be omitted."
7747
- invalid range:
7909
+ - errMsg: "`start_month` and `end_month` must either both be provided or both be omitted."
7910
+ invalid month format:
7748
7911
  value:
7749
- message: Request Validation Failure
7912
+ message: Invalid Request Parameters
7750
7913
  errors:
7751
- - errMsg: "`start_date` must be before or equal to `end_date`."
7914
+ - errMsg: "Invalid value for parameter: 'start_month'. '2026-06-01' is not a valid month in YYYY-MM format."
7752
7915
  "401":
7753
7916
  $ref: "#/components/responses/unauthorizedToken"
7754
7917
  "404":
@@ -7776,28 +7939,14 @@ paths:
7776
7939
  tags:
7777
7940
  - balance_history
7778
7941
  summary: Upsert balance history for a synced crypto symbol
7779
- description: >-
7780
- Upsert one or more historical balance entries for a single synced crypto
7781
- symbol stream.<br><br>
7782
-
7942
+ description: |-
7943
+ Upsert one or more historical balance entries for a single synced crypto symbol stream.<br><br>
7783
7944
  The path identifies both the synced crypto account and the symbol being updated.<br><br>
7784
-
7785
- Submit one or more entries in the `balances` array. Each entry must specify
7786
- a `date` and `balance` value.<br><br>
7787
-
7788
- Balance history is monthly. Each entry's `date` must be the first day of
7789
- a month and must be in a past month.<br><br>
7790
-
7791
- The request body may include an optional `symbol` on each balance entry. If
7792
- provided, it must match the `symbol` path parameter. Omit `symbol` to use
7793
- the path value.<br><br>
7794
-
7795
- `currency` may be provided for any balance entry. If omitted, it defaults
7796
- to the user's primary currency for synced crypto balances.<br><br>
7797
-
7945
+ 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>
7946
+ 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>
7947
+ `currency` may be provided for any balance entry. If omitted, it defaults to the user's primary currency for synced crypto balances.<br><br>
7798
7948
  `crypto_balance` may be provided for synced crypto balances.<br><br>
7799
-
7800
- The response contains only the balance entries that were submitted in this request.
7949
+ The response contains only the `type: historical` balance entries that were submitted in this request.
7801
7950
  operationId: upsertBalanceHistoryForCryptoSynced
7802
7951
  parameters:
7803
7952
  - name: account_id
@@ -7825,44 +7974,49 @@ paths:
7825
7974
  synced crypto bulk upsert:
7826
7975
  value:
7827
7976
  balances:
7828
- - date: "2026-03-01"
7977
+ - month: "2026-03"
7829
7978
  balance: "6400.0000"
7830
7979
  crypto_balance: "0.100020003000400050"
7831
- - date: "2026-04-01"
7980
+ - month: "2026-04"
7832
7981
  balance: "6500.0000"
7833
7982
  crypto_balance: "0.100020003000400050"
7834
7983
  responses:
7835
7984
  "200":
7836
- description: Returns the modified balance entries only. Other historical
7837
- entries for the symbol stream are omitted from `balances`.
7985
+ description: >-
7986
+ Returns only the `type: historical` entries modified by this request.
7987
+ Other historical entries for the symbol stream are omitted from
7988
+ `balances`.
7838
7989
  content:
7839
7990
  application/json:
7840
7991
  schema:
7841
7992
  $ref: "#/components/schemas/balanceHistoryAccountObject"
7842
7993
  examples:
7843
7994
  synced crypto bulk upsert:
7844
- summary: Two upserted rows returned (not full symbol history)
7995
+ summary: Two upserted entries returned (not full symbol history)
7845
7996
  value:
7846
7997
  source:
7847
7998
  type: crypto_synced
7848
7999
  crypto_synced_id: 33004
7849
8000
  symbol: btc
7850
8001
  balances:
7851
- - id: 604
7852
- date: "2026-03-01"
8002
+ - type: historical
8003
+ id: 604
8004
+ month: "2026-03"
7853
8005
  balance: "6400.0000"
7854
8006
  currency: usd
7855
8007
  to_base: 6400
7856
8008
  crypto_balance: "0.100020003000400050"
7857
- - id: 605
7858
- date: "2026-04-01"
8009
+ - type: historical
8010
+ id: 605
8011
+ month: "2026-04"
7859
8012
  balance: "6500.0000"
7860
8013
  currency: usd
7861
8014
  to_base: 6500
7862
8015
  crypto_balance: "0.100020003000400050"
7863
8016
  "400":
7864
- description: Bad Request. The entire request is rejected if any row in
7865
- `balances` fails validation; no rows are updated.
8017
+ description: >-
8018
+ Bad Request. If any entry in `balances` fails validation, the entire
8019
+ request is rejected and no entries are updated.
7866
8020
  content:
7867
8021
  application/json:
7868
8022
  schema:
@@ -7878,17 +8032,22 @@ paths:
7878
8032
  message: Invalid Request Body
7879
8033
  errors:
7880
8034
  - errMsg: "Invalid value for property 'balances'. Array must contain at least 1 element(s)"
7881
- invalid date:
8035
+ invalid month format:
8036
+ value:
8037
+ message: Invalid Request Body
8038
+ errors:
8039
+ - errMsg: "Invalid value for property 'balances.0.month'. '2026-06-01' is not a valid month in YYYY-MM format."
8040
+ current month:
7882
8041
  value:
7883
8042
  message: Request Validation Failure
7884
8043
  errors:
7885
- - errMsg: "`date` must be the first day of a month."
8044
+ - errMsg: "`month` must not be the current month."
7886
8045
  request_balances_index: 0
7887
- future date:
8046
+ future month:
7888
8047
  value:
7889
8048
  message: Request Validation Failure
7890
8049
  errors:
7891
- - errMsg: "`date` must be in a past month."
8050
+ - errMsg: "`month` must not be in the future."
7892
8051
  request_balances_index: 1
7893
8052
  symbol mismatch:
7894
8053
  value:
@@ -7896,9 +8055,9 @@ paths:
7896
8055
  errors:
7897
8056
  - errMsg: "`symbol` in request body (doge) does not match the path symbol (eth)."
7898
8057
  request_balances_index: 0
7899
- invalid row in bulk request:
8058
+ invalid entry in bulk request:
7900
8059
  value:
7901
- message: Request Validation Failure
8060
+ message: Invalid Request Body
7902
8061
  errors:
7903
8062
  - errMsg: "`balance` must be a valid numeric string or number."
7904
8063
  request_balances_index: 1
@@ -7929,11 +8088,9 @@ paths:
7929
8088
  tags:
7930
8089
  - balance_history
7931
8090
  summary: Delete all balance history for a synced crypto symbol
7932
- description: >-
8091
+ description: |-
7933
8092
  Delete all historical balance entries for a single synced crypto symbol stream.<br><br>
7934
-
7935
- The path identifies both the synced crypto account and the symbol whose
7936
- history should be deleted.
8093
+ The path identifies both the synced crypto account and the symbol whose history should be deleted.
7937
8094
  operationId: deleteBalanceHistoryForCryptoSynced
7938
8095
  parameters:
7939
8096
  - name: account_id
@@ -7975,14 +8132,14 @@ paths:
7975
8132
  tags:
7976
8133
  - balance_history
7977
8134
  summary: Delete a balance history entry
7978
- description: >-
7979
- Delete a single monthly balance history entry by its id.
8135
+ description: |-
8136
+ Delete a single stored (`type: historical`) monthly balance history entry by its id. Ephemeral `current` entries cannot be deleted this way.
7980
8137
  operationId: deleteBalanceHistoryEntry
7981
8138
  parameters:
7982
8139
  - name: id
7983
8140
  in: path
7984
8141
  required: true
7985
- description: Balance history row identifier to delete.
8142
+ description: Historical balance entry identifier to delete.
7986
8143
  schema:
7987
8144
  type: integer
7988
8145
  format: int32
@@ -7996,7 +8153,7 @@ paths:
7996
8153
  schema:
7997
8154
  $ref: "#/components/schemas/errorResponseObject"
7998
8155
  example:
7999
- message: Request Validation Failure
8156
+ message: Invalid Path Parameters
8000
8157
  errors:
8001
8158
  - errMsg: "Invalid value type for path parameter: 'id'. Expected 'number', received 'string'."
8002
8159
  "401":
@@ -8020,12 +8177,9 @@ paths:
8020
8177
  tags:
8021
8178
  - balance_history
8022
8179
  summary: Update details for a deleted account
8023
- description: >-
8180
+ description: |-
8024
8181
  Update archived metadata for a deleted balance history source.<br><br>
8025
-
8026
- Pass the `deleted` source id returned on `source.deleted_account_id`.
8027
- This endpoint updates the stored deleted-source metadata used for all
8028
- historical entries associated with that deleted source.
8182
+ Pass the `deleted_account_id` from a `source.type: deleted` entry. The update applies to all historical entries associated with that deleted source.
8029
8183
  operationId: updateBalanceHistoryDetails
8030
8184
  parameters:
8031
8185
  - name: account_id
@@ -9099,19 +9253,19 @@ paths:
9099
9253
  description: Sets the maximum number of transactions to return. If
9100
9254
  more match the filter criteria, the response will include a
9101
9255
  `has_more` attribute set to `true`. See
9102
- [Pagination](https://lunchmoney.dev/v2/pagination)
9256
+ [Pagination](https://beta.lunchmoney.dev/v2/pagination)
9103
9257
  - name: offset
9104
9258
  in: query
9105
9259
  schema:
9106
9260
  type: integer
9107
9261
  description: Sets the offset for the records returned. This is
9108
9262
  typically set automatically in the header. See
9109
- [Pagination](https://lunchmoney.dev/v2/pagination)
9263
+ [Pagination](https://beta.lunchmoney.dev/v2/pagination)
9110
9264
  responses:
9111
9265
  "200":
9112
9266
  description: Returns an array of transactions. <br><br>The `has_more`
9113
9267
  property is set to `true` if more transactions are available. See
9114
- [Pagination](https://lunchmoney.dev/v2/pagination)
9268
+ [Pagination](https://beta.lunchmoney.dev/v2/pagination)
9115
9269
  content:
9116
9270
  application/json:
9117
9271
  schema:
@@ -11335,9 +11489,8 @@ paths:
11335
11489
  - transactions (files)
11336
11490
  summary: Attach a file to a transaction
11337
11491
  operationId: attachFileToTransaction
11338
- description: >-
11339
- Attaches a file to a transaction. The file must be less than 10MB in size.<br><br>
11340
- The file will be attached to the transaction and can be downloaded from the link returned by a `GET /transactions/attachments/{file_id}` request.
11492
+ description: |-
11493
+ 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.
11341
11494
  parameters:
11342
11495
  - name: transaction_id
11343
11496
  in: path
@@ -11420,8 +11573,8 @@ paths:
11420
11573
  /transactions/attachments/{file_id}:
11421
11574
  get:
11422
11575
  summary: Get a url to download a file attachment
11423
- description: Returns a signed url that can be used to download the file
11424
- attachment.
11576
+ description: |-
11577
+ Returns a signed url that can be used to download the file attachment.
11425
11578
  operationId: getTransactionAttachmentUrl
11426
11579
  tags:
11427
11580
  - transactions (files)
@@ -12316,4 +12469,3 @@ paths:
12316
12469
 
12317
12470
  security:
12318
12471
  - bearerSecurity: []
12319
- - cookieAuth: []