@lunch-money/v2-api-spec 2.11.1-preview.4 → 2.11.1-preview.8

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,25 @@ 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.1** spec.
6
-
7
5
  ### Introduction
8
6
 
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).
7
+ Welcome to the Lunch Money v2 API reference. This is the **v2.11.1** spec.
10
8
 
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.
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).
12
10
 
13
- **Static Mock Server**
11
+
12
+ **Try it from these docs**
14
13
 
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.
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**
20
+
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
+
16
24
 
17
25
  **Client Libraries & SDKs**
18
26
 
@@ -23,7 +31,6 @@ info:
23
31
  The v2 API is not backwards compatible with v1. See the [Migration Guide](https://lunchmoney.dev/v2/migration-guide) for details.
24
32
 
25
33
  **Useful links**
26
- - [Developer Portal](https://lunchmoney.dev/v2/introduction)
27
34
  - [Getting Started Guide](https://lunchmoney.dev/v2/getting-started)
28
35
  - [v2 API Overview](https://lunchmoney.dev/v2/overview)
29
36
  - [Version History](https://lunchmoney.dev/v2/version-history)
@@ -39,17 +46,18 @@ info:
39
46
 
40
47
  servers:
41
48
  - 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
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
46
52
 
47
53
  tags:
48
54
  - name: me
49
55
  description: View details and settings for the current user and account.<p>
50
- Use [/me/account/settings](#tag/me/GET/me/account/settings) and
51
- [/me/user/settings](#tag/me/GET/me/user/settings) for account- and
52
- user-level preferences.
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 budgeting account.
53
61
  - name: categories
54
62
  description: Work with categories
55
63
  externalDocs:
@@ -76,7 +84,11 @@ tags:
76
84
  description: Learn more about crypto assets
77
85
  url: https://support.lunchmoney.app/setup/crypto
78
86
  - 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.
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.
80
92
  - name: recurring_items
81
93
  description: Work with recurring items
82
94
  externalDocs:
@@ -990,16 +1002,19 @@ components:
990
1002
  example: Cold Wallet BTC
991
1003
  display_name:
992
1004
  type: string
1005
+ nullable: true
993
1006
  minLength: 1
994
1007
  maxLength: 45
995
- description: Optional display name for the manual crypto asset. If
996
- 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`.
997
1010
  example: Cold Storage
998
1011
  institution_name:
999
1012
  type: string
1013
+ nullable: true
1000
1014
  minLength: 1
1001
1015
  maxLength: 50
1002
- 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.
1003
1018
  example: Ledger
1004
1019
  balance:
1005
1020
  oneOf:
@@ -1255,15 +1270,19 @@ components:
1255
1270
  example: My Savings Account
1256
1271
  institution_name:
1257
1272
  type: string
1273
+ nullable: true
1258
1274
  example: Bank of the West
1259
- 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.
1260
1277
  minLength: 1
1261
1278
  maxLength: 50
1262
1279
  display_name:
1263
1280
  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.
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 budgeting
1285
+ account.
1267
1286
  example: Savings
1268
1287
  type:
1269
1288
  description: The type of manual account
@@ -1271,8 +1290,10 @@ components:
1271
1290
  - $ref: "#/components/schemas/accountTypeEnum"
1272
1291
  subtype:
1273
1292
  type: string
1274
- description: An optional manual account subtype. Examples include<br>
1275
- - 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.
1276
1297
  minLength: 1
1277
1298
  maxLength: 100
1278
1299
  example: prepaid credit card
@@ -1646,7 +1667,7 @@ components:
1646
1667
  type:
1647
1668
  type: string
1648
1669
  enum: [manual]
1649
- description: Identifies this entry as belonging to a manually-managed account.
1670
+ description: Identifies this entry as belonging to a manual account.
1650
1671
  manual_account_id:
1651
1672
  type: integer
1652
1673
  format: int32
@@ -1675,14 +1696,14 @@ components:
1675
1696
 
1676
1697
  balanceHistorySourceCryptoManual:
1677
1698
  type: object
1678
- description: Source information for a manually-tracked cryptocurrency balance history entry.
1699
+ description: Source information for a manual cryptocurrency balance history entry.
1679
1700
  additionalProperties: false
1680
1701
  x-internal: true
1681
1702
  properties:
1682
1703
  type:
1683
1704
  type: string
1684
1705
  enum: [crypto_manual]
1685
- description: Identifies this entry as belonging to a manually-tracked crypto account.
1706
+ description: Identifies this entry as belonging to a manual crypto account.
1686
1707
  crypto_manual_id:
1687
1708
  type: integer
1688
1709
  format: int32
@@ -1725,10 +1746,11 @@ components:
1725
1746
  type: object
1726
1747
  x-internal: true
1727
1748
  description: >
1728
- 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.
1729
1750
  Historical balances are preserved when a user chooses to keep history on account deletion.
1730
1751
  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`
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)
1732
1754
  to update the archived source metadata.
1733
1755
  additionalProperties: false
1734
1756
  properties:
@@ -1759,11 +1781,11 @@ components:
1759
1781
  subtype:
1760
1782
  type: string
1761
1783
  nullable: true
1762
- description: Archived `subtype`` of the deleted account source
1784
+ description: Archived `subtype` of the deleted account source
1763
1785
  mask:
1764
1786
  type: string
1765
1787
  nullable: true
1766
- description: Archived account `mask` for a deleted plaid account source
1788
+ description: Archived account `mask` for a deleted Plaid account source
1767
1789
  symbol:
1768
1790
  type: string
1769
1791
  nullable: true
@@ -1785,12 +1807,14 @@ components:
1785
1807
  type: object
1786
1808
  title: balance history for an account object
1787
1809
  additionalProperties: false
1788
- description: Historical balance entries grouped under a single account source.
1810
+ description: Monthly balance entries grouped under a single account source.
1789
1811
  properties:
1790
1812
  source:
1791
1813
  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.
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`).
1794
1818
  oneOf:
1795
1819
  - $ref: "#/components/schemas/balanceHistorySourceManual"
1796
1820
  - $ref: "#/components/schemas/balanceHistorySourcePlaid"
@@ -1808,38 +1832,48 @@ components:
1808
1832
  balances:
1809
1833
  type: array
1810
1834
  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.
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.
1814
1840
  items:
1815
- $ref: "#/components/schemas/balanceHistoryObject"
1841
+ $ref: "#/components/schemas/balanceHistoryEntry"
1816
1842
  required:
1817
1843
  - source
1818
1844
  - balances
1819
1845
 
1820
- balanceHistoryObject:
1846
+ historicalBalanceHistoryEntry:
1821
1847
  type: object
1822
- title: balance history entry object
1848
+ title: historical balance history entry
1823
1849
  additionalProperties: false
1824
1850
  x-internal: true
1825
- 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`.
1826
1855
  properties:
1856
+ type:
1857
+ type: string
1858
+ enum: [historical]
1859
+ description: Identifies this entry as a stored snapshot of a past month.
1827
1860
  id:
1828
1861
  type: integer
1829
1862
  format: int32
1830
- description: Unique identifier of this historical balance entry.
1831
- date:
1863
+ description: Unique identifier for this historical balance entry.
1864
+ month:
1832
1865
  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.
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"
1835
1869
  balance:
1836
1870
  type: string
1837
1871
  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.
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.
1839
1873
  currency:
1840
1874
  allOf:
1841
1875
  - $ref: "#/components/schemas/currencyEnum"
1842
- 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.
1843
1877
  to_base:
1844
1878
  type: number
1845
1879
  format: double
@@ -1848,19 +1882,82 @@ components:
1848
1882
  type: string
1849
1883
  nullable: true
1850
1884
  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.
1885
+ description: Crypto quantity for this balance entry, when available. This may be present for crypto or deleted-account entries and is `null` otherwise.
1852
1886
  required:
1887
+ - type
1853
1888
  - id
1854
- - date
1889
+ - month
1890
+ - balance
1891
+ - currency
1892
+ - to_base
1893
+ - crypto_balance
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
1855
1933
  - balance
1856
1934
  - currency
1857
1935
  - to_base
1858
1936
  - crypto_balance
1859
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
+
1860
1954
  balanceHistoryListResponseObject:
1861
1955
  type: object
1862
1956
  additionalProperties: false
1863
1957
  x-internal: true
1958
+ description: >
1959
+ List response for balance history GET endpoints. Entries are grouped by
1960
+ account source under `balance_history`.
1864
1961
  properties:
1865
1962
  balance_history:
1866
1963
  type: array
@@ -1873,31 +1970,39 @@ components:
1873
1970
  type: object
1874
1971
  x-internal: true
1875
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.
1876
1976
  properties:
1877
1977
  id:
1878
1978
  type: integer
1879
1979
  format: int32
1880
1980
  description: System-defined balance history entry id. Ignored if set.
1881
1981
  x-updatable: false
1882
- date:
1982
+ month:
1883
1983
  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.
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"
1886
1989
  balance:
1887
1990
  oneOf:
1888
1991
  - type: number
1889
1992
  format: double
1890
1993
  - type: string
1891
1994
  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.
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.
1893
1996
  symbol:
1894
1997
  type: string
1895
1998
  nullable: true
1896
1999
  minLength: 1
1897
2000
  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.
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.
1901
2006
  x-updatable: true
1902
2007
  crypto_balance:
1903
2008
  type: string
@@ -1913,10 +2018,10 @@ components:
1913
2018
  to_base:
1914
2019
  type: number
1915
2020
  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.
2021
+ description: System-defined historical balance converted to the user's primary currency. Ignored if set. Use `balance` to update the historical balance.
1917
2022
  x-updatable: false
1918
2023
  required:
1919
- - date
2024
+ - month
1920
2025
  - balance
1921
2026
 
1922
2027
  upsertBalanceHistoryRequestObject:
@@ -1927,7 +2032,11 @@ components:
1927
2032
  balances:
1928
2033
  type: array
1929
2034
  minItems: 1
1930
- 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.
1931
2040
  items:
1932
2041
  $ref: "#/components/schemas/balanceHistoryUpdateItemObject"
1933
2042
  required:
@@ -1942,51 +2051,58 @@ components:
1942
2051
  name:
1943
2052
  type: string
1944
2053
  nullable: true
1945
- description: New archived account name for the deleted account source.
2054
+ description: New archived account name for the deleted account source
1946
2055
  institution_name:
1947
2056
  type: string
1948
2057
  nullable: true
1949
- description: New archived institution name for the deleted account source.
2058
+ description: New archived institution name for the deleted account source
1950
2059
  display_name:
1951
2060
  type: string
1952
2061
  nullable: true
1953
- description: New display name for the deleted account source.
2062
+ description: New display name for the deleted account source
1954
2063
  account_type:
1955
2064
  type: string
1956
2065
  nullable: true
1957
- description: New archived account type for the deleted account source.
2066
+ description: New archived account type for the deleted account source
1958
2067
  subtype:
1959
2068
  type: string
1960
2069
  nullable: true
1961
- description: New archived subtype for the deleted account source.
2070
+ description: New archived subtype for the deleted account source
1962
2071
  mask:
1963
2072
  type: string
1964
2073
  nullable: true
1965
- description: New archived account mask for the deleted account source.
2074
+ description: New archived account mask for the deleted account source
1966
2075
 
1967
2076
  updateBalanceHistoryDetailsResponseObject:
1968
2077
  type: object
1969
2078
  x-internal: true
1970
2079
  additionalProperties: false
2080
+ description: Updated archived metadata for a deleted balance history source
1971
2081
  properties:
1972
2082
  name:
1973
2083
  type: string
1974
2084
  nullable: true
2085
+ description: Archived account name for the deleted account source
1975
2086
  institution_name:
1976
2087
  type: string
1977
2088
  nullable: true
2089
+ description: Archived institution name for the deleted account source
1978
2090
  display_name:
1979
2091
  type: string
1980
2092
  nullable: true
2093
+ description: Archived display name for the deleted account source
1981
2094
  account_type:
1982
2095
  type: string
1983
2096
  nullable: true
2097
+ description: Archived account type for the deleted account source
1984
2098
  subtype:
1985
2099
  type: string
1986
2100
  nullable: true
2101
+ description: Archived subtype for the deleted account source
1987
2102
  mask:
1988
2103
  type: string
1989
2104
  nullable: true
2105
+ description: Archived account mask for the deleted account source
1990
2106
  required:
1991
2107
  - name
1992
2108
  - institution_name
@@ -3087,6 +3203,7 @@ components:
3087
3203
  description: |
3088
3204
  The new payee for the transaction.
3089
3205
  minLength: 0
3206
+ x-updatable: true
3090
3207
  original_name:
3091
3208
  type: string
3092
3209
  nullable: true
@@ -3298,9 +3415,10 @@ components:
3298
3415
  category_id:
3299
3416
  type: integer
3300
3417
  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.
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.
3304
3422
  tag_ids:
3305
3423
  type: array
3306
3424
  description: The IDs of any tags to apply to this split child
@@ -3310,7 +3428,10 @@ components:
3310
3428
  format: int32
3311
3429
  notes:
3312
3430
  type: string
3313
- 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.
3314
3435
  required:
3315
3436
  - amount
3316
3437
 
@@ -3679,6 +3800,7 @@ components:
3679
3800
  - budget_rollover_left_to_budget
3680
3801
 
3681
3802
  weekStartsOnEnum:
3803
+ x-internal: true
3682
3804
  type: string
3683
3805
  title: week starts on enum
3684
3806
  enum:
@@ -3687,6 +3809,7 @@ components:
3687
3809
  description: The day on which a calendar week begins.
3688
3810
 
3689
3811
  monthYearFormatEnum:
3812
+ x-internal: true
3690
3813
  type: string
3691
3814
  title: month and year format enum
3692
3815
  description: Format string for displaying month and year values
@@ -3713,6 +3836,7 @@ components:
3713
3836
  - "YYYY/MM"
3714
3837
 
3715
3838
  monthDayYearFormatEnum:
3839
+ x-internal: true
3716
3840
  type: string
3717
3841
  title: month, day and year format enum
3718
3842
  description: Format string for displaying full dates in the
@@ -3770,6 +3894,7 @@ components:
3770
3894
  - "M/DD/YYYY"
3771
3895
 
3772
3896
  monthDayFormatEnum:
3897
+ x-internal: true
3773
3898
  type: string
3774
3899
  title: month and day format enum
3775
3900
  description: Format string for displaying month and day values
@@ -3812,6 +3937,98 @@ components:
3812
3937
  - "DD.M"
3813
3938
  - "DD/M"
3814
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
+
3815
4032
  accountSettingsObject:
3816
4033
  type: object
3817
4034
  title: account settings object
@@ -3835,13 +4052,19 @@ components:
3835
4052
  description: Display name of the budgeting account in the Lunch Money
3836
4053
  app.
3837
4054
  locale:
3838
- type: string
3839
- description: Locale used for formatting dates and numbers in the
3840
- Lunch Money app (for example, `en-US`). When no locale is explicitly
3841
- stored for the account, the effective locale is derived from the
3842
- `default_locale` associated with `primary_currency` in the
3843
- currencies table (for example, `usd` → `en-US`, `cad` → `en-CA`,
3844
- `gbp` → `en-GB`).
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`).
3845
4068
  auto_create_category_rules:
3846
4069
  type: boolean
3847
4070
  default: true
@@ -3852,16 +4075,11 @@ components:
3852
4075
  default: true
3853
4076
  description: If `true`, suggested transaction rules are created
3854
4077
  automatically.
3855
- auto_review_transaction_on_update:
4078
+ include_pending_in_totals:
3856
4079
  type: boolean
3857
4080
  default: true
3858
- description: If `true`, transactions are marked as reviewed when
3859
- updated.
3860
- auto_review_transaction_on_creation:
3861
- type: boolean
3862
- default: true
3863
- description: If `true`, transactions are marked as reviewed when
3864
- created.
4081
+ description: If `true`, pending transactions are included in account
4082
+ totals.
3865
4083
  required:
3866
4084
  - primary_currency
3867
4085
  - supported_currencies
@@ -3869,13 +4087,13 @@ components:
3869
4087
  - locale
3870
4088
  - auto_create_category_rules
3871
4089
  - auto_create_suggested_transaction_rules
3872
- - auto_review_transaction_on_update
3873
- - auto_review_transaction_on_creation
4090
+ - include_pending_in_totals
3874
4091
 
3875
4092
  updateAccountSettingsRequestObject:
3876
4093
  x-internal: true
3877
4094
  type: object
3878
4095
  additionalProperties: false
4096
+ minProperties: 1
3879
4097
  description: Request body for updating account settings. Include at least
3880
4098
  one property to update.
3881
4099
  properties:
@@ -3897,9 +4115,15 @@ components:
3897
4115
  description: If set, updates the display name of the budgeting account.
3898
4116
  x-updatable: true
3899
4117
  locale:
3900
- type: string
3901
- description: If set, updates the locale used for formatting dates and
3902
- numbers in the Lunch Money app.
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).
3903
4127
  x-updatable: true
3904
4128
  auto_create_category_rules:
3905
4129
  type: boolean
@@ -3911,15 +4135,70 @@ components:
3911
4135
  description: If set, updates whether suggested transaction rules are
3912
4136
  created automatically.
3913
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
+ budgeting 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 budgeting account. Must identify a
4166
+ manual account returned by
4167
+ [GET /manual_accounts](#tag/manual_accounts/GET/manual_accounts) for
4168
+ the current budgeting 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 budgeting account. Include at least one property
4181
+ to update.
4182
+ properties:
3914
4183
  auto_review_transaction_on_update:
3915
4184
  type: boolean
3916
4185
  description: If set, updates whether transactions are marked as reviewed
3917
- when updated.
4186
+ when their date, category, payee, amount, account, or notes are
4187
+ changed.
3918
4188
  x-updatable: true
3919
4189
  auto_review_transaction_on_creation:
3920
4190
  type: boolean
3921
- description: If set, updates whether transactions are marked as reviewed
3922
- when created.
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 budgeting
4199
+ account. Must identify a manual account returned by
4200
+ [GET /manual_accounts](#tag/manual_accounts/GET/manual_accounts) for
4201
+ the current budgeting account. Set to `null` to clear the selection.
3923
4202
  x-updatable: true
3924
4203
 
3925
4204
  userSettingsObject:
@@ -3995,6 +4274,7 @@ components:
3995
4274
  x-internal: true
3996
4275
  type: object
3997
4276
  additionalProperties: false
4277
+ minProperties: 1
3998
4278
  description: Request body for updating user settings. Include at least one
3999
4279
  property to update.
4000
4280
  properties:
@@ -4818,22 +5098,10 @@ components:
4818
5098
  securitySchemes:
4819
5099
  bearerSecurity:
4820
5100
  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.
5101
+ description: >-
5102
+ Required for the LIVE server. Optional for MOCK.
4831
5103
  scheme: bearer
4832
5104
  bearerFormat: JWT
4833
- cookieAuth:
4834
- type: apiKey
4835
- in: cookie
4836
- name: _lm_access_token
4837
5105
 
4838
5106
  paths:
4839
5107
  /me:
@@ -4843,11 +5111,14 @@ paths:
4843
5111
  summary: Get current user
4844
5112
  description: |-
4845
5113
  Get details about the user associated with the supplied authorization
4846
- token.<p> For account- and user-level preferences, prefer
4847
- [/me/account/settings](#tag/me/GET/me/account/settings) and
4848
- [/me/user/settings](#tag/me/GET/me/user/settings). Properties such as
4849
- `primary_currency` and `budget_name` remain on this response for
4850
- backwards compatibility.
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 budgeting account.
5120
+ Properties such as `primary_currency` and `budget_name` remain on this
5121
+ response for backwards compatibility.
4851
5122
  operationId: getMe
4852
5123
  parameters: []
4853
5124
  responses:
@@ -4876,8 +5147,9 @@ paths:
4876
5147
  tags:
4877
5148
  - me
4878
5149
  summary: Get account settings
4879
- description: Returns account-level settings for the budgeting
4880
- account associated with the authorized API token.
5150
+ description: >-
5151
+ Returns settings for the current budgeting account. These settings apply
5152
+ regardless of which user is accessing the account.
4881
5153
  operationId: getAccountSettings
4882
5154
  responses:
4883
5155
  "200":
@@ -4896,8 +5168,7 @@ paths:
4896
5168
  locale: en-US
4897
5169
  auto_create_category_rules: true
4898
5170
  auto_create_suggested_transaction_rules: true
4899
- auto_review_transaction_on_update: true
4900
- auto_review_transaction_on_creation: true
5171
+ include_pending_in_totals: true
4901
5172
  "401":
4902
5173
  $ref: "#/components/responses/unauthorizedToken"
4903
5174
  "429":
@@ -4910,11 +5181,10 @@ paths:
4910
5181
  summary: Update account settings
4911
5182
  description: |-
4912
5183
  Updates account-level settings for the budgeting account
4913
- associated with the authorized API token.<p> You may submit the response from a
4914
- `GET /me/account/settings` as the request body; however, only certain
4915
- properties can be updated.<p> It is also possible to provide only the
4916
- properties to be updated in the request body, as long as the request
4917
- includes at least one updatable property.
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.
4918
5188
  operationId: updateAccountSettings
4919
5189
  requestBody:
4920
5190
  required: true
@@ -4929,7 +5199,7 @@ paths:
4929
5199
  Update automation preferences:
4930
5200
  value:
4931
5201
  auto_create_category_rules: false
4932
- auto_review_transaction_on_creation: false
5202
+ include_pending_in_totals: false
4933
5203
  responses:
4934
5204
  "200":
4935
5205
  description: Account settings updated successfully
@@ -4954,8 +5224,10 @@ paths:
4954
5224
  tags:
4955
5225
  - me
4956
5226
  summary: Get user settings
4957
- description: Returns user-level display and formatting preferences for the
4958
- user associated with the authorized API token.
5227
+ description: >-
5228
+ Returns display and formatting preferences for the authorized user.
5229
+ These settings apply across every budgeting account the user owns or
5230
+ collaborates on.
4959
5231
  operationId: getUserSettings
4960
5232
  responses:
4961
5233
  "200":
@@ -4986,11 +5258,10 @@ paths:
4986
5258
  summary: Update user settings
4987
5259
  description: |-
4988
5260
  Updates user-level display and formatting preferences for the user
4989
- associated with the authorized API token.<p> You may submit the response
4990
- from a `GET /me/user/settings` as the request body; however, only
4991
- certain properties can be updated.<p> It is also possible to provide
4992
- only the properties to be updated in the request body, as long as the
4993
- request includes at least one updatable property.<p> Updating
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
4994
5265
  `show_debits_as_negative` affects display in the Lunch Money app only.
4995
5266
  Amount fields in API responses always use positive values for debits and
4996
5267
  negative values for credits.
@@ -5030,6 +5301,88 @@ paths:
5030
5301
  $ref: "#/components/responses/rateLimited"
5031
5302
  "500":
5032
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
+ budgeting account. These settings do not affect other users or the
5312
+ authorized user's settings in other budgeting accounts.
5313
+ operationId: getUserAccountSettings
5314
+ responses:
5315
+ "200":
5316
+ description: Settings for the authorized user in the current budgeting
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
+ budgeting 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"
5033
5386
  /summary:
5034
5387
  get:
5035
5388
  tags:
@@ -6277,12 +6630,9 @@ paths:
6277
6630
  tags:
6278
6631
  - crypto-manual
6279
6632
  summary: Get all supported cryptocurrencies
6280
- description: >
6633
+ description: |-
6281
6634
  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.
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.
6286
6636
  operationId: getAllCryptocurrencies
6287
6637
  responses:
6288
6638
  "200":
@@ -6320,16 +6670,9 @@ paths:
6320
6670
  - crypto-manual
6321
6671
  summary: Add a new supported cryptocurrency
6322
6672
  operationId: createCryptocurrency
6323
- description: >-
6673
+ description: |-
6324
6674
  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.
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.
6333
6676
  requestBody:
6334
6677
  required: true
6335
6678
  content:
@@ -6408,8 +6751,8 @@ paths:
6408
6751
  tags:
6409
6752
  - crypto-manual
6410
6753
  summary: Get all manual crypto balances
6411
- description: Retrieve all manually managed crypto balances associated with
6412
- the user's account.
6754
+ description: |-
6755
+ Retrieve all manually managed crypto balances associated with the user's account.
6413
6756
  operationId: getAllCryptoManual
6414
6757
  responses:
6415
6758
  "200":
@@ -6443,11 +6786,9 @@ paths:
6443
6786
  tags:
6444
6787
  - crypto-manual
6445
6788
  summary: Create a manual crypto balance
6446
- description: >-
6789
+ description: |-
6447
6790
  Create a manually managed crypto asset.<br><br>
6448
-
6449
- If `display_name` is `null`, clients may derive one from
6450
- `institution_name` + `name`.
6791
+ If `display_name` is `null`, clients may derive one from `institution_name` + `name`.
6451
6792
  operationId: createCryptoManual
6452
6793
  requestBody:
6453
6794
  required: true
@@ -6532,7 +6873,8 @@ paths:
6532
6873
  tags:
6533
6874
  - crypto-manual
6534
6875
  summary: Get a single manual crypto balance
6535
- description: Retrieve a single manually managed crypto balance by ID.
6876
+ description: |-
6877
+ Retrieve a single manually managed crypto balance by ID.
6536
6878
  operationId: getCryptoManualById
6537
6879
  parameters:
6538
6880
  - name: id
@@ -6600,11 +6942,9 @@ paths:
6600
6942
  tags:
6601
6943
  - crypto-manual
6602
6944
  summary: Update a manual crypto balance
6603
- description: >-
6945
+ description: |-
6604
6946
  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.
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.
6608
6948
  operationId: updateCryptoManual
6609
6949
  parameters:
6610
6950
  - name: id
@@ -6701,10 +7041,8 @@ paths:
6701
7041
  tags:
6702
7042
  - crypto-manual
6703
7043
  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`.
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`.
6708
7046
  operationId: deleteCryptoManual
6709
7047
  parameters:
6710
7048
  - name: id
@@ -6769,8 +7107,8 @@ paths:
6769
7107
  tags:
6770
7108
  - crypto-synced
6771
7109
  summary: Get all synced crypto accounts
6772
- description: Retrieves all synced crypto accounts
6773
- associated with the user's account.
7110
+ description: |-
7111
+ Retrieves all synced crypto accounts associated with the user's account.
6774
7112
  operationId: getAllCryptoSynced
6775
7113
  responses:
6776
7114
  "200":
@@ -6832,8 +7170,8 @@ paths:
6832
7170
  tags:
6833
7171
  - crypto-synced
6834
7172
  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.
7173
+ description: |-
7174
+ Retrieves the synced crypto account and all nested balances for the specified synced crypto account ID.
6837
7175
  operationId: getCryptoSyncedById
6838
7176
  parameters:
6839
7177
  - name: id
@@ -6913,8 +7251,8 @@ paths:
6913
7251
  tags:
6914
7252
  - crypto-synced
6915
7253
  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.
7254
+ description: |-
7255
+ Retrieves a single balance from the specified synced crypto account using the crypto symbol.
6918
7256
  operationId: getCryptoSyncedBalanceBySymbol
6919
7257
  parameters:
6920
7258
  - name: id
@@ -6993,8 +7331,8 @@ paths:
6993
7331
  tags:
6994
7332
  - crypto-synced
6995
7333
  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.
7334
+ description: |-
7335
+ Trigger a balance refresh for the specified synced crypto account. Returns the refreshed synced crypto account.
6998
7336
  operationId: refreshCryptoSynced
6999
7337
  parameters:
7000
7338
  - name: id
@@ -7063,51 +7401,55 @@ paths:
7063
7401
  tags:
7064
7402
  - balance_history
7065
7403
  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.
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})
7084
7416
  operationId: getBalanceHistory
7085
7417
  parameters:
7086
- - name: start_date
7418
+ - name: start_month
7087
7419
  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.
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.
7089
7425
  required: false
7090
7426
  schema:
7091
7427
  type: string
7092
- format: date
7428
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7093
7429
  examples:
7094
7430
  range start:
7095
- summary: Start date
7096
- value: "2026-01-01"
7097
- - name: end_date
7431
+ summary: Start month
7432
+ value: "2026-01"
7433
+ - name: end_month
7098
7434
  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`.
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`.
7100
7442
  required: false
7101
7443
  schema:
7102
7444
  type: string
7103
- format: date
7445
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7104
7446
  examples:
7105
7447
  range end:
7106
- summary: End date
7107
- value: "2026-03-01"
7448
+ summary: End month
7449
+ value: "2026-03"
7108
7450
  responses:
7109
7451
  "200":
7110
- description: Historical balance entries for the requested date range
7452
+ description: Monthly balance history for the requested month range
7111
7453
  content:
7112
7454
  application/json:
7113
7455
  schema:
@@ -7120,14 +7462,16 @@ paths:
7120
7462
  type: manual
7121
7463
  manual_account_id: 119807
7122
7464
  balances:
7123
- - id: 101
7124
- date: "2026-01-01"
7465
+ - type: historical
7466
+ id: 101
7467
+ month: "2026-01"
7125
7468
  balance: "41000.0000"
7126
7469
  currency: usd
7127
7470
  to_base: 41000
7128
7471
  crypto_balance: null
7129
- - id: 102
7130
- date: "2026-02-01"
7472
+ - type: historical
7473
+ id: 102
7474
+ month: "2026-02"
7131
7475
  balance: "41211.8000"
7132
7476
  currency: usd
7133
7477
  to_base: 41211.8
@@ -7136,8 +7480,9 @@ paths:
7136
7480
  type: plaid
7137
7481
  plaid_account_id: 119808
7138
7482
  balances:
7139
- - id: 103
7140
- date: "2026-01-01"
7483
+ - type: historical
7484
+ id: 103
7485
+ month: "2026-01"
7141
7486
  balance: "5498.2800"
7142
7487
  currency: usd
7143
7488
  to_base: 5498.28
@@ -7147,8 +7492,9 @@ paths:
7147
7492
  crypto_manual_id: 22001
7148
7493
  symbol: btc
7149
7494
  balances:
7150
- - id: 104
7151
- date: "2026-01-01"
7495
+ - type: historical
7496
+ id: 104
7497
+ month: "2026-01"
7152
7498
  balance: "53124.7200"
7153
7499
  currency: usd
7154
7500
  to_base: 53124.72
@@ -7158,8 +7504,9 @@ paths:
7158
7504
  crypto_synced_id: 33004
7159
7505
  symbol: btc
7160
7506
  balances:
7161
- - id: 105
7162
- date: "2026-01-01"
7507
+ - type: historical
7508
+ id: 105
7509
+ month: "2026-01"
7163
7510
  balance: "6231.2800"
7164
7511
  currency: usd
7165
7512
  to_base: 6231.28
@@ -7175,12 +7522,34 @@ paths:
7175
7522
  mask: "1234"
7176
7523
  symbol: null
7177
7524
  balances:
7178
- - id: 106
7179
- date: "2026-01-01"
7525
+ - type: historical
7526
+ id: 106
7527
+ month: "2026-01"
7180
7528
  balance: "1250.0000"
7181
7529
  currency: usd
7182
7530
  to_base: 1250
7183
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
7184
7553
  manual account history:
7185
7554
  value:
7186
7555
  balance_history:
@@ -7188,14 +7557,16 @@ paths:
7188
7557
  type: manual
7189
7558
  manual_account_id: 119807
7190
7559
  balances:
7191
- - id: 201
7192
- date: "2026-01-01"
7560
+ - type: historical
7561
+ id: 201
7562
+ month: "2026-01"
7193
7563
  balance: "41000.0000"
7194
7564
  currency: usd
7195
7565
  to_base: 41000
7196
7566
  crypto_balance: null
7197
- - id: 202
7198
- date: "2026-02-01"
7567
+ - type: historical
7568
+ id: 202
7569
+ month: "2026-02"
7199
7570
  balance: "41211.8000"
7200
7571
  currency: usd
7201
7572
  to_base: 41211.8
@@ -7207,8 +7578,9 @@ paths:
7207
7578
  type: plaid
7208
7579
  plaid_account_id: 119808
7209
7580
  balances:
7210
- - id: 301
7211
- date: "2026-02-01"
7581
+ - type: historical
7582
+ id: 301
7583
+ month: "2026-02"
7212
7584
  balance: "5498.2800"
7213
7585
  currency: usd
7214
7586
  to_base: 5498.28
@@ -7221,8 +7593,9 @@ paths:
7221
7593
  crypto_synced_id: 33004
7222
7594
  symbol: btc
7223
7595
  balances:
7224
- - id: 401
7225
- date: "2026-02-01"
7596
+ - type: historical
7597
+ id: 401
7598
+ month: "2026-02"
7226
7599
  balance: "6231.2800"
7227
7600
  currency: usd
7228
7601
  to_base: 6231.28
@@ -7241,8 +7614,9 @@ paths:
7241
7614
  mask: "1234"
7242
7615
  symbol: null
7243
7616
  balances:
7244
- - id: 501
7245
- date: "2026-01-01"
7617
+ - type: historical
7618
+ id: 501
7619
+ month: "2026-01"
7246
7620
  balance: "1250.0000"
7247
7621
  currency: usd
7248
7622
  to_base: 1250
@@ -7254,26 +7628,31 @@ paths:
7254
7628
  schema:
7255
7629
  $ref: "#/components/schemas/errorResponseObject"
7256
7630
  examples:
7257
- missing paired date:
7631
+ missing paired month:
7258
7632
  value:
7259
7633
  message: Request Validation Failure
7260
7634
  errors:
7261
- - 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."
7262
7636
  invalid range:
7263
7637
  value:
7264
7638
  message: Request Validation Failure
7265
7639
  errors:
7266
- - errMsg: "`start_date` must be before or equal to `end_date`."
7267
- 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:
7268
7647
  value:
7269
7648
  message: Request Validation Failure
7270
7649
  errors:
7271
- - errMsg: "`start_date` and `end_date` must both be the first day of a month."
7272
- future start date:
7650
+ - errMsg: "`start_month` must not be in the future."
7651
+ future end month:
7273
7652
  value:
7274
7653
  message: Request Validation Failure
7275
7654
  errors:
7276
- - errMsg: "`start_date` must not be in the future."
7655
+ - errMsg: "`end_month` must not be in the future."
7277
7656
  "401":
7278
7657
  $ref: "#/components/responses/unauthorizedToken"
7279
7658
  "429":
@@ -7285,23 +7664,16 @@ paths:
7285
7664
  tags:
7286
7665
  - balance_history
7287
7666
  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.
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).
7299
7671
  operationId: getBalanceHistoryForAccount
7300
7672
  parameters:
7301
7673
  - name: account_type
7302
7674
  in: path
7303
7675
  required: true
7304
- 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`.
7305
7677
  schema:
7306
7678
  type: string
7307
7679
  enum: [manual, plaid, crypto_manual, deleted]
@@ -7312,23 +7684,27 @@ paths:
7312
7684
  schema:
7313
7685
  type: integer
7314
7686
  format: int32
7315
- - name: start_date
7687
+ - name: start_month
7316
7688
  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.
7689
+ description: >-
7690
+ Optional. Same format and constraints as `start_month` on
7691
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
7318
7692
  required: false
7319
7693
  schema:
7320
7694
  type: string
7321
- format: date
7322
- - name: end_date
7695
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7696
+ - name: end_month
7323
7697
  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.
7698
+ description: >-
7699
+ Optional. Same format and constraints as `end_month` on
7700
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
7325
7701
  required: false
7326
7702
  schema:
7327
7703
  type: string
7328
- format: date
7704
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7329
7705
  responses:
7330
7706
  "200":
7331
- description: Historical balance entries for the requested source
7707
+ description: Monthly balance history for the requested source
7332
7708
  content:
7333
7709
  application/json:
7334
7710
  schema:
@@ -7341,14 +7717,16 @@ paths:
7341
7717
  type: manual
7342
7718
  manual_account_id: 119807
7343
7719
  balances:
7344
- - id: 201
7345
- date: "2026-01-01"
7720
+ - type: historical
7721
+ id: 201
7722
+ month: "2026-01"
7346
7723
  balance: "41000.0000"
7347
7724
  currency: usd
7348
7725
  to_base: 41000
7349
7726
  crypto_balance: null
7350
- - id: 202
7351
- date: "2026-02-01"
7727
+ - type: historical
7728
+ id: 202
7729
+ month: "2026-02"
7352
7730
  balance: "41211.8000"
7353
7731
  currency: usd
7354
7732
  to_base: 41211.8
@@ -7367,8 +7745,9 @@ paths:
7367
7745
  mask: "1234"
7368
7746
  symbol: null
7369
7747
  balances:
7370
- - id: 501
7371
- date: "2026-01-01"
7748
+ - type: historical
7749
+ id: 501
7750
+ month: "2026-01"
7372
7751
  balance: "1250.0000"
7373
7752
  currency: usd
7374
7753
  to_base: 1250
@@ -7380,16 +7759,16 @@ paths:
7380
7759
  schema:
7381
7760
  $ref: "#/components/schemas/errorResponseObject"
7382
7761
  examples:
7383
- missing paired date:
7762
+ missing paired month:
7384
7763
  value:
7385
7764
  message: Request Validation Failure
7386
7765
  errors:
7387
- - errMsg: "`start_date` and `end_date` must either both be provided or both be omitted."
7388
- invalid range:
7766
+ - errMsg: "`start_month` and `end_month` must either both be provided or both be omitted."
7767
+ invalid month format:
7389
7768
  value:
7390
- message: Request Validation Failure
7769
+ message: Invalid Request Parameters
7391
7770
  errors:
7392
- - 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."
7393
7772
  "401":
7394
7773
  $ref: "#/components/responses/unauthorizedToken"
7395
7774
  "404":
@@ -7417,37 +7796,20 @@ paths:
7417
7796
  tags:
7418
7797
  - balance_history
7419
7798
  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.
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.
7445
7807
  operationId: upsertBalanceHistoryForAccount
7446
7808
  parameters:
7447
7809
  - name: account_type
7448
7810
  in: path
7449
7811
  required: true
7450
- 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`.
7451
7813
  schema:
7452
7814
  type: string
7453
7815
  enum: [manual, plaid, crypto_manual, deleted]
@@ -7468,21 +7830,21 @@ paths:
7468
7830
  manual account bulk upsert:
7469
7831
  value:
7470
7832
  balances:
7471
- - date: "2026-03-01"
7833
+ - month: "2026-03"
7472
7834
  balance: "41500.0000"
7473
- - date: "2026-04-01"
7835
+ - month: "2026-04"
7474
7836
  balance: "41625.5000"
7475
7837
  crypto manual balance with symbol:
7476
7838
  value:
7477
7839
  balances:
7478
- - date: "2026-03-01"
7840
+ - month: "2026-03"
7479
7841
  balance: "56011.1200"
7480
7842
  symbol: btc
7481
7843
  crypto_balance: "0.852341920145782301"
7482
7844
  deleted account bulk upsert:
7483
7845
  value:
7484
7846
  balances:
7485
- - date: "2026-03-01"
7847
+ - month: "2026-03"
7486
7848
  symbol: btc
7487
7849
  crypto_balance: "0.020000000000000000"
7488
7850
  currency: usd
@@ -7491,55 +7853,59 @@ paths:
7491
7853
  value:
7492
7854
  balances:
7493
7855
  - id: 601
7494
- date: "2026-03-01"
7856
+ month: "2026-03"
7495
7857
  balance: "41500.0000"
7496
7858
  currency: usd
7497
7859
  to_base: 41500
7498
7860
  crypto_balance: null
7499
7861
  responses:
7500
7862
  "200":
7501
- description: Returns the modified balance entries only. Other historical
7502
- 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`.
7503
7866
  content:
7504
7867
  application/json:
7505
7868
  schema:
7506
7869
  $ref: "#/components/schemas/balanceHistoryAccountObject"
7507
7870
  examples:
7508
7871
  manual account bulk upsert:
7509
- summary: Two upserted rows returned (not full account history)
7872
+ summary: Two upserted entries returned (not full account history)
7510
7873
  value:
7511
7874
  source:
7512
7875
  type: manual
7513
7876
  manual_account_id: 119807
7514
7877
  balances:
7515
- - id: 601
7516
- date: "2026-03-01"
7878
+ - type: historical
7879
+ id: 601
7880
+ month: "2026-03"
7517
7881
  balance: "41500.0000"
7518
7882
  currency: usd
7519
7883
  to_base: 41500
7520
7884
  crypto_balance: null
7521
- - id: 602
7522
- date: "2026-04-01"
7885
+ - type: historical
7886
+ id: 602
7887
+ month: "2026-04"
7523
7888
  balance: "41625.5000"
7524
7889
  currency: usd
7525
7890
  to_base: 41625.5
7526
7891
  crypto_balance: null
7527
7892
  crypto manual balance with symbol:
7528
- summary: Single upserted row returned
7893
+ summary: Single upserted entry returned
7529
7894
  value:
7530
7895
  source:
7531
7896
  type: crypto_manual
7532
7897
  crypto_manual_id: 22001
7533
7898
  symbol: btc
7534
7899
  balances:
7535
- - id: 603
7536
- date: "2026-03-01"
7900
+ - type: historical
7901
+ id: 603
7902
+ month: "2026-03"
7537
7903
  balance: "56011.1200"
7538
7904
  currency: usd
7539
7905
  to_base: 56011.12
7540
7906
  crypto_balance: "0.852341920145782301"
7541
7907
  deleted account bulk upsert:
7542
- summary: Single upserted row returned
7908
+ summary: Single upserted entry returned
7543
7909
  value:
7544
7910
  source:
7545
7911
  type: deleted
@@ -7552,15 +7918,17 @@ paths:
7552
7918
  mask: "1234"
7553
7919
  symbol: btc
7554
7920
  balances:
7555
- - id: 504
7556
- date: "2026-03-01"
7921
+ - type: historical
7922
+ id: 504
7923
+ month: "2026-03"
7557
7924
  balance: "1255"
7558
7925
  currency: usd
7559
7926
  to_base: 1255
7560
7927
  crypto_balance: "0.020000000000000000"
7561
7928
  "400":
7562
- description: Bad Request. The entire request is rejected if any row in
7563
- `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.
7564
7932
  content:
7565
7933
  application/json:
7566
7934
  schema:
@@ -7581,30 +7949,34 @@ paths:
7581
7949
  message: Invalid Request Body
7582
7950
  errors:
7583
7951
  - errMsg: "Invalid property 'foo' in request body."
7584
- 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:
7585
7958
  value:
7586
7959
  message: Request Validation Failure
7587
7960
  errors:
7588
- - errMsg: "`date` must be the first day of a month."
7961
+ - errMsg: "`month` must not be the current month."
7589
7962
  request_balances_index: 0
7590
- code: VALIDATION_ERROR
7591
- future date:
7963
+ future month:
7592
7964
  value:
7593
7965
  message: Request Validation Failure
7594
7966
  errors:
7595
- - errMsg: "`date` must be in a past month."
7967
+ - errMsg: "`month` must not be in the future."
7596
7968
  request_balances_index: 1
7597
7969
  crypto balance not allowed:
7598
7970
  value:
7599
7971
  message: Request Validation Failure
7600
7972
  errors:
7601
- - 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`."
7602
7974
  request_balances_index: 0
7603
- invalid row in bulk request:
7975
+ invalid entry in bulk request:
7604
7976
  value:
7605
7977
  message: Request Validation Failure
7606
7978
  errors:
7607
- - 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`."
7608
7980
  request_balances_index: 1
7609
7981
  "401":
7610
7982
  $ref: "#/components/responses/unauthorizedToken"
@@ -7626,15 +7998,14 @@ paths:
7626
7998
  tags:
7627
7999
  - balance_history
7628
8000
  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.
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}).
7632
8003
  operationId: deleteBalanceHistoryForAccount
7633
8004
  parameters:
7634
8005
  - name: account_type
7635
8006
  in: path
7636
8007
  required: true
7637
- 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`.
7638
8009
  schema:
7639
8010
  type: string
7640
8011
  enum: [manual, plaid, crypto_manual, deleted]
@@ -7671,16 +8042,10 @@ paths:
7671
8042
  tags:
7672
8043
  - balance_history
7673
8044
  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.
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).
7684
8049
  operationId: getBalanceHistoryForCryptoSynced
7685
8050
  parameters:
7686
8051
  - name: account_id
@@ -7698,23 +8063,27 @@ paths:
7698
8063
  type: string
7699
8064
  minLength: 1
7700
8065
  maxLength: 25
7701
- - name: start_date
8066
+ - name: start_month
7702
8067
  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.
8068
+ description: >-
8069
+ Optional. Same format and constraints as `start_month` on
8070
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
7704
8071
  required: false
7705
8072
  schema:
7706
8073
  type: string
7707
- format: date
7708
- - name: end_date
8074
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
8075
+ - name: end_month
7709
8076
  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.
8077
+ description: >-
8078
+ Optional. Same format and constraints as `end_month` on
8079
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
7711
8080
  required: false
7712
8081
  schema:
7713
8082
  type: string
7714
- format: date
8083
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7715
8084
  responses:
7716
8085
  "200":
7717
- description: Historical balance entries for the synced crypto symbol stream
8086
+ description: Monthly balance history for the synced crypto symbol stream
7718
8087
  content:
7719
8088
  application/json:
7720
8089
  schema:
@@ -7726,8 +8095,9 @@ paths:
7726
8095
  crypto_synced_id: 33004
7727
8096
  symbol: btc
7728
8097
  balances:
7729
- - id: 401
7730
- date: "2026-02-01"
8098
+ - type: historical
8099
+ id: 401
8100
+ month: "2026-02"
7731
8101
  balance: "6231.2800"
7732
8102
  currency: usd
7733
8103
  to_base: 6231.28
@@ -7739,16 +8109,16 @@ paths:
7739
8109
  schema:
7740
8110
  $ref: "#/components/schemas/errorResponseObject"
7741
8111
  examples:
7742
- missing paired date:
8112
+ missing paired month:
7743
8113
  value:
7744
8114
  message: Request Validation Failure
7745
8115
  errors:
7746
- - errMsg: "`start_date` and `end_date` must either both be provided or both be omitted."
7747
- invalid range:
8116
+ - errMsg: "`start_month` and `end_month` must either both be provided or both be omitted."
8117
+ invalid month format:
7748
8118
  value:
7749
- message: Request Validation Failure
8119
+ message: Invalid Request Parameters
7750
8120
  errors:
7751
- - 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."
7752
8122
  "401":
7753
8123
  $ref: "#/components/responses/unauthorizedToken"
7754
8124
  "404":
@@ -7776,28 +8146,14 @@ paths:
7776
8146
  tags:
7777
8147
  - balance_history
7778
8148
  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
-
8149
+ description: |-
8150
+ Upsert one or more historical balance entries for a single synced crypto symbol stream.<br><br>
7783
8151
  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
-
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>
7798
8155
  `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.
8156
+ The response contains only the `type: historical` balance entries that were submitted in this request.
7801
8157
  operationId: upsertBalanceHistoryForCryptoSynced
7802
8158
  parameters:
7803
8159
  - name: account_id
@@ -7825,44 +8181,49 @@ paths:
7825
8181
  synced crypto bulk upsert:
7826
8182
  value:
7827
8183
  balances:
7828
- - date: "2026-03-01"
8184
+ - month: "2026-03"
7829
8185
  balance: "6400.0000"
7830
8186
  crypto_balance: "0.100020003000400050"
7831
- - date: "2026-04-01"
8187
+ - month: "2026-04"
7832
8188
  balance: "6500.0000"
7833
8189
  crypto_balance: "0.100020003000400050"
7834
8190
  responses:
7835
8191
  "200":
7836
- description: Returns the modified balance entries only. Other historical
7837
- 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`.
7838
8196
  content:
7839
8197
  application/json:
7840
8198
  schema:
7841
8199
  $ref: "#/components/schemas/balanceHistoryAccountObject"
7842
8200
  examples:
7843
8201
  synced crypto bulk upsert:
7844
- summary: Two upserted rows returned (not full symbol history)
8202
+ summary: Two upserted entries returned (not full symbol history)
7845
8203
  value:
7846
8204
  source:
7847
8205
  type: crypto_synced
7848
8206
  crypto_synced_id: 33004
7849
8207
  symbol: btc
7850
8208
  balances:
7851
- - id: 604
7852
- date: "2026-03-01"
8209
+ - type: historical
8210
+ id: 604
8211
+ month: "2026-03"
7853
8212
  balance: "6400.0000"
7854
8213
  currency: usd
7855
8214
  to_base: 6400
7856
8215
  crypto_balance: "0.100020003000400050"
7857
- - id: 605
7858
- date: "2026-04-01"
8216
+ - type: historical
8217
+ id: 605
8218
+ month: "2026-04"
7859
8219
  balance: "6500.0000"
7860
8220
  currency: usd
7861
8221
  to_base: 6500
7862
8222
  crypto_balance: "0.100020003000400050"
7863
8223
  "400":
7864
- description: Bad Request. The entire request is rejected if any row in
7865
- `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.
7866
8227
  content:
7867
8228
  application/json:
7868
8229
  schema:
@@ -7878,17 +8239,22 @@ paths:
7878
8239
  message: Invalid Request Body
7879
8240
  errors:
7880
8241
  - errMsg: "Invalid value for property 'balances'. Array must contain at least 1 element(s)"
7881
- 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:
7882
8248
  value:
7883
8249
  message: Request Validation Failure
7884
8250
  errors:
7885
- - errMsg: "`date` must be the first day of a month."
8251
+ - errMsg: "`month` must not be the current month."
7886
8252
  request_balances_index: 0
7887
- future date:
8253
+ future month:
7888
8254
  value:
7889
8255
  message: Request Validation Failure
7890
8256
  errors:
7891
- - errMsg: "`date` must be in a past month."
8257
+ - errMsg: "`month` must not be in the future."
7892
8258
  request_balances_index: 1
7893
8259
  symbol mismatch:
7894
8260
  value:
@@ -7896,9 +8262,9 @@ paths:
7896
8262
  errors:
7897
8263
  - errMsg: "`symbol` in request body (doge) does not match the path symbol (eth)."
7898
8264
  request_balances_index: 0
7899
- invalid row in bulk request:
8265
+ invalid entry in bulk request:
7900
8266
  value:
7901
- message: Request Validation Failure
8267
+ message: Invalid Request Body
7902
8268
  errors:
7903
8269
  - errMsg: "`balance` must be a valid numeric string or number."
7904
8270
  request_balances_index: 1
@@ -7929,11 +8295,9 @@ paths:
7929
8295
  tags:
7930
8296
  - balance_history
7931
8297
  summary: Delete all balance history for a synced crypto symbol
7932
- description: >-
8298
+ description: |-
7933
8299
  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.
8300
+ The path identifies both the synced crypto account and the symbol whose history should be deleted.
7937
8301
  operationId: deleteBalanceHistoryForCryptoSynced
7938
8302
  parameters:
7939
8303
  - name: account_id
@@ -7975,14 +8339,14 @@ paths:
7975
8339
  tags:
7976
8340
  - balance_history
7977
8341
  summary: Delete a balance history entry
7978
- description: >-
7979
- 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.
7980
8344
  operationId: deleteBalanceHistoryEntry
7981
8345
  parameters:
7982
8346
  - name: id
7983
8347
  in: path
7984
8348
  required: true
7985
- description: Balance history row identifier to delete.
8349
+ description: Historical balance entry identifier to delete.
7986
8350
  schema:
7987
8351
  type: integer
7988
8352
  format: int32
@@ -7996,7 +8360,7 @@ paths:
7996
8360
  schema:
7997
8361
  $ref: "#/components/schemas/errorResponseObject"
7998
8362
  example:
7999
- message: Request Validation Failure
8363
+ message: Invalid Path Parameters
8000
8364
  errors:
8001
8365
  - errMsg: "Invalid value type for path parameter: 'id'. Expected 'number', received 'string'."
8002
8366
  "401":
@@ -8020,12 +8384,9 @@ paths:
8020
8384
  tags:
8021
8385
  - balance_history
8022
8386
  summary: Update details for a deleted account
8023
- description: >-
8387
+ description: |-
8024
8388
  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.
8389
+ Pass the `deleted_account_id` from a `source.type: deleted` entry. The update applies to all historical entries associated with that deleted source.
8029
8390
  operationId: updateBalanceHistoryDetails
8030
8391
  parameters:
8031
8392
  - name: account_id
@@ -11335,9 +11696,8 @@ paths:
11335
11696
  - transactions (files)
11336
11697
  summary: Attach a file to a transaction
11337
11698
  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.
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.
11341
11701
  parameters:
11342
11702
  - name: transaction_id
11343
11703
  in: path
@@ -11420,8 +11780,8 @@ paths:
11420
11780
  /transactions/attachments/{file_id}:
11421
11781
  get:
11422
11782
  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.
11783
+ description: |-
11784
+ Returns a signed url that can be used to download the file attachment.
11425
11785
  operationId: getTransactionAttachmentUrl
11426
11786
  tags:
11427
11787
  - transactions (files)
@@ -12316,4 +12676,3 @@ paths:
12316
12676
 
12317
12677
  security:
12318
12678
  - bearerSecurity: []
12319
- - cookieAuth: []