@lunch-money/v2-api-spec 2.10.0-preview.8 → 2.11.0-preview.10

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,52 +2,46 @@ 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.
5
+ Welcome to the Lunch Money v2 API reference. This is the **v2.11.0** spec.
6
6
 
7
- A working version of this API is now available through these docs, or directly at:
7
+ ### Introduction
8
8
 
9
- `https://api.lunchmoney.dev/v2`
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).
10
10
 
11
- <span class="red-text"><strong>This is in alpha launch of a major API update. It is still subject to change during this alpha review
12
- period and bugs may still exist. We strongly encourage users to use the mock service or create a test budget with sample data as the first step to interacting with the v2 API.</strong></span>
13
- See the [Getting Started Guide](https://alpha.lunchmoney.dev/v2/getting-started) for more information on using a test budget.<p>
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.
14
12
 
15
- If you are new to the v2 API, you may wish to review the [v2 API Overview of Changes](https://alpha.lunchmoney.dev/v2/changelog).
13
+ **Static Mock Server**
16
14
 
17
- ### Static Mock Server
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.
18
16
 
19
- You may also use these docs to explore the API using a static mock server endpoint.<p>
20
- This will allow you to become familiar with the API without having to create an access token, and eliminates the possibility of changing real data. <p>
21
- To access this endpoint, select the second endpoint in the "Server" dropdown to the right. When selected, you should see "Static Mock v2 Lunch Money API Server".<br>
22
- When using this server, set your Bearer token to any string with 11 or more characters.
17
+ **Client Libraries & SDKs**
23
18
 
24
- ### Migrating from V1
19
+ An official TypeScript SDK is available on [NPM](https://www.npmjs.com/package/@lunch-money/v2-api-spec) and [GitHub](https://github.com/lunch-money/lunch-money-js-v2). For Python or other languages, see [lunchmoney-clients](https://github.com/juftin/lunchmoney-clients) or generate a client from [this OpenAPI spec](/v2/openapi).
25
20
 
26
- The v2 API is NOT backwards compatible with the v1 API. We encourage developers to review the [Migration Guide](https://alpha.lunchmoney.dev/v2/migration-guide) to understand the changes and plan their migration.
21
+ **Migrating from v1**
27
22
 
28
- ### Acknowledgments
23
+ The v2 API is not backwards compatible with v1. See the [Migration Guide](https://lunchmoney.dev/v2/migration-guide) for details.
29
24
 
30
- If you have provided feedback on the API during our ongoing design process, **THANK YOU**. We are thrilled that you can finally interact with the working API we built based on your feedback.
31
-
32
- ### Useful links:
33
- - [Getting Started](https://alpha.lunchmoney.dev/v2/getting-started)
34
- - [v2 API Changelog](https://alpha.lunchmoney.dev/v2/changelog)
35
- - [Migration Guide](https://alpha.lunchmoney.dev/v2/migration-guide)
36
- - [Rate Limits](https://alpha.lunchmoney.dev/v2/rate-limits)
37
- - [Current v1 Lunch Money API Documentation](https://lunchmoney.dev)
38
- - [Awesome Lunch Money Projects](https://github.com/lunch-money/awesome-lunchmoney?tab=readme-ov-file)
25
+ **Useful links**
26
+ - [Developer Portal](https://lunchmoney.dev/v2/introduction)
27
+ - [Getting Started Guide](https://lunchmoney.dev/v2/getting-started)
28
+ - [v2 API Overview](https://lunchmoney.dev/v2/overview)
29
+ - [Version History](https://lunchmoney.dev/v2/version-history)
30
+ - [Migration Guide](https://lunchmoney.dev/v2/migration-guide)
31
+ - [Rate Limits](https://lunchmoney.dev/v2/rate-limits)
39
32
  termsOfService: https://lunchmoney.dev/#current-status
40
33
  contact:
41
34
  email: devsupport@lunchmoney.app
42
35
  license:
43
36
  name: Apache 2.0
44
37
  url: http://www.apache.org/licenses/LICENSE-2.0.html
45
- version: 2.10.0
38
+ version: 2.11.0
46
39
 
47
40
  servers:
48
41
  - url: https://api.lunchmoney.dev/v2
49
42
  description: v2 Lunch Money API Server - changes will affect real data!
50
- - url: https://mock.lunchmoney.dev/v2
43
+ # - url: https://lunchmoney.dev/v2
44
+ - url: https://lunchmoney.dev/v2
51
45
  description: Static mock version of the v2 Lunch Money API Server
52
46
 
53
47
  tags:
@@ -78,6 +72,8 @@ tags:
78
72
  externalDocs:
79
73
  description: Learn more about crypto assets
80
74
  url: https://support.lunchmoney.app/setup/crypto
75
+ - name: balance_history
76
+ 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.
81
77
  - name: recurring_items
82
78
  description: Work with recurring items
83
79
  externalDocs:
@@ -113,8 +109,10 @@ tags:
113
109
  description: Learn more about transactions
114
110
  url: https://support.lunchmoney.app/finances/transactions
115
111
  - name: budgets
116
- description: View settings and modify budget amounts.<p> Use the
117
- [/summary](#tag/summary) endpoint to view the budget details performance.
112
+ description: View settings and modify budget amounts.<p> Use
113
+ [/budgets/settings](#tag/budgets/GET/budgets/settings) to view budget
114
+ period settings.<p> Use the [/summary](#tag/summary) endpoint to view
115
+ the budget details performance.
118
116
  externalDocs:
119
117
  description: Learn more about budgets
120
118
  url: https://support.lunchmoney.app/finances/budgets
@@ -142,12 +140,12 @@ components:
142
140
  account_id:
143
141
  type: integer
144
142
  format: int64
145
- description: Unique ID for the linked budgeting account
143
+ description: Unique ID for the current budgeting account
146
144
  budget_name:
147
145
  type: string
148
- description: Name of the linked budgeting account
146
+ description: Name of the current budgeting account
149
147
  primary_currency:
150
- description: Primary currency set in the user's settings
148
+ description: Primary currency for the current budgeting account
151
149
  allOf:
152
150
  - $ref: "#/components/schemas/currencyEnum"
153
151
  api_key_label:
@@ -760,7 +758,12 @@ components:
760
758
  type: string
761
759
  minLength: 1
762
760
  maxLength: 45
763
- description: The name of the crypto asset
761
+ description: The asset name for this balance, typically the uppercased currency symbol (e.g. ETH).
762
+ display_name:
763
+ type: string
764
+ nullable: true
765
+ description: Optional display name for the synced crypto asset as set by the user. If `null`,
766
+ clients may derive a display name from syncedCryptoAccount's `provider` + `name`.
764
767
  balance:
765
768
  type: string
766
769
  pattern: ^-?\d+(\.\d{1,18})?$
@@ -800,6 +803,7 @@ components:
800
803
  extended format
801
804
  required:
802
805
  - name
806
+ - display_name
803
807
  - balance
804
808
  - symbol
805
809
  - coingecko_id
@@ -1364,10 +1368,13 @@ components:
1364
1368
  - $ref: "#/components/schemas/accountTypeEnum"
1365
1369
  subtype:
1366
1370
  type: string
1367
- description: If set, an optional account subtype. Examples include<br>
1371
+ nullable: true
1372
+ description: If set, an optional account subtype. Set to `null` to clear it.
1373
+ Examples include<br>
1368
1374
  - retirement - checking - savings - prepaid credit card
1369
1375
  minLength: 1
1370
1376
  maxLength: 100
1377
+ example: prepaid credit card
1371
1378
  x-updatable: true
1372
1379
  balance:
1373
1380
  oneOf:
@@ -1621,6 +1628,364 @@ components:
1621
1628
  - last_fetch
1622
1629
  - plaid_last_successful_update
1623
1630
 
1631
+ balanceHistorySourceManual:
1632
+ type: object
1633
+ description: Source information for a manual account balance history entry.
1634
+ additionalProperties: false
1635
+ x-internal: true
1636
+ properties:
1637
+ type:
1638
+ type: string
1639
+ enum: [manual]
1640
+ description: Identifies this entry as belonging to a manually-managed account.
1641
+ manual_account_id:
1642
+ type: integer
1643
+ format: int32
1644
+ description: ID of the manual account associated with this entry.
1645
+ required:
1646
+ - type
1647
+ - manual_account_id
1648
+
1649
+ balanceHistorySourcePlaid:
1650
+ type: object
1651
+ description: Source information for a Plaid-synced account balance history entry.
1652
+ additionalProperties: false
1653
+ x-internal: true
1654
+ properties:
1655
+ type:
1656
+ type: string
1657
+ enum: [plaid]
1658
+ description: Identifies this entry as belonging to a Plaid-synced account.
1659
+ plaid_account_id:
1660
+ type: integer
1661
+ format: int32
1662
+ description: ID of the Plaid account associated with this entry.
1663
+ required:
1664
+ - type
1665
+ - plaid_account_id
1666
+
1667
+ balanceHistorySourceCryptoManual:
1668
+ type: object
1669
+ description: Source information for a manually-tracked cryptocurrency balance history entry.
1670
+ additionalProperties: false
1671
+ x-internal: true
1672
+ properties:
1673
+ type:
1674
+ type: string
1675
+ enum: [crypto_manual]
1676
+ description: Identifies this entry as belonging to a manually-tracked crypto account.
1677
+ crypto_manual_id:
1678
+ type: integer
1679
+ format: int32
1680
+ description: ID of the manual crypto account associated with this entry.
1681
+ symbol:
1682
+ type: string
1683
+ nullable: true
1684
+ minLength: 1
1685
+ maxLength: 25
1686
+ description: Crypto symbol associated with the manual crypto account, when available.
1687
+ required:
1688
+ - type
1689
+ - crypto_manual_id
1690
+
1691
+ balanceHistorySourceCryptoSynced:
1692
+ type: object
1693
+ x-internal: true
1694
+ description: Source information for a synced cryptocurrency balance history entry.
1695
+ additionalProperties: false
1696
+ properties:
1697
+ type:
1698
+ type: string
1699
+ enum: [crypto_synced]
1700
+ description: Identifies this entry as belonging to a synced crypto connection.
1701
+ crypto_synced_id:
1702
+ type: integer
1703
+ format: int32
1704
+ description: ID of the synced crypto connection associated with this entry.
1705
+ symbol:
1706
+ type: string
1707
+ minLength: 1
1708
+ maxLength: 25
1709
+ description: Crypto symbol (e.g. `eth`, `btc`) identifying the specific currency within the synced account.
1710
+ required:
1711
+ - type
1712
+ - crypto_synced_id
1713
+ - symbol
1714
+
1715
+ balanceHistorySourceDeleted:
1716
+ type: object
1717
+ x-internal: true
1718
+ description: >
1719
+ Source information for a balance history entry whose account has since been deleted.
1720
+ Historical balances are preserved when a user chooses to keep history on account deletion.
1721
+ This object contains details that can be used to display the deleted account in the UI.
1722
+ The `deleted_account_id` can be passed to `PUT /v2/balance_history/deleted/{account_id}/details`
1723
+ to update the archived source metadata.
1724
+ additionalProperties: false
1725
+ properties:
1726
+ type:
1727
+ type: string
1728
+ enum: [deleted]
1729
+ description: Identifies this entry as belonging to an account that has since been deleted.
1730
+ deleted_account_id:
1731
+ type: integer
1732
+ format: int32
1733
+ description: Identifier for the deleted account history source
1734
+ name:
1735
+ type: string
1736
+ nullable: true
1737
+ description: Archived account `name` for the deleted account source
1738
+ institution_name:
1739
+ type: string
1740
+ nullable: true
1741
+ description: Archived `institution_name` for the deleted account source
1742
+ display_name:
1743
+ type: string
1744
+ nullable: true
1745
+ description: Archived `display_name` of the deleted account
1746
+ account_type:
1747
+ type: string
1748
+ nullable: true
1749
+ description: Archived `type` of the deleted account source
1750
+ subtype:
1751
+ type: string
1752
+ nullable: true
1753
+ description: Archived `subtype`` of the deleted account source
1754
+ mask:
1755
+ type: string
1756
+ nullable: true
1757
+ description: Archived account `mask` for a deleted plaid account source
1758
+ symbol:
1759
+ type: string
1760
+ nullable: true
1761
+ minLength: 1
1762
+ maxLength: 25
1763
+ description: Archived `symbol` for a deleted crypto account source
1764
+ required:
1765
+ - type
1766
+ - deleted_account_id
1767
+ - name
1768
+ - institution_name
1769
+ - display_name
1770
+ - account_type
1771
+ - subtype
1772
+ - mask
1773
+ - symbol
1774
+
1775
+ balanceHistoryAccountObject:
1776
+ type: object
1777
+ title: balance history for an account object
1778
+ additionalProperties: false
1779
+ description: Historical balance entries grouped under a single account source.
1780
+ properties:
1781
+ source:
1782
+ description: >
1783
+ Identifies the account this balance entry belongs to. The shape varies by
1784
+ `source.type`. Use `source.type` to determine which account id field is present.
1785
+ oneOf:
1786
+ - $ref: "#/components/schemas/balanceHistorySourceManual"
1787
+ - $ref: "#/components/schemas/balanceHistorySourcePlaid"
1788
+ - $ref: "#/components/schemas/balanceHistorySourceCryptoManual"
1789
+ - $ref: "#/components/schemas/balanceHistorySourceCryptoSynced"
1790
+ - $ref: "#/components/schemas/balanceHistorySourceDeleted"
1791
+ discriminator:
1792
+ propertyName: type
1793
+ mapping:
1794
+ manual: "#/components/schemas/balanceHistorySourceManual"
1795
+ plaid: "#/components/schemas/balanceHistorySourcePlaid"
1796
+ crypto_manual: "#/components/schemas/balanceHistorySourceCryptoManual"
1797
+ crypto_synced: "#/components/schemas/balanceHistorySourceCryptoSynced"
1798
+ deleted: "#/components/schemas/balanceHistorySourceDeleted"
1799
+ balances:
1800
+ type: array
1801
+ description: >
1802
+ Monthly balance history entries for the source account. On GET responses,
1803
+ this includes all entries in the requested range. On PUT upsert responses,
1804
+ this includes only the entries modified by that request.
1805
+ items:
1806
+ $ref: "#/components/schemas/balanceHistoryObject"
1807
+ required:
1808
+ - source
1809
+ - balances
1810
+
1811
+ balanceHistoryObject:
1812
+ type: object
1813
+ title: balance history entry object
1814
+ additionalProperties: false
1815
+ x-internal: true
1816
+ description: A historical balance entry for a single account on a single date.
1817
+ properties:
1818
+ id:
1819
+ type: integer
1820
+ format: int32
1821
+ description: Unique identifier of this historical balance entry.
1822
+ date:
1823
+ type: string
1824
+ format: date
1825
+ description: Date of this historical balance entry in YYYY-MM-DD format. This is always the first day of a month.
1826
+ balance:
1827
+ type: string
1828
+ pattern: ^-?\d+(\.\d{1,4})?$
1829
+ 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.
1830
+ currency:
1831
+ allOf:
1832
+ - $ref: "#/components/schemas/currencyEnum"
1833
+ description: Currency of the stored `balance`. For crypto entries this is the user's primary currency.
1834
+ to_base:
1835
+ type: number
1836
+ format: double
1837
+ description: Historical 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`.
1838
+ crypto_balance:
1839
+ type: string
1840
+ nullable: true
1841
+ pattern: ^-?\d+(\.\d{1,18})?$
1842
+ description: Crypto quantity stored for this balance entry, when available. This may be present for crypto or deleted-account entries and is `null` otherwise.
1843
+ required:
1844
+ - id
1845
+ - date
1846
+ - balance
1847
+ - currency
1848
+ - to_base
1849
+ - crypto_balance
1850
+
1851
+ balanceHistoryListResponseObject:
1852
+ type: object
1853
+ additionalProperties: false
1854
+ x-internal: true
1855
+ properties:
1856
+ balance_history:
1857
+ type: array
1858
+ items:
1859
+ $ref: "#/components/schemas/balanceHistoryAccountObject"
1860
+ required:
1861
+ - balance_history
1862
+
1863
+ balanceHistoryUpdateItemObject:
1864
+ type: object
1865
+ x-internal: true
1866
+ additionalProperties: false
1867
+ properties:
1868
+ id:
1869
+ type: integer
1870
+ format: int32
1871
+ description: System-defined balance history entry id. Ignored if set.
1872
+ x-updatable: false
1873
+ date:
1874
+ type: string
1875
+ format: date
1876
+ 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.
1877
+ balance:
1878
+ oneOf:
1879
+ - type: number
1880
+ format: double
1881
+ - type: string
1882
+ pattern: ^-?\d+(\.\d{1,4})?$
1883
+ 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.
1884
+ symbol:
1885
+ type: string
1886
+ nullable: true
1887
+ minLength: 1
1888
+ maxLength: 25
1889
+ description: Optional for crypto balances, but if set it must match the account's symbol.
1890
+ Tolerated for deleted-account balances. Do not provide this for manual or Plaid balances.
1891
+ If provided when using the synced crypto path-based endpoint, this must match the symbol in the path.
1892
+ x-updatable: true
1893
+ crypto_balance:
1894
+ type: string
1895
+ nullable: true
1896
+ pattern: ^-?\d+(\.\d{1,18})?$
1897
+ description: Optional crypto quantity for crypto_manual, crypto_synced, and deleted balances. Do not provide this for manual or Plaid balances.
1898
+ x-updatable: true
1899
+ currency:
1900
+ allOf:
1901
+ - $ref: "#/components/schemas/currencyEnum"
1902
+ description: Optional currency for this balance entry. If omitted, it defaults to the account currency for manual/Plaid accounts, or the user's primary currency for crypto/deleted accounts.
1903
+ x-updatable: true
1904
+ to_base:
1905
+ type: number
1906
+ format: double
1907
+ description: System-defined historical balance converted to the user's primary currency. Ignored if set. Use `balance` to update the stored historical balance.
1908
+ x-updatable: false
1909
+ required:
1910
+ - date
1911
+ - balance
1912
+
1913
+ upsertBalanceHistoryRequestObject:
1914
+ type: object
1915
+ x-internal: true
1916
+ additionalProperties: false
1917
+ properties:
1918
+ balances:
1919
+ type: array
1920
+ minItems: 1
1921
+ description: One or more monthly balance history entries to upsert
1922
+ items:
1923
+ $ref: "#/components/schemas/balanceHistoryUpdateItemObject"
1924
+ required:
1925
+ - balances
1926
+
1927
+ updateBalanceHistoryDetailsRequestObject:
1928
+ type: object
1929
+ x-internal: true
1930
+ additionalProperties: false
1931
+ minProperties: 1
1932
+ properties:
1933
+ name:
1934
+ type: string
1935
+ nullable: true
1936
+ description: New archived account name for the deleted account source.
1937
+ institution_name:
1938
+ type: string
1939
+ nullable: true
1940
+ description: New archived institution name for the deleted account source.
1941
+ display_name:
1942
+ type: string
1943
+ nullable: true
1944
+ description: New display name for the deleted account source.
1945
+ account_type:
1946
+ type: string
1947
+ nullable: true
1948
+ description: New archived account type for the deleted account source.
1949
+ subtype:
1950
+ type: string
1951
+ nullable: true
1952
+ description: New archived subtype for the deleted account source.
1953
+ mask:
1954
+ type: string
1955
+ nullable: true
1956
+ description: New archived account mask for the deleted account source.
1957
+
1958
+ updateBalanceHistoryDetailsResponseObject:
1959
+ type: object
1960
+ x-internal: true
1961
+ additionalProperties: false
1962
+ properties:
1963
+ name:
1964
+ type: string
1965
+ nullable: true
1966
+ institution_name:
1967
+ type: string
1968
+ nullable: true
1969
+ display_name:
1970
+ type: string
1971
+ nullable: true
1972
+ account_type:
1973
+ type: string
1974
+ nullable: true
1975
+ subtype:
1976
+ type: string
1977
+ nullable: true
1978
+ mask:
1979
+ type: string
1980
+ nullable: true
1981
+ required:
1982
+ - name
1983
+ - institution_name
1984
+ - display_name
1985
+ - account_type
1986
+ - subtype
1987
+ - mask
1988
+
1624
1989
  # The object containing information about a recurring item
1625
1990
  recurringObject:
1626
1991
  type: object
@@ -2097,14 +2462,9 @@ components:
2097
2462
  external_id:
2098
2463
  type: string
2099
2464
  nullable: true
2100
- description: A user-defined external ID for any transaction that was
2101
- added via csv import, `POST /transactions` API call, or manually
2102
- added via the Lunch Money app. No external ID exists for
2103
- transactions associated with synced accounts, and they cannot be
2104
- added. For transactions associated with manual accounts, the
2105
- external ID must be unique as attempts to add a subsequent
2106
- transaction with the same external_id and manual_account_id will be
2107
- flagged as duplicates and fail.
2465
+ description: A user-defined external ID associated with the transaction.
2466
+ For transactions belonging to manual accounts, the
2467
+ external ID must be unique for each transaction associated with the account.
2108
2468
  minLength: 0
2109
2469
  maxLength: 75
2110
2470
  tag_ids:
@@ -2125,8 +2485,6 @@ components:
2125
2485
  Any transaction notes set by the user or by
2126
2486
  a matched recurring item. This will match the value
2127
2487
  displayed in notes field on the transactions page in the Lunch Money app.
2128
- minLength: 0
2129
- maxLength: 350
2130
2488
  status:
2131
2489
  type: string
2132
2490
  # description: >
@@ -2362,8 +2720,6 @@ components:
2362
2720
  Any transaction notes set by the user or by
2363
2721
  a matched recurring item. This will match the value
2364
2722
  displayed in notes field on the transactions page in the Lunch Money app.
2365
- minLength: 0
2366
- maxLength: 350
2367
2723
  status:
2368
2724
  type: string
2369
2725
  description: >
@@ -2505,14 +2861,9 @@ components:
2505
2861
  external_id:
2506
2862
  type: string
2507
2863
  nullable: true
2508
- description: A user-defined external ID for any transaction that was
2509
- added via csv import, `POST /transactions` API call, or manually
2510
- added via the Lunch Money app. No external ID exists for
2511
- transactions associated with synced accounts, and they cannot be
2512
- added. For transactions associated with manual accounts, the
2513
- external ID must be unique as attempts to add a subsequent
2514
- transaction with the same external_id and manual_account_id will be
2515
- flagged as duplicates and fail.
2864
+ description: A user-defined external ID associated with the transaction.
2865
+ For transactions belonging to manual accounts, the
2866
+ external ID must be unique for each transaction associated with the account.
2516
2867
  minLength: 0
2517
2868
  maxLength: 75
2518
2869
  plaid_metadata:
@@ -2582,7 +2933,7 @@ components:
2582
2933
  currency:
2583
2934
  description: Three-letter lowercase currency code of the transaction
2584
2935
  in ISO 4217 format. Must match one of the [supported
2585
- currencies](https://alpha.lunchmoney.dev/v2/currencies). If not set
2936
+ currencies](https://lunchmoney.dev/v2/currencies). If not set
2586
2937
  defaults to the user account's primary currency.
2587
2938
  allOf:
2588
2939
  - $ref: "#/components/schemas/currencyEnum"
@@ -2608,8 +2959,6 @@ components:
2608
2959
  Any transaction notes set by the user or by
2609
2960
  a matched recurring item. This will match the value
2610
2961
  displayed in notes field on the transactions page in the Lunch Money app.
2611
- minLength: 0
2612
- maxLength: 350
2613
2962
  manual_account_id:
2614
2963
  type: integer
2615
2964
  format: int32
@@ -2728,7 +3077,7 @@ components:
2728
3077
  type: string
2729
3078
  description: |
2730
3079
  The new payee for the transaction.
2731
- x-updatable: true
3080
+ minLength: 0
2732
3081
  original_name:
2733
3082
  type: string
2734
3083
  nullable: true
@@ -2747,8 +3096,6 @@ components:
2747
3096
  description: >
2748
3097
  New notes for the transaction. Set this to an empty string to clear
2749
3098
  the existing notes.
2750
- minLength: 0
2751
- maxLength: 350
2752
3099
  x-updatable: true
2753
3100
  manual_account_id:
2754
3101
  type: integer
@@ -2954,7 +3301,6 @@ components:
2954
3301
  format: int32
2955
3302
  notes:
2956
3303
  type: string
2957
- maxLength: 350
2958
3304
  description: Will inherit notes from parent if not defined.
2959
3305
  required:
2960
3306
  - amount
@@ -3264,10 +3610,11 @@ components:
3264
3610
 
3265
3611
  # Response body for GET /budgets/settings (200)
3266
3612
  budgetSettingsResponseObject:
3267
- x-internal: true
3268
3613
  type: object
3614
+ title: budget settings object
3269
3615
  additionalProperties: false
3270
- description: Budget period and display settings
3616
+ description: Budget period and display settings for the current budgeting
3617
+ account.
3271
3618
  properties:
3272
3619
  budget_period_granularity:
3273
3620
  type: string
@@ -3279,8 +3626,8 @@ components:
3279
3626
  - twice a month
3280
3627
  description: Budget period granularity
3281
3628
  budget_period_quantity:
3282
- type: number
3283
- format: double
3629
+ type: integer
3630
+ format: int32
3284
3631
  description: The number of `granularity` units that make up a single
3285
3632
  budgeting period.
3286
3633
  budget_period_anchor_date:
@@ -3425,8 +3772,6 @@ components:
3425
3772
  type: array
3426
3773
  items:
3427
3774
  $ref: "#/components/schemas/summaryCategoryOccurrenceObject"
3428
- rollover_pool:
3429
- $ref: "#/components/schemas/summaryRolloverPoolObject"
3430
3775
  required:
3431
3776
  - category_id
3432
3777
  - totals
@@ -3638,7 +3983,9 @@ components:
3638
3983
  while processing the request.<br> If multiple errors were
3639
3984
  encountered, the list will contain multiple objects.<br> Each
3640
3985
  `error` object is guaranteed to have an `errMsg`, but it may also
3641
- contain other error specific properties.
3986
+ contain other error-specific properties such as `code` (for example
3987
+ `VALIDATION_ERROR`), or other properties that are useful to map
3988
+ the error to the relevant part of the request.
3642
3989
  type: array
3643
3990
  items:
3644
3991
  type: object
@@ -3747,6 +4094,7 @@ components:
3747
4094
  # - `cad`: Canadian Dollar
3748
4095
  # - `cdf`: Congolese Franc
3749
4096
  # - `chf`: Swiss Franc
4097
+ # - `clf`: Chilean Unit of Account (UF)
3750
4098
  # - `clp`: Chilean Peso
3751
4099
  # - `cny`: Chinese Yuan
3752
4100
  # - `cop`: Colombian Peso
@@ -3762,6 +4110,7 @@ components:
3762
4110
  # - `egp`: Egyptian Pound
3763
4111
  # - `ern`: Eritrean Nakfa
3764
4112
  # - `etb`: Ethiopian Birr
4113
+ # - `eth`: Ethereum
3765
4114
  # - `eur`: Euro
3766
4115
  # - `fjd`: Fijian Dollar
3767
4116
  # - `fkp`: Falkland Islands Pound
@@ -3869,12 +4218,13 @@ components:
3869
4218
  # - `uyu`: Uruguayan Peso
3870
4219
  # - `uzs`: Uzbekistan Som
3871
4220
  # - `vef`: Venezuelan Bolívar
4221
+ # - `ves`: Venezuelan Bolívar Sotiemas
3872
4222
  # - `vnd`: Vietnamese Dong
3873
4223
  # - `vuv`: Vanuatu Vatu
3874
4224
  # - `wst`: Samoan Tala
3875
4225
  # - `xaf`: CFA Franc BEAC
3876
- # - `xag`: Silver
3877
- # - `xau`: Gold
4226
+ # - `xag`: Silver (troy ounce)
4227
+ # - `xau`: Gold (troy ounce)
3878
4228
  # - `xcd`: East Caribbean Dollar
3879
4229
  # - `xof`: CFA Franc BCEAO
3880
4230
  # - `xpf`: CFP Franc
@@ -3912,6 +4262,7 @@ components:
3912
4262
  - cad
3913
4263
  - cdf
3914
4264
  - chf
4265
+ - clf
3915
4266
  - clp
3916
4267
  - cny
3917
4268
  - cop
@@ -3927,6 +4278,7 @@ components:
3927
4278
  - egp
3928
4279
  - ern
3929
4280
  - etb
4281
+ - eth
3930
4282
  - eur
3931
4283
  - fjd
3932
4284
  - fkp
@@ -4034,6 +4386,7 @@ components:
4034
4386
  - uyu
4035
4387
  - uzs
4036
4388
  - vef
4389
+ - ves
4037
4390
  - vnd
4038
4391
  - vuv
4039
4392
  - wst
@@ -4614,6 +4967,24 @@ paths:
4614
4967
  pool data for categories with budgets"
4615
4968
  value:
4616
4969
  aligned: true
4970
+ rollover_pool:
4971
+ budgeted_to_base: 179.50
4972
+ all_adjustments:
4973
+ - in_range: false
4974
+ date: "2025-06-30"
4975
+ amount: "179.5000"
4976
+ currency: "usd"
4977
+ to_base: 179.50
4978
+ - in_range: false
4979
+ date: "2025-05-31"
4980
+ amount: "120.2500"
4981
+ currency: "usd"
4982
+ to_base: 120.25
4983
+ - in_range: false
4984
+ date: "2025-04-30"
4985
+ amount: "80.0000"
4986
+ currency: "usd"
4987
+ to_base: 80.00
4617
4988
  categories:
4618
4989
  - category_id: 315177
4619
4990
  totals:
@@ -4633,24 +5004,6 @@ paths:
4633
5004
  budgeted_amount: "500.0000"
4634
5005
  budgeted_currency: "usd"
4635
5006
  notes: "Monthly budget allocation"
4636
- rollover_pool:
4637
- budgeted_to_base: 179.50
4638
- all_adjustments:
4639
- - in_range: false
4640
- date: "2025-06-30"
4641
- amount: "179.5000"
4642
- currency: "usd"
4643
- to_base: 179.50
4644
- - in_range: false
4645
- date: "2025-05-31"
4646
- amount: "120.2500"
4647
- currency: "usd"
4648
- to_base: 120.25
4649
- - in_range: false
4650
- date: "2025-04-30"
4651
- amount: "80.0000"
4652
- currency: "usd"
4653
- to_base: 80.00
4654
5007
  "401":
4655
5008
  $ref: "#/components/responses/unauthorizedToken"
4656
5009
  "429":
@@ -5609,11 +5962,22 @@ paths:
5609
5962
  examples:
5610
5963
  missing required properties:
5611
5964
  value:
5612
- message: Request Validation Failure
5965
+ message: Invalid Request Body
5613
5966
  errors:
5614
5967
  - errMsg: "Missing required property 'name' in request body."
5615
5968
  - errMsg: "Missing required property 'balance' in request body."
5616
5969
  - errMsg: "Missing required property 'symbol' in request body."
5970
+ invalid balance:
5971
+ value:
5972
+ message: Invalid Request Body
5973
+ errors:
5974
+ - errMsg: "Invalid value for property 'balance'. 'abc' cannot be converted to a number"
5975
+ - errMsg: "Invalid value for property 'balance'. Invalid input"
5976
+ invalid property:
5977
+ value:
5978
+ message: Invalid Request Body
5979
+ errors:
5980
+ - errMsg: "Invalid property 'coingecko_id' in request body."
5617
5981
  unsupported symbol:
5618
5982
  value:
5619
5983
  message: Request Validation Failure
@@ -5950,46 +6314,903 @@ paths:
5950
6314
  value: 99999999
5951
6315
  responses:
5952
6316
  "200":
5953
- description: Synced crypto account object
6317
+ description: Synced crypto account object
6318
+ content:
6319
+ application/json:
6320
+ schema:
6321
+ $ref: "#/components/schemas/syncedCryptoAccount"
6322
+ example:
6323
+ id: 33004
6324
+ provider: coinbase
6325
+ status: active
6326
+ created_by_name: User 1
6327
+ created_at: "2025-10-02T11:02:09.000Z"
6328
+ updated_at: "2026-02-25T14:25:01.000Z"
6329
+ display_name: Coinbase Main
6330
+ balances:
6331
+ - name: ETH
6332
+ balance: "12.004500000000000000"
6333
+ symbol: eth
6334
+ coingecko_id: ethereum
6335
+ to_base: 28998.44
6336
+ balance_as_of: "2026-02-25T14:25:00.000Z"
6337
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6338
+ updated_at: "2026-02-25T14:25:01.000Z"
6339
+ - name: BTC
6340
+ balance: "0.100020003000400050"
6341
+ symbol: btc
6342
+ coingecko_id: bitcoin
6343
+ to_base: 6231.28
6344
+ balance_as_of: "2026-02-25T14:25:00.000Z"
6345
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6346
+ updated_at: "2026-02-25T14:25:01.000Z"
6347
+ "400":
6348
+ description: Bad Request
6349
+ content:
6350
+ application/json:
6351
+ schema:
6352
+ $ref: "#/components/schemas/errorResponseObject"
6353
+ example:
6354
+ message: Invalid Path Parameters
6355
+ errors:
6356
+ - errMsg: "Invalid value type for path parameter: 'id'. Expected 'number', received 'string'."
6357
+ "401":
6358
+ $ref: "#/components/responses/unauthorizedToken"
6359
+ "404":
6360
+ description: Not Found
6361
+ content:
6362
+ application/json:
6363
+ schema:
6364
+ $ref: "#/components/schemas/errorResponseObject"
6365
+ example:
6366
+ message: Not Found
6367
+ errors:
6368
+ - errMsg: "There is no synced crypto account with the id: 99999999."
6369
+ "429":
6370
+ $ref: "#/components/responses/rateLimited"
6371
+ "500":
6372
+ $ref: "#/components/responses/serverError"
6373
+ /crypto/synced/{id}/{symbol}:
6374
+ get:
6375
+ tags:
6376
+ - crypto-synced
6377
+ summary: Get a synced crypto balance by symbol
6378
+ description: Retrieves a single balance from the specified synced crypto
6379
+ account using the crypto symbol.
6380
+ operationId: getCryptoSyncedBalanceBySymbol
6381
+ parameters:
6382
+ - name: id
6383
+ in: path
6384
+ description: Synced crypto account ID
6385
+ required: true
6386
+ schema:
6387
+ type: integer
6388
+ format: int32
6389
+ - name: symbol
6390
+ in: path
6391
+ description: Crypto symbol within the synced account
6392
+ required: true
6393
+ schema:
6394
+ type: string
6395
+ minLength: 1
6396
+ maxLength: 25
6397
+ responses:
6398
+ "200":
6399
+ description: Synced crypto balance object
6400
+ content:
6401
+ application/json:
6402
+ schema:
6403
+ $ref: "#/components/schemas/cryptoSyncedBalance"
6404
+ example:
6405
+ name: ETH
6406
+ balance: "12.004500000000000000"
6407
+ symbol: eth
6408
+ coingecko_id: ethereum
6409
+ to_base: 28998.44
6410
+ balance_as_of: "2026-02-25T14:25:00.000Z"
6411
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6412
+ updated_at: "2026-02-25T14:25:01.000Z"
6413
+ "400":
6414
+ description: Bad Request
6415
+ content:
6416
+ application/json:
6417
+ schema:
6418
+ $ref: "#/components/schemas/errorResponseObject"
6419
+ examples:
6420
+ invalid id:
6421
+ value:
6422
+ message: Invalid Path Parameters
6423
+ errors:
6424
+ - errMsg: "Invalid value type for path parameter: 'id'. Expected 'number', received 'string'."
6425
+ invalid symbol:
6426
+ value:
6427
+ message: Invalid Path Parameters
6428
+ errors:
6429
+ - errMsg: "Value for path parameter 'symbol' must not be empty."
6430
+ "401":
6431
+ $ref: "#/components/responses/unauthorizedToken"
6432
+ "404":
6433
+ description: Not Found
6434
+ content:
6435
+ application/json:
6436
+ schema:
6437
+ $ref: "#/components/schemas/errorResponseObject"
6438
+ examples:
6439
+ account not found:
6440
+ value:
6441
+ message: Not Found
6442
+ errors:
6443
+ - errMsg: "There is no synced crypto account with the id: 99999999."
6444
+ symbol not found:
6445
+ value:
6446
+ message: Not Found
6447
+ errors:
6448
+ - errMsg: "There is no synced crypto balance with symbol 'doge' for the crypto account with id: 33004."
6449
+ "429":
6450
+ $ref: "#/components/responses/rateLimited"
6451
+ "500":
6452
+ $ref: "#/components/responses/serverError"
6453
+ /crypto/synced/{id}/refresh:
6454
+ post:
6455
+ tags:
6456
+ - crypto-synced
6457
+ summary: Refresh balances for a synced crypto account
6458
+ description: Trigger a balance refresh for the specified synced crypto
6459
+ account. Returns the refreshed synced crypto account.
6460
+ operationId: refreshCryptoSynced
6461
+ parameters:
6462
+ - name: id
6463
+ in: path
6464
+ description: Synced crypto account ID
6465
+ required: true
6466
+ schema:
6467
+ type: integer
6468
+ format: int32
6469
+ examples:
6470
+ existing synced connection:
6471
+ summary: Existing synced account ID
6472
+ value: 33004
6473
+ id not found:
6474
+ summary: Example of an id that doesn't exist
6475
+ value: 99999999
6476
+ responses:
6477
+ "200":
6478
+ description: Refreshed synced crypto account
6479
+ content:
6480
+ application/json:
6481
+ schema:
6482
+ $ref: "#/components/schemas/syncedCryptoAccount"
6483
+ example:
6484
+ id: 33004
6485
+ provider: coinbase
6486
+ status: active
6487
+ created_by_name: User 1
6488
+ created_at: "2025-10-02T11:02:09.000Z"
6489
+ display_name: Coinbase Main
6490
+ balances:
6491
+ - name: ETH
6492
+ balance: "12.004500000000000000"
6493
+ symbol: eth
6494
+ coingecko_id: ethereum
6495
+ to_base: 28998.44
6496
+ balance_as_of: "2026-02-25T14:25:00.000Z"
6497
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6498
+ updated_at: "2026-02-25T14:25:01.000Z"
6499
+ - name: BTC
6500
+ balance: "0.100020003000400050"
6501
+ symbol: btc
6502
+ coingecko_id: bitcoin
6503
+ to_base: 6231.28
6504
+ balance_as_of: "2026-02-25T14:25:00.000Z"
6505
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6506
+ updated_at: "2026-02-25T14:25:01.000Z"
6507
+ "401":
6508
+ $ref: "#/components/responses/unauthorizedToken"
6509
+ "404":
6510
+ description: Not Found
6511
+ content:
6512
+ application/json:
6513
+ schema:
6514
+ $ref: "#/components/schemas/errorResponseObject"
6515
+ example:
6516
+ message: Not Found
6517
+ errors:
6518
+ - errMsg: "There is no synced crypto account with the id: 99999999."
6519
+ "429":
6520
+ $ref: "#/components/responses/rateLimited"
6521
+ "500":
6522
+ $ref: "#/components/responses/serverError"
6523
+ /balance_history:
6524
+ get:
6525
+ tags:
6526
+ - balance_history
6527
+ summary: Get balance history
6528
+ description: >-
6529
+ Retrieve historical balance entries.<br><br>
6530
+
6531
+ Balance history is monthly. When `start_date` and `end_date` are both provided,
6532
+ they must be first-of-month dates. `start_date` must not be in the future,
6533
+ while `end_date` may be in the future. If one of `start_date` or `end_date`
6534
+ is provided, the other is required. If neither is provided, all available
6535
+ balance history is returned.<br><br>
6536
+
6537
+ The response groups entries by source account. Each item in
6538
+ `balance_history` contains a `source` object plus a `balances` array
6539
+ containing one balance entry per month in the requested range, or all
6540
+ stored entries when no range is provided.<br><br>
6541
+
6542
+ Historical entries for accounts that have been deleted may still
6543
+ be returned. These entries use `source.type: deleted` and include
6544
+ `deleted_account_id`, archived display fields, and account metadata on the
6545
+ `source` object.
6546
+ operationId: getBalanceHistory
6547
+ parameters:
6548
+ - name: start_date
6549
+ in: query
6550
+ 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.
6551
+ required: false
6552
+ schema:
6553
+ type: string
6554
+ format: date
6555
+ examples:
6556
+ range start:
6557
+ summary: Start date
6558
+ value: "2026-01-01"
6559
+ - name: end_date
6560
+ in: query
6561
+ 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`.
6562
+ required: false
6563
+ schema:
6564
+ type: string
6565
+ format: date
6566
+ examples:
6567
+ range end:
6568
+ summary: End date
6569
+ value: "2026-03-01"
6570
+ responses:
6571
+ "200":
6572
+ description: Historical balance entries for the requested date range
6573
+ content:
6574
+ application/json:
6575
+ schema:
6576
+ $ref: "#/components/schemas/balanceHistoryListResponseObject"
6577
+ examples:
6578
+ all account types:
6579
+ value:
6580
+ balance_history:
6581
+ - source:
6582
+ type: manual
6583
+ manual_account_id: 119807
6584
+ balances:
6585
+ - id: 101
6586
+ date: "2026-01-01"
6587
+ balance: "41000.0000"
6588
+ currency: usd
6589
+ to_base: 41000
6590
+ crypto_balance: null
6591
+ - id: 102
6592
+ date: "2026-02-01"
6593
+ balance: "41211.8000"
6594
+ currency: usd
6595
+ to_base: 41211.8
6596
+ crypto_balance: null
6597
+ - source:
6598
+ type: plaid
6599
+ plaid_account_id: 119808
6600
+ balances:
6601
+ - id: 103
6602
+ date: "2026-01-01"
6603
+ balance: "5498.2800"
6604
+ currency: usd
6605
+ to_base: 5498.28
6606
+ crypto_balance: null
6607
+ - source:
6608
+ type: crypto_manual
6609
+ crypto_manual_id: 22001
6610
+ symbol: btc
6611
+ balances:
6612
+ - id: 104
6613
+ date: "2026-01-01"
6614
+ balance: "53124.7200"
6615
+ currency: usd
6616
+ to_base: 53124.72
6617
+ crypto_balance: "0.852341920145782301"
6618
+ - source:
6619
+ type: crypto_synced
6620
+ crypto_synced_id: 33004
6621
+ symbol: btc
6622
+ balances:
6623
+ - id: 105
6624
+ date: "2026-01-01"
6625
+ balance: "6231.2800"
6626
+ currency: usd
6627
+ to_base: 6231.28
6628
+ crypto_balance: "0.100020003000400050"
6629
+ - source:
6630
+ type: deleted
6631
+ deleted_account_id: 91
6632
+ name: Savings
6633
+ institution_name: Old Bank
6634
+ display_name: Closed Savings
6635
+ account_type: savings
6636
+ subtype: savings
6637
+ mask: "1234"
6638
+ symbol: null
6639
+ balances:
6640
+ - id: 106
6641
+ date: "2026-01-01"
6642
+ balance: "1250.0000"
6643
+ currency: usd
6644
+ to_base: 1250
6645
+ crypto_balance: null
6646
+ manual account history:
6647
+ value:
6648
+ balance_history:
6649
+ - source:
6650
+ type: manual
6651
+ manual_account_id: 119807
6652
+ balances:
6653
+ - id: 201
6654
+ date: "2026-01-01"
6655
+ balance: "41000.0000"
6656
+ currency: usd
6657
+ to_base: 41000
6658
+ crypto_balance: null
6659
+ - id: 202
6660
+ date: "2026-02-01"
6661
+ balance: "41211.8000"
6662
+ currency: usd
6663
+ to_base: 41211.8
6664
+ crypto_balance: null
6665
+ plaid account history:
6666
+ value:
6667
+ balance_history:
6668
+ - source:
6669
+ type: plaid
6670
+ plaid_account_id: 119808
6671
+ balances:
6672
+ - id: 301
6673
+ date: "2026-02-01"
6674
+ balance: "5498.2800"
6675
+ currency: usd
6676
+ to_base: 5498.28
6677
+ crypto_balance: null
6678
+ synced crypto history:
6679
+ value:
6680
+ balance_history:
6681
+ - source:
6682
+ type: crypto_synced
6683
+ crypto_synced_id: 33004
6684
+ symbol: btc
6685
+ balances:
6686
+ - id: 401
6687
+ date: "2026-02-01"
6688
+ balance: "6231.2800"
6689
+ currency: usd
6690
+ to_base: 6231.28
6691
+ crypto_balance: "0.100020003000400050"
6692
+ deleted account history:
6693
+ value:
6694
+ balance_history:
6695
+ - source:
6696
+ type: deleted
6697
+ deleted_account_id: 91
6698
+ name: Savings
6699
+ institution_name: Old Bank
6700
+ display_name: Closed Savings
6701
+ account_type: savings
6702
+ subtype: savings
6703
+ mask: "1234"
6704
+ symbol: null
6705
+ balances:
6706
+ - id: 501
6707
+ date: "2026-01-01"
6708
+ balance: "1250.0000"
6709
+ currency: usd
6710
+ to_base: 1250
6711
+ crypto_balance: null
6712
+ "400":
6713
+ description: Bad Request
6714
+ content:
6715
+ application/json:
6716
+ schema:
6717
+ $ref: "#/components/schemas/errorResponseObject"
6718
+ examples:
6719
+ missing paired date:
6720
+ value:
6721
+ message: Request Validation Failure
6722
+ errors:
6723
+ - errMsg: "`start_date` and `end_date` must either both be provided or both be omitted."
6724
+ invalid range:
6725
+ value:
6726
+ message: Request Validation Failure
6727
+ errors:
6728
+ - errMsg: "`start_date` must be before or equal to `end_date`."
6729
+ not first of month:
6730
+ value:
6731
+ message: Request Validation Failure
6732
+ errors:
6733
+ - errMsg: "`start_date` and `end_date` must both be the first day of a month."
6734
+ future start date:
6735
+ value:
6736
+ message: Request Validation Failure
6737
+ errors:
6738
+ - errMsg: "`start_date` must not be in the future."
6739
+ "401":
6740
+ $ref: "#/components/responses/unauthorizedToken"
6741
+ "429":
6742
+ $ref: "#/components/responses/rateLimited"
6743
+ "500":
6744
+ $ref: "#/components/responses/serverError"
6745
+ /balance_history/{account_type}/{account_id}:
6746
+ get:
6747
+ tags:
6748
+ - balance_history
6749
+ summary: Get balance history for an account
6750
+ description: >-
6751
+ Retrieve historical balance entries for one manual, Plaid, manual crypto,
6752
+ or deleted account. Crypto synced accounts require an additional `symbol` path parameter.<br><br>
6753
+
6754
+ The `account_type` path parameter identifies the type of account and the
6755
+ `account_id` path parameter identifies the specific id for that account type.<br><br>
6756
+
6757
+ When `start_date` and `end_date` are both provided, they must be first-of-month
6758
+ dates. `start_date` must not be in the future, while `end_date` may be in the future.
6759
+ If one of `start_date` or `end_date` is provided, the other is required. If neither is
6760
+ provided, all available history for the source is returned.
6761
+ operationId: getBalanceHistoryForAccount
6762
+ parameters:
6763
+ - name: account_type
6764
+ in: path
6765
+ required: true
6766
+ description: Source family to retrieve. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
6767
+ schema:
6768
+ type: string
6769
+ enum: [manual, plaid, crypto_manual, deleted]
6770
+ - name: account_id
6771
+ in: path
6772
+ required: true
6773
+ description: Account or deleted-source identifier within the selected `account_type`.
6774
+ schema:
6775
+ type: integer
6776
+ format: int32
6777
+ - name: start_date
6778
+ in: query
6779
+ 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.
6780
+ required: false
6781
+ schema:
6782
+ type: string
6783
+ format: date
6784
+ - name: end_date
6785
+ in: query
6786
+ 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.
6787
+ required: false
6788
+ schema:
6789
+ type: string
6790
+ format: date
6791
+ responses:
6792
+ "200":
6793
+ description: Historical balance entries for the requested source
6794
+ content:
6795
+ application/json:
6796
+ schema:
6797
+ $ref: "#/components/schemas/balanceHistoryListResponseObject"
6798
+ examples:
6799
+ manual account history:
6800
+ value:
6801
+ balance_history:
6802
+ - source:
6803
+ type: manual
6804
+ manual_account_id: 119807
6805
+ balances:
6806
+ - id: 201
6807
+ date: "2026-01-01"
6808
+ balance: "41000.0000"
6809
+ currency: usd
6810
+ to_base: 41000
6811
+ crypto_balance: null
6812
+ - id: 202
6813
+ date: "2026-02-01"
6814
+ balance: "41211.8000"
6815
+ currency: usd
6816
+ to_base: 41211.8
6817
+ crypto_balance: null
6818
+ deleted account history:
6819
+ value:
6820
+ balance_history:
6821
+ - source:
6822
+ type: deleted
6823
+ deleted_account_id: 91
6824
+ name: Savings
6825
+ institution_name: Old Bank
6826
+ display_name: Closed Savings
6827
+ account_type: savings
6828
+ subtype: savings
6829
+ mask: "1234"
6830
+ symbol: null
6831
+ balances:
6832
+ - id: 501
6833
+ date: "2026-01-01"
6834
+ balance: "1250.0000"
6835
+ currency: usd
6836
+ to_base: 1250
6837
+ crypto_balance: null
6838
+ "400":
6839
+ description: Bad Request
6840
+ content:
6841
+ application/json:
6842
+ schema:
6843
+ $ref: "#/components/schemas/errorResponseObject"
6844
+ examples:
6845
+ missing paired date:
6846
+ value:
6847
+ message: Request Validation Failure
6848
+ errors:
6849
+ - errMsg: "`start_date` and `end_date` must either both be provided or both be omitted."
6850
+ invalid range:
6851
+ value:
6852
+ message: Request Validation Failure
6853
+ errors:
6854
+ - errMsg: "`start_date` must be before or equal to `end_date`."
6855
+ "401":
6856
+ $ref: "#/components/responses/unauthorizedToken"
6857
+ "404":
6858
+ description: Not Found
6859
+ content:
6860
+ application/json:
6861
+ schema:
6862
+ $ref: "#/components/schemas/errorResponseObject"
6863
+ examples:
6864
+ manual not found:
6865
+ value:
6866
+ message: Not Found
6867
+ errors:
6868
+ - errMsg: "There is no manual account with the id: 99999999."
6869
+ deleted not found:
6870
+ value:
6871
+ message: Not Found
6872
+ errors:
6873
+ - errMsg: "Deleted balance history source 99999999 was not found."
6874
+ "429":
6875
+ $ref: "#/components/responses/rateLimited"
6876
+ "500":
6877
+ $ref: "#/components/responses/serverError"
6878
+ put:
6879
+ tags:
6880
+ - balance_history
6881
+ summary: Upsert balance history for an account
6882
+ description: >-
6883
+ Upsert one or more historical balance entries for a single manual, Plaid,
6884
+ manual crypto, or deleted account. Crypto synced accounts require an additional `symbol` path parameter.<br><br>
6885
+
6886
+ The `account_type` path parameter identifies the type of account and the
6887
+ `account_id` path parameter identifies the specific id for that account type.<br><br>
6888
+
6889
+ Submit one or more entries in the `balances` array. Each entry must specify
6890
+ a `date` and `balance` value.<br><br>
6891
+
6892
+ Balance history is monthly. Each entry's `date` must be the first day of
6893
+ a month and must be in a past month.<br><br>
6894
+
6895
+ `currency` may be provided for any balance entry. If omitted, it defaults
6896
+ to the account currency for manual/Plaid accounts, or the user's primary
6897
+ currency for crypto/deleted accounts.<br><br>
6898
+
6899
+ `symbol` may only be set when `account_type` is `crypto_manual` or
6900
+ `crypto_synced`. It is optional for `crypto_manual` accounts and tolerated
6901
+ for `deleted` accounts.<br><br>
6902
+
6903
+ `crypto_balance` may be provided for `crypto_manual`, `crypto_synced`, and
6904
+ `deleted` accounts, and is invalid for `manual` or `plaid` accounts.<br><br>
6905
+
6906
+ The response contains only the balance entries that were submitted in this request.
6907
+ operationId: upsertBalanceHistoryForAccount
6908
+ parameters:
6909
+ - name: account_type
6910
+ in: path
6911
+ required: true
6912
+ description: Source family to update. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
6913
+ schema:
6914
+ type: string
6915
+ enum: [manual, plaid, crypto_manual, deleted]
6916
+ - name: account_id
6917
+ in: path
6918
+ required: true
6919
+ description: Account or deleted-source identifier within the selected `account_type`.
6920
+ schema:
6921
+ type: integer
6922
+ format: int32
6923
+ requestBody:
6924
+ required: true
6925
+ content:
6926
+ application/json:
6927
+ schema:
6928
+ $ref: "#/components/schemas/upsertBalanceHistoryRequestObject"
6929
+ examples:
6930
+ manual account bulk upsert:
6931
+ value:
6932
+ balances:
6933
+ - date: "2026-03-01"
6934
+ balance: "41500.0000"
6935
+ - date: "2026-04-01"
6936
+ balance: "41625.5000"
6937
+ crypto manual balance with symbol:
6938
+ value:
6939
+ balances:
6940
+ - date: "2026-03-01"
6941
+ balance: "56011.1200"
6942
+ symbol: btc
6943
+ crypto_balance: "0.852341920145782301"
6944
+ deleted account bulk upsert:
6945
+ value:
6946
+ balances:
6947
+ - date: "2026-03-01"
6948
+ symbol: btc
6949
+ crypto_balance: "0.020000000000000000"
6950
+ currency: usd
6951
+ balance: "1255"
6952
+ get-shaped balance entry input:
6953
+ value:
6954
+ balances:
6955
+ - id: 601
6956
+ date: "2026-03-01"
6957
+ balance: "41500.0000"
6958
+ currency: usd
6959
+ to_base: 41500
6960
+ crypto_balance: null
6961
+ responses:
6962
+ "200":
6963
+ description: Returns the modified balance entries only. Other historical
6964
+ entries for the account are omitted from `balances`.
6965
+ content:
6966
+ application/json:
6967
+ schema:
6968
+ $ref: "#/components/schemas/balanceHistoryAccountObject"
6969
+ examples:
6970
+ manual account bulk upsert:
6971
+ summary: Two upserted rows returned (not full account history)
6972
+ value:
6973
+ source:
6974
+ type: manual
6975
+ manual_account_id: 119807
6976
+ balances:
6977
+ - id: 601
6978
+ date: "2026-03-01"
6979
+ balance: "41500.0000"
6980
+ currency: usd
6981
+ to_base: 41500
6982
+ crypto_balance: null
6983
+ - id: 602
6984
+ date: "2026-04-01"
6985
+ balance: "41625.5000"
6986
+ currency: usd
6987
+ to_base: 41625.5
6988
+ crypto_balance: null
6989
+ crypto manual balance with symbol:
6990
+ summary: Single upserted row returned
6991
+ value:
6992
+ source:
6993
+ type: crypto_manual
6994
+ crypto_manual_id: 22001
6995
+ symbol: btc
6996
+ balances:
6997
+ - id: 603
6998
+ date: "2026-03-01"
6999
+ balance: "56011.1200"
7000
+ currency: usd
7001
+ to_base: 56011.12
7002
+ crypto_balance: "0.852341920145782301"
7003
+ deleted account bulk upsert:
7004
+ summary: Single upserted row returned
7005
+ value:
7006
+ source:
7007
+ type: deleted
7008
+ deleted_account_id: 91
7009
+ name: Savings
7010
+ institution_name: Old Bank
7011
+ display_name: Closed Savings
7012
+ account_type: savings
7013
+ subtype: savings
7014
+ mask: "1234"
7015
+ symbol: btc
7016
+ balances:
7017
+ - id: 504
7018
+ date: "2026-03-01"
7019
+ balance: "1255"
7020
+ currency: usd
7021
+ to_base: 1255
7022
+ crypto_balance: "0.020000000000000000"
7023
+ "400":
7024
+ description: Bad Request. The entire request is rejected if any row in
7025
+ `balances` fails validation; no rows are updated.
7026
+ content:
7027
+ application/json:
7028
+ schema:
7029
+ $ref: "#/components/schemas/errorResponseObject"
7030
+ examples:
7031
+ missing balances:
7032
+ value:
7033
+ message: Invalid Request Body
7034
+ errors:
7035
+ - errMsg: "Missing required property 'balances' in request body."
7036
+ empty balances array:
7037
+ value:
7038
+ message: Invalid Request Body
7039
+ errors:
7040
+ - errMsg: "Invalid value for property 'balances'. Array must contain at least 1 element(s)"
7041
+ invalid property:
7042
+ value:
7043
+ message: Invalid Request Body
7044
+ errors:
7045
+ - errMsg: "Invalid property 'foo' in request body."
7046
+ invalid date:
7047
+ value:
7048
+ message: Request Validation Failure
7049
+ errors:
7050
+ - errMsg: "`date` must be the first day of a month."
7051
+ request_balances_index: 0
7052
+ code: VALIDATION_ERROR
7053
+ future date:
7054
+ value:
7055
+ message: Request Validation Failure
7056
+ errors:
7057
+ - errMsg: "`date` must be in a past month."
7058
+ request_balances_index: 1
7059
+ crypto balance not allowed:
7060
+ value:
7061
+ message: Request Validation Failure
7062
+ errors:
7063
+ - errMsg: "`crypto_balance` may only be set when `account_type` is `crypto_manual`, `crypto_synced`, or `deleted`."
7064
+ request_balances_index: 0
7065
+ invalid row in bulk request:
7066
+ value:
7067
+ message: Request Validation Failure
7068
+ errors:
7069
+ - errMsg: "`symbol` may only be set when `account_type` is `crypto_manual` or `crypto_synced`."
7070
+ request_balances_index: 1
7071
+ "401":
7072
+ $ref: "#/components/responses/unauthorizedToken"
7073
+ "404":
7074
+ description: Not Found
7075
+ content:
7076
+ application/json:
7077
+ schema:
7078
+ $ref: "#/components/schemas/errorResponseObject"
7079
+ example:
7080
+ message: Not Found
7081
+ errors:
7082
+ - errMsg: "There is no manual account with the id: 99999999."
7083
+ "429":
7084
+ $ref: "#/components/responses/rateLimited"
7085
+ "500":
7086
+ $ref: "#/components/responses/serverError"
7087
+ delete:
7088
+ tags:
7089
+ - balance_history
7090
+ summary: Delete all balance history for an account
7091
+ description: >-
7092
+ Delete all historical balance entries for a single manual, Plaid,
7093
+ manual crypto, or deleted account. Crypto synced accounts require an additional `symbol` path parameter.
7094
+ operationId: deleteBalanceHistoryForAccount
7095
+ parameters:
7096
+ - name: account_type
7097
+ in: path
7098
+ required: true
7099
+ description: Source family to delete. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
7100
+ schema:
7101
+ type: string
7102
+ enum: [manual, plaid, crypto_manual, deleted]
7103
+ - name: account_id
7104
+ in: path
7105
+ required: true
7106
+ description: Account or deleted-source identifier within the selected `account_type`.
7107
+ schema:
7108
+ type: integer
7109
+ format: int32
7110
+ responses:
7111
+ "204":
7112
+ description: All history for the account/source was deleted
7113
+ "401":
7114
+ $ref: "#/components/responses/unauthorizedToken"
7115
+ "404":
7116
+ description: Not Found
7117
+ content:
7118
+ application/json:
7119
+ schema:
7120
+ $ref: "#/components/schemas/errorResponseObject"
7121
+ examples:
7122
+ source not found:
7123
+ value:
7124
+ message: Not Found
7125
+ errors:
7126
+ - errMsg: "There is no manual account with the id: 99999999."
7127
+ "429":
7128
+ $ref: "#/components/responses/rateLimited"
7129
+ "500":
7130
+ $ref: "#/components/responses/serverError"
7131
+ /balance_history/crypto_synced/{account_id}/{symbol}:
7132
+ get:
7133
+ tags:
7134
+ - balance_history
7135
+ summary: Get balance history for a synced crypto symbol
7136
+ description: >-
7137
+ Retrieve historical balance entries for a single synced crypto symbol stream.<br><br>
7138
+
7139
+ Use the `crypto_synced` account id together with a `symbol` path parameter
7140
+ to select one balance stream within that synced crypto account.<br><br>
7141
+
7142
+ When `start_date` and `end_date` are both provided, they must be first-of-month
7143
+ dates. `start_date` must not be in the future, while `end_date` may be in the future.
7144
+ If one of `start_date` or `end_date` is provided, the other is required. If neither is
7145
+ provided, all available history for the symbol stream is returned.
7146
+ operationId: getBalanceHistoryForCryptoSynced
7147
+ parameters:
7148
+ - name: account_id
7149
+ in: path
7150
+ required: true
7151
+ description: Synced crypto account identifier.
7152
+ schema:
7153
+ type: integer
7154
+ format: int32
7155
+ - name: symbol
7156
+ in: path
7157
+ required: true
7158
+ description: Crypto symbol identifying one balance stream within the synced crypto account.
7159
+ schema:
7160
+ type: string
7161
+ minLength: 1
7162
+ maxLength: 25
7163
+ - name: start_date
7164
+ in: query
7165
+ 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.
7166
+ required: false
7167
+ schema:
7168
+ type: string
7169
+ format: date
7170
+ - name: end_date
7171
+ in: query
7172
+ 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.
7173
+ required: false
7174
+ schema:
7175
+ type: string
7176
+ format: date
7177
+ responses:
7178
+ "200":
7179
+ description: Historical balance entries for the synced crypto symbol stream
5954
7180
  content:
5955
7181
  application/json:
5956
7182
  schema:
5957
- $ref: "#/components/schemas/syncedCryptoAccount"
7183
+ $ref: "#/components/schemas/balanceHistoryListResponseObject"
5958
7184
  example:
5959
- id: 33004
5960
- provider: coinbase
5961
- status: active
5962
- created_by_name: User 1
5963
- created_at: "2025-10-02T11:02:09.000Z"
5964
- updated_at: "2026-02-25T14:25:01.000Z"
5965
- display_name: Coinbase Main
5966
- balances:
5967
- - name: ETH
5968
- balance: "12.004500000000000000"
5969
- symbol: eth
5970
- coingecko_id: ethereum
5971
- to_base: 28998.44
5972
- balance_as_of: "2026-02-25T14:25:00.000Z"
5973
- exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
5974
- updated_at: "2026-02-25T14:25:01.000Z"
5975
- - name: BTC
5976
- balance: "0.100020003000400050"
5977
- symbol: btc
5978
- coingecko_id: bitcoin
5979
- to_base: 6231.28
5980
- balance_as_of: "2026-02-25T14:25:00.000Z"
5981
- exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
5982
- updated_at: "2026-02-25T14:25:01.000Z"
7185
+ balance_history:
7186
+ - source:
7187
+ type: crypto_synced
7188
+ crypto_synced_id: 33004
7189
+ symbol: btc
7190
+ balances:
7191
+ - id: 401
7192
+ date: "2026-02-01"
7193
+ balance: "6231.2800"
7194
+ currency: usd
7195
+ to_base: 6231.28
7196
+ crypto_balance: "0.100020003000400050"
5983
7197
  "400":
5984
7198
  description: Bad Request
5985
7199
  content:
5986
7200
  application/json:
5987
7201
  schema:
5988
7202
  $ref: "#/components/schemas/errorResponseObject"
5989
- example:
5990
- message: Invalid Path Parameters
5991
- errors:
5992
- - errMsg: "Invalid value type for path parameter: 'id'. Expected 'number', received 'string'."
7203
+ examples:
7204
+ missing paired date:
7205
+ value:
7206
+ message: Request Validation Failure
7207
+ errors:
7208
+ - errMsg: "`start_date` and `end_date` must either both be provided or both be omitted."
7209
+ invalid range:
7210
+ value:
7211
+ message: Request Validation Failure
7212
+ errors:
7213
+ - errMsg: "`start_date` must be before or equal to `end_date`."
5993
7214
  "401":
5994
7215
  $ref: "#/components/responses/unauthorizedToken"
5995
7216
  "404":
@@ -5998,71 +7219,151 @@ paths:
5998
7219
  application/json:
5999
7220
  schema:
6000
7221
  $ref: "#/components/schemas/errorResponseObject"
6001
- example:
6002
- message: Not Found
6003
- errors:
6004
- - errMsg: "There is no synced crypto account with the id: 99999999."
7222
+ examples:
7223
+ source not found:
7224
+ value:
7225
+ message: Not Found
7226
+ errors:
7227
+ - errMsg: "There is no synced crypto account with the id: 99999999."
7228
+ symbol not found:
7229
+ value:
7230
+ message: Not Found
7231
+ errors:
7232
+ - errMsg: "There is no balance history for symbol 'doge' on this account."
6005
7233
  "429":
6006
7234
  $ref: "#/components/responses/rateLimited"
6007
7235
  "500":
6008
7236
  $ref: "#/components/responses/serverError"
6009
- /crypto/synced/{id}/{symbol}:
6010
- get:
7237
+ put:
6011
7238
  tags:
6012
- - crypto-synced
6013
- summary: Get a synced crypto balance by symbol
6014
- description: Retrieves a single balance from the specified synced crypto
6015
- account using the crypto symbol.
6016
- operationId: getCryptoSyncedBalanceBySymbol
7239
+ - balance_history
7240
+ summary: Upsert balance history for a synced crypto symbol
7241
+ description: >-
7242
+ Upsert one or more historical balance entries for a single synced crypto
7243
+ symbol stream.<br><br>
7244
+
7245
+ The path identifies both the synced crypto account and the symbol being updated.<br><br>
7246
+
7247
+ Submit one or more entries in the `balances` array. Each entry must specify
7248
+ a `date` and `balance` value.<br><br>
7249
+
7250
+ Balance history is monthly. Each entry's `date` must be the first day of
7251
+ a month and must be in a past month.<br><br>
7252
+
7253
+ The request body may include an optional `symbol` on each balance entry. If
7254
+ provided, it must match the `symbol` path parameter. Omit `symbol` to use
7255
+ the path value.<br><br>
7256
+
7257
+ `currency` may be provided for any balance entry. If omitted, it defaults
7258
+ to the user's primary currency for synced crypto balances.<br><br>
7259
+
7260
+ `crypto_balance` may be provided for synced crypto balances.<br><br>
7261
+
7262
+ The response contains only the balance entries that were submitted in this request.
7263
+ operationId: upsertBalanceHistoryForCryptoSynced
6017
7264
  parameters:
6018
- - name: id
7265
+ - name: account_id
6019
7266
  in: path
6020
- description: Synced crypto account ID
6021
7267
  required: true
7268
+ description: Synced crypto account identifier to update.
6022
7269
  schema:
6023
7270
  type: integer
6024
7271
  format: int32
6025
7272
  - name: symbol
6026
7273
  in: path
6027
- description: Crypto symbol within the synced account
6028
7274
  required: true
7275
+ description: Crypto symbol identifying one balance stream within the synced crypto account.
6029
7276
  schema:
6030
7277
  type: string
6031
7278
  minLength: 1
6032
7279
  maxLength: 25
7280
+ requestBody:
7281
+ required: true
7282
+ content:
7283
+ application/json:
7284
+ schema:
7285
+ $ref: "#/components/schemas/upsertBalanceHistoryRequestObject"
7286
+ examples:
7287
+ synced crypto bulk upsert:
7288
+ value:
7289
+ balances:
7290
+ - date: "2026-03-01"
7291
+ balance: "6400.0000"
7292
+ crypto_balance: "0.100020003000400050"
7293
+ - date: "2026-04-01"
7294
+ balance: "6500.0000"
7295
+ crypto_balance: "0.100020003000400050"
6033
7296
  responses:
6034
7297
  "200":
6035
- description: Synced crypto balance object
7298
+ description: Returns the modified balance entries only. Other historical
7299
+ entries for the symbol stream are omitted from `balances`.
6036
7300
  content:
6037
7301
  application/json:
6038
7302
  schema:
6039
- $ref: "#/components/schemas/cryptoSyncedBalance"
6040
- example:
6041
- name: ETH
6042
- balance: "12.004500000000000000"
6043
- symbol: eth
6044
- coingecko_id: ethereum
6045
- to_base: 28998.44
6046
- balance_as_of: "2026-02-25T14:25:00.000Z"
6047
- exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6048
- updated_at: "2026-02-25T14:25:01.000Z"
7303
+ $ref: "#/components/schemas/balanceHistoryAccountObject"
7304
+ examples:
7305
+ synced crypto bulk upsert:
7306
+ summary: Two upserted rows returned (not full symbol history)
7307
+ value:
7308
+ source:
7309
+ type: crypto_synced
7310
+ crypto_synced_id: 33004
7311
+ symbol: btc
7312
+ balances:
7313
+ - id: 604
7314
+ date: "2026-03-01"
7315
+ balance: "6400.0000"
7316
+ currency: usd
7317
+ to_base: 6400
7318
+ crypto_balance: "0.100020003000400050"
7319
+ - id: 605
7320
+ date: "2026-04-01"
7321
+ balance: "6500.0000"
7322
+ currency: usd
7323
+ to_base: 6500
7324
+ crypto_balance: "0.100020003000400050"
6049
7325
  "400":
6050
- description: Bad Request
7326
+ description: Bad Request. The entire request is rejected if any row in
7327
+ `balances` fails validation; no rows are updated.
6051
7328
  content:
6052
7329
  application/json:
6053
7330
  schema:
6054
7331
  $ref: "#/components/schemas/errorResponseObject"
6055
7332
  examples:
6056
- invalid id:
7333
+ missing balances:
6057
7334
  value:
6058
- message: Invalid Path Parameters
7335
+ message: Invalid Request Body
6059
7336
  errors:
6060
- - errMsg: "Invalid value type for path parameter: 'id'. Expected 'number', received 'string'."
6061
- invalid symbol:
7337
+ - errMsg: "Missing required property 'balances' in request body."
7338
+ empty balances array:
6062
7339
  value:
6063
- message: Invalid Path Parameters
7340
+ message: Invalid Request Body
6064
7341
  errors:
6065
- - errMsg: "Value for path parameter 'symbol' must not be empty."
7342
+ - errMsg: "Invalid value for property 'balances'. Array must contain at least 1 element(s)"
7343
+ invalid date:
7344
+ value:
7345
+ message: Request Validation Failure
7346
+ errors:
7347
+ - errMsg: "`date` must be the first day of a month."
7348
+ request_balances_index: 0
7349
+ future date:
7350
+ value:
7351
+ message: Request Validation Failure
7352
+ errors:
7353
+ - errMsg: "`date` must be in a past month."
7354
+ request_balances_index: 1
7355
+ symbol mismatch:
7356
+ value:
7357
+ message: Request Validation Failure
7358
+ errors:
7359
+ - errMsg: "`symbol` in request body (doge) does not match the path symbol (eth)."
7360
+ request_balances_index: 0
7361
+ invalid row in bulk request:
7362
+ value:
7363
+ message: Request Validation Failure
7364
+ errors:
7365
+ - errMsg: "`balance` must be a valid numeric string or number."
7366
+ request_balances_index: 1
6066
7367
  "401":
6067
7368
  $ref: "#/components/responses/unauthorizedToken"
6068
7369
  "404":
@@ -6072,7 +7373,7 @@ paths:
6072
7373
  schema:
6073
7374
  $ref: "#/components/schemas/errorResponseObject"
6074
7375
  examples:
6075
- account not found:
7376
+ source not found:
6076
7377
  value:
6077
7378
  message: Not Found
6078
7379
  errors:
@@ -6081,65 +7382,160 @@ paths:
6081
7382
  value:
6082
7383
  message: Not Found
6083
7384
  errors:
6084
- - errMsg: "There is no synced crypto balance with symbol 'doge' for the crypto account with id: 33004."
7385
+ - errMsg: "There is no balance history for symbol 'doge' on this account."
6085
7386
  "429":
6086
7387
  $ref: "#/components/responses/rateLimited"
6087
7388
  "500":
6088
7389
  $ref: "#/components/responses/serverError"
6089
- /crypto/synced/{id}/refresh:
6090
- post:
7390
+ delete:
6091
7391
  tags:
6092
- - crypto-synced
6093
- summary: Refresh balances for a synced crypto account
6094
- description: Trigger a balance refresh for the specified synced crypto
6095
- account. Returns the refreshed synced crypto account.
6096
- operationId: refreshCryptoSynced
7392
+ - balance_history
7393
+ summary: Delete all balance history for a synced crypto symbol
7394
+ description: >-
7395
+ Delete all historical balance entries for a single synced crypto symbol stream.<br><br>
7396
+
7397
+ The path identifies both the synced crypto account and the symbol whose
7398
+ history should be deleted.
7399
+ operationId: deleteBalanceHistoryForCryptoSynced
7400
+ parameters:
7401
+ - name: account_id
7402
+ in: path
7403
+ required: true
7404
+ description: Synced crypto account identifier.
7405
+ schema:
7406
+ type: integer
7407
+ format: int32
7408
+ - name: symbol
7409
+ in: path
7410
+ required: true
7411
+ description: Crypto symbol identifying one balance stream within the synced crypto account.
7412
+ schema:
7413
+ type: string
7414
+ minLength: 1
7415
+ maxLength: 25
7416
+ responses:
7417
+ "204":
7418
+ description: All history for the synced crypto symbol stream was deleted
7419
+ "401":
7420
+ $ref: "#/components/responses/unauthorizedToken"
7421
+ "404":
7422
+ description: Not Found
7423
+ content:
7424
+ application/json:
7425
+ schema:
7426
+ $ref: "#/components/schemas/errorResponseObject"
7427
+ example:
7428
+ message: Not Found
7429
+ errors:
7430
+ - errMsg: "There is no balance history for symbol 'doge' on this account."
7431
+ "429":
7432
+ $ref: "#/components/responses/rateLimited"
7433
+ "500":
7434
+ $ref: "#/components/responses/serverError"
7435
+ /balance_history/entries/{id}:
7436
+ delete:
7437
+ tags:
7438
+ - balance_history
7439
+ summary: Delete a balance history entry
7440
+ description: >-
7441
+ Delete a single monthly balance history entry by its id.
7442
+ operationId: deleteBalanceHistoryEntry
6097
7443
  parameters:
6098
7444
  - name: id
6099
7445
  in: path
6100
- description: Synced crypto account ID
6101
7446
  required: true
7447
+ description: Balance history row identifier to delete.
6102
7448
  schema:
6103
7449
  type: integer
6104
7450
  format: int32
6105
- examples:
6106
- existing synced connection:
6107
- summary: Existing synced account ID
6108
- value: 33004
6109
- id not found:
6110
- summary: Example of an id that doesn't exist
6111
- value: 99999999
7451
+ responses:
7452
+ "204":
7453
+ description: The balance history entry was deleted
7454
+ "400":
7455
+ description: Bad Request
7456
+ content:
7457
+ application/json:
7458
+ schema:
7459
+ $ref: "#/components/schemas/errorResponseObject"
7460
+ example:
7461
+ message: Request Validation Failure
7462
+ errors:
7463
+ - errMsg: "Invalid value type for path parameter: 'id'. Expected 'number', received 'string'."
7464
+ "401":
7465
+ $ref: "#/components/responses/unauthorizedToken"
7466
+ "404":
7467
+ description: Not Found
7468
+ content:
7469
+ application/json:
7470
+ schema:
7471
+ $ref: "#/components/schemas/errorResponseObject"
7472
+ example:
7473
+ message: Not Found
7474
+ errors:
7475
+ - errMsg: "There is no balance history entry with the id: 99999999."
7476
+ "429":
7477
+ $ref: "#/components/responses/rateLimited"
7478
+ "500":
7479
+ $ref: "#/components/responses/serverError"
7480
+ /balance_history/deleted/{account_id}/details:
7481
+ put:
7482
+ tags:
7483
+ - balance_history
7484
+ summary: Update details for a deleted account
7485
+ description: >-
7486
+ Update archived metadata for a deleted balance history source.<br><br>
7487
+
7488
+ Pass the `deleted` source id returned on `source.deleted_account_id`.
7489
+ This endpoint updates the stored deleted-source metadata used for all
7490
+ historical entries associated with that deleted source.
7491
+ operationId: updateBalanceHistoryDetails
7492
+ parameters:
7493
+ - name: account_id
7494
+ in: path
7495
+ required: true
7496
+ description: Deleted account history source identifier to update.
7497
+ schema:
7498
+ type: integer
7499
+ format: int32
7500
+ requestBody:
7501
+ required: true
7502
+ content:
7503
+ application/json:
7504
+ schema:
7505
+ $ref: "#/components/schemas/updateBalanceHistoryDetailsRequestObject"
7506
+ examples:
7507
+ update deleted source details:
7508
+ value:
7509
+ name: Savings
7510
+ institution_name: Old Bank
7511
+ display_name: Old Savings Account
7512
+ account_type: savings
7513
+ subtype: savings
7514
+ mask: "1234"
6112
7515
  responses:
6113
7516
  "200":
6114
- description: Refreshed synced crypto account
7517
+ description: Updated deleted source details
6115
7518
  content:
6116
7519
  application/json:
6117
7520
  schema:
6118
- $ref: "#/components/schemas/syncedCryptoAccount"
7521
+ $ref: "#/components/schemas/updateBalanceHistoryDetailsResponseObject"
6119
7522
  example:
6120
- id: 33004
6121
- provider: coinbase
6122
- status: active
6123
- created_by_name: User 1
6124
- created_at: "2025-10-02T11:02:09.000Z"
6125
- display_name: Coinbase Main
6126
- balances:
6127
- - name: ETH
6128
- balance: "12.004500000000000000"
6129
- symbol: eth
6130
- coingecko_id: ethereum
6131
- to_base: 28998.44
6132
- balance_as_of: "2026-02-25T14:25:00.000Z"
6133
- exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6134
- updated_at: "2026-02-25T14:25:01.000Z"
6135
- - name: BTC
6136
- balance: "0.100020003000400050"
6137
- symbol: btc
6138
- coingecko_id: bitcoin
6139
- to_base: 6231.28
6140
- balance_as_of: "2026-02-25T14:25:00.000Z"
6141
- exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6142
- updated_at: "2026-02-25T14:25:01.000Z"
7523
+ name: Savings
7524
+ institution_name: Old Bank
7525
+ display_name: Old Savings Account
7526
+ account_type: savings
7527
+ subtype: savings
7528
+ mask: "1234"
7529
+ "400":
7530
+ description: Bad Request
7531
+ content:
7532
+ application/json:
7533
+ schema:
7534
+ $ref: "#/components/schemas/errorResponseObject"
7535
+ example:
7536
+ message: Invalid Request Body
7537
+ errors:
7538
+ - errMsg: "At least one property must be provided: name, institution_name, display_name, account_type, subtype, mask."
6143
7539
  "401":
6144
7540
  $ref: "#/components/responses/unauthorizedToken"
6145
7541
  "404":
@@ -6151,7 +7547,7 @@ paths:
6151
7547
  example:
6152
7548
  message: Not Found
6153
7549
  errors:
6154
- - errMsg: "There is no synced crypto account with the id: 99999999."
7550
+ - errMsg: "Deleted balance history source 99999999 was not found."
6155
7551
  "429":
6156
7552
  $ref: "#/components/responses/rateLimited"
6157
7553
  "500":
@@ -7165,19 +8561,19 @@ paths:
7165
8561
  description: Sets the maximum number of transactions to return. If
7166
8562
  more match the filter criteria, the response will include a
7167
8563
  `has_more` attribute set to `true`. See
7168
- [Pagination](https://alpha.lunchmoney.dev/v2/pagination)
8564
+ [Pagination](https://lunchmoney.dev/v2/pagination)
7169
8565
  - name: offset
7170
8566
  in: query
7171
8567
  schema:
7172
8568
  type: integer
7173
8569
  description: Sets the offset for the records returned. This is
7174
8570
  typically set automatically in the header. See
7175
- [Pagination](https://alpha.lunchmoney.dev/v2/pagination)
8571
+ [Pagination](https://lunchmoney.dev/v2/pagination)
7176
8572
  responses:
7177
8573
  "200":
7178
8574
  description: Returns an array of transactions. <br><br>The `has_more`
7179
8575
  property is set to `true` if more transactions are available. See
7180
- [Pagination](https://alpha.lunchmoney.dev/v2/pagination)
8576
+ [Pagination](https://lunchmoney.dev/v2/pagination)
7181
8577
  content:
7182
8578
  application/json:
7183
8579
  schema:
@@ -8843,6 +10239,7 @@ paths:
8843
10239
  description: |
8844
10240
  The payee for the new grouped transaction.
8845
10241
  minLength: 0
10242
+
8846
10243
  category_id:
8847
10244
  type: integer
8848
10245
  format: int64
@@ -8857,8 +10254,6 @@ paths:
8857
10254
  nullable: true
8858
10255
  description: |
8859
10256
  Notes for the grouped transaction.
8860
- minLength: 0
8861
- maxLength: 350
8862
10257
  status:
8863
10258
  type: string
8864
10259
  description: If set, must be either `reviewed` or
@@ -10221,12 +11616,15 @@ paths:
10221
11616
  get:
10222
11617
  tags:
10223
11618
  - budgets
10224
- summary: Get budget settings
10225
- description: Returns the budget-related settings for the user's account.
11619
+ summary: Get budget period settings
11620
+ description: |-
11621
+ Returns budget period and display settings for the budget
11622
+ associated with this API token.<p> These control how budget **periods** are calculated
11623
+ (granularity, anchor date, rollover, and related options).
10226
11624
  operationId: getBudgetSettings
10227
11625
  responses:
10228
11626
  "200":
10229
- description: Budget settings for the account
11627
+ description: Budget period settings for the current budget
10230
11628
  content:
10231
11629
  application/json:
10232
11630
  schema:
@@ -10249,7 +11647,7 @@ paths:
10249
11647
  Note that `start_date` **must** be a valid budget period start for the account (based on the account's
10250
11648
  budget period settings). If an invalid `start_date` is provided, the request will fail with an error that indicates what the previous and next valid start dates are.<p>
10251
11649
 
10252
- Use the [budgets/settings](#tag/budgets/GET/budgets/settings) endpoint to view the account's budget settings.<br>
11650
+ Use the [/budgets/settings](#tag/budgets/GET/budgets/settings) endpoint to view the budget period settings for the account.<br>
10253
11651
  To view details for existing budgets, use the [summary](#tag/summary) endpoint.
10254
11652
  operationId: upsertBudget
10255
11653
  requestBody:
@@ -10320,7 +11718,7 @@ paths:
10320
11718
  period settings). If an invalid `start_date` is provided, the request
10321
11719
  will fail with an error that indicates what the previous and next valid
10322
11720
  start dates are.<p> Use the
10323
- [budgets/settings](#tag/budgets/GET/budgets/settings) endpoint to view
11721
+ [/budgets/settings](#tag/budgets/GET/budgets/settings) endpoint to view
10324
11722
  the account's budget settings.<br> To view details for existing budgets,
10325
11723
  use the [summary](#tag/summary) endpoint.
10326
11724
  operationId: deleteBudget