@lunch-money/v2-api-spec 2.11.0-preview.2 → 2.11.0-preview.20

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,50 +2,40 @@ openapi: 3.0.2
2
2
  info:
3
3
  title: Lunch Money API - v2
4
4
  description: |-
5
- Welcome to the documentation for the "next version" of the Lunch Money v2 API.This documentation includes proposed updates to the API design that have not yet been released.<p>
6
- This documentation is for the **v2.11.0** release of the API.<p>
7
-
8
- See the [version history](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/version-history) for what is new in this release.
9
- New functionality may only be available in the Mock Service until the release is finalized. <br><br>
10
-
11
- The latest complete implementation of the spec is for the **v2.8.5** release and can be found [here](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/). <br><br>
12
- Feedback on any of the API design is welcome, but we are particularly interested in getting feedback on most recent changes in the [version history](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/version-history).
13
-
14
- ------------------------------------------------------------------------------------------------
15
- Welcome to the Lunch Money v2 API.
5
+ ### Introduction
16
6
 
17
- A working version of this API is now available through these docs, or directly at:
7
+ Welcome to the Lunch Money v2 API reference. This is the **v2.11.0** spec.
18
8
 
19
- `https://api.lunchmoney.dev/v2`
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).
20
10
 
21
- <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
22
- 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>
23
- See the [Getting Started Guide](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/getting-started) for more information on using a test budget.<p>
11
+
12
+ **Try it from these docs**
24
13
 
25
- If you are new to the v2 API, you may wish to review the [v2 API Overview of Changes](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/changelog).
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**
26
20
 
27
- ### Static Mock Server
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
+
28
24
 
29
- You may also use these docs to explore the API using a static mock server endpoint.<p>
30
- 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>
31
- 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>
32
- When using this server, set your Bearer token to any string with 11 or more characters.
25
+ **Client Libraries & SDKs**
33
26
 
34
- ### Migrating from V1
27
+ An official TypeScript SDK is available on [NPM](https://www.npmjs.com/package/@lunch-money/v2-api-spec) and [GitHub](https://github.com/lunch-money/lunch-money-js-v2). For Python or other languages, see [lunchmoney-clients](https://github.com/juftin/lunchmoney-clients) or generate a client from [this OpenAPI spec](/v2/openapi).
35
28
 
36
- The v2 API is NOT backwards compatible with the v1 API. We encourage developers to review the [Migration Guide](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/migration-guide) to understand the changes and plan their migration.
29
+ **Migrating from v1**
37
30
 
38
- ### Acknowledgments
31
+ The v2 API is not backwards compatible with v1. See the [Migration Guide](https://lunchmoney.dev/v2/migration-guide) for details.
39
32
 
40
- 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.
41
-
42
- ### Useful links:
43
- - [Getting Started](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/getting-started)
44
- - [v2 API Changelog](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/changelog)
45
- - [Migration Guide](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/migration-guide)
46
- - [Rate Limits](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/rate-limits)
47
- - [Current v1 Lunch Money API Documentation](https://lunchmoney.dev)
48
- - [Awesome Lunch Money Projects](https://github.com/lunch-money/awesome-lunchmoney?tab=readme-ov-file)
33
+ **Useful links**
34
+ - [Getting Started Guide](https://lunchmoney.dev/v2/getting-started)
35
+ - [v2 API Overview](https://lunchmoney.dev/v2/overview)
36
+ - [Version History](https://lunchmoney.dev/v2/version-history)
37
+ - [Migration Guide](https://lunchmoney.dev/v2/migration-guide)
38
+ - [Rate Limits](https://lunchmoney.dev/v2/rate-limits)
49
39
  termsOfService: https://lunchmoney.dev/#current-status
50
40
  contact:
51
41
  email: devsupport@lunchmoney.app
@@ -56,10 +46,9 @@ info:
56
46
 
57
47
  servers:
58
48
  - url: https://api.lunchmoney.dev/v2
59
- description: v2 Lunch Money API Server - changes will affect real data!
60
- # - url: https://mock.lunchmoney.dev/v2
61
- - url: https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/
62
- 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
63
52
 
64
53
  tags:
65
54
  - name: me
@@ -90,7 +79,11 @@ tags:
90
79
  description: Learn more about crypto assets
91
80
  url: https://support.lunchmoney.app/setup/crypto
92
81
  - name: balance_history
93
- 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.
82
+ description: >-
83
+ View and update monthly account balances used by the
84
+ [Net Worth](https://my.lunchmoney.app/net-worth) views in the Lunch Money app.
85
+ History is monthly. The current month may be calculated on demand when
86
+ requested.
94
87
  - name: recurring_items
95
88
  description: Work with recurring items
96
89
  externalDocs:
@@ -126,8 +119,10 @@ tags:
126
119
  description: Learn more about transactions
127
120
  url: https://support.lunchmoney.app/finances/transactions
128
121
  - name: budgets
129
- description: View settings and modify budget amounts.<p> Use the
130
- [/summary](#tag/summary) endpoint to view the budget details performance.
122
+ description: View settings and modify budget amounts.<p> Use
123
+ [/budgets/settings](#tag/budgets/GET/budgets/settings) to view budget
124
+ period settings.<p> Use the [/summary](#tag/summary) endpoint to view
125
+ the budget details performance.
131
126
  externalDocs:
132
127
  description: Learn more about budgets
133
128
  url: https://support.lunchmoney.app/finances/budgets
@@ -155,12 +150,12 @@ components:
155
150
  account_id:
156
151
  type: integer
157
152
  format: int64
158
- description: Unique ID for the linked budgeting account
153
+ description: Unique ID for the current budgeting account
159
154
  budget_name:
160
155
  type: string
161
- description: Name of the linked budgeting account
156
+ description: Name of the current budgeting account
162
157
  primary_currency:
163
- description: Primary currency set in the user's settings
158
+ description: Primary currency for the current budgeting account
164
159
  allOf:
165
160
  - $ref: "#/components/schemas/currencyEnum"
166
161
  api_key_label:
@@ -679,7 +674,6 @@ components:
679
674
  cryptoManualObject:
680
675
  type: object
681
676
  title: manual crypto object
682
- x-internal: true
683
677
  additionalProperties: false
684
678
  properties:
685
679
  id:
@@ -719,13 +713,22 @@ components:
719
713
  description: CoinGecko identifier associated with this balance
720
714
  to_base:
721
715
  type: number
722
- description: Balance converted to the user's primary currency
716
+ nullable: true
717
+ description: Balance converted to the user's primary currency. May be null if no conversion was available.
723
718
  balance_as_of:
724
719
  type: string
725
720
  format: date-time
726
721
  nullable: true
727
- description: Date/time the balance was last updated in ISO 8601
728
- extended format
722
+ description: Date/time the manual balance record was last updated in
723
+ ISO 8601 extended format. This is currently based on the manual
724
+ crypto record's updated_at timestamp.
725
+ exchange_rate_as_of:
726
+ type: string
727
+ format: date-time
728
+ nullable: true
729
+ description: Date/time the exchange rate used to calculate to_base was
730
+ last updated in ISO 8601 extended format. Null when no exchange rate was
731
+ used or no conversion was available.
729
732
  created_by_name:
730
733
  type: string
731
734
  nullable: true
@@ -750,6 +753,7 @@ components:
750
753
  - coingecko_id
751
754
  - to_base
752
755
  - balance_as_of
756
+ - exchange_rate_as_of
753
757
  - created_by_name
754
758
  - created_at
755
759
  - updated_at
@@ -758,14 +762,18 @@ components:
758
762
  cryptoSyncedBalance:
759
763
  type: object
760
764
  title: synced crypto balance object
761
- x-internal: true
762
765
  additionalProperties: false
763
766
  properties:
764
767
  name:
765
768
  type: string
766
769
  minLength: 1
767
770
  maxLength: 45
768
- description: The name of the crypto asset
771
+ description: The asset name for this balance, typically the uppercased currency symbol (e.g. ETH).
772
+ display_name:
773
+ type: string
774
+ nullable: true
775
+ description: Optional display name for the synced crypto asset as set by the user. If `null`,
776
+ clients may derive a display name from syncedCryptoAccount's `provider` + `name`.
769
777
  balance:
770
778
  type: string
771
779
  pattern: ^-?\d+(\.\d{1,18})?$
@@ -783,13 +791,21 @@ components:
783
791
  description: CoinGecko identifier associated with this balance
784
792
  to_base:
785
793
  type: number
786
- description: Balance converted to the user's primary currency
794
+ nullable: true
795
+ description: Balance converted to the user's primary currency. May be null if no conversion was available.
787
796
  balance_as_of:
788
797
  type: string
789
798
  format: date-time
790
799
  nullable: true
791
800
  description: Date/time the balance was last updated in ISO 8601
792
- extended format
801
+ extended format.
802
+ exchange_rate_as_of:
803
+ type: string
804
+ format: date-time
805
+ nullable: true
806
+ description: Date/time the exchange rate used to calculate to_base was
807
+ last updated in ISO 8601 extended format. Null when no exchange rate was
808
+ used or no conversion was available.
793
809
  updated_at:
794
810
  type: string
795
811
  format: date-time
@@ -797,17 +813,18 @@ components:
797
813
  extended format
798
814
  required:
799
815
  - name
816
+ - display_name
800
817
  - balance
801
818
  - symbol
802
819
  - coingecko_id
803
820
  - to_base
804
821
  - balance_as_of
822
+ - exchange_rate_as_of
805
823
  - updated_at
806
824
 
807
825
  syncedCryptoAccount:
808
826
  type: object
809
827
  title: synced crypto account
810
- x-internal: true
811
828
  additionalProperties: false
812
829
  properties:
813
830
  id:
@@ -974,16 +991,19 @@ components:
974
991
  example: Cold Wallet BTC
975
992
  display_name:
976
993
  type: string
994
+ nullable: true
977
995
  minLength: 1
978
996
  maxLength: 45
979
- description: Optional display name for the manual crypto asset. If
980
- omitted, clients may derive one from `institution_name` + `name`.
997
+ description: Display name for the manual crypto asset. If omitted or
998
+ `null`, clients may derive one from `institution_name` + `name`.
981
999
  example: Cold Storage
982
1000
  institution_name:
983
1001
  type: string
1002
+ nullable: true
984
1003
  minLength: 1
985
1004
  maxLength: 50
986
- description: Optional institution or wallet provider display name
1005
+ description: Institution or wallet provider display name. If omitted
1006
+ or `null`, no institution name is set.
987
1007
  example: Ledger
988
1008
  balance:
989
1009
  oneOf:
@@ -1072,8 +1092,16 @@ components:
1072
1092
  type: string
1073
1093
  format: date-time
1074
1094
  nullable: true
1075
- description: System defined date/time the balance was last updated in
1076
- ISO 8601 extended format. Ignored if set
1095
+ description: System defined date/time the manual balance record was
1096
+ last updated in ISO 8601 extended format. Ignored if set
1097
+ x-updatable: false
1098
+ exchange_rate_as_of:
1099
+ type: string
1100
+ format: date-time
1101
+ nullable: true
1102
+ description: System defined date/time the exchange rate used to
1103
+ calculate to_base was observed in ISO 8601 extended format. Ignored
1104
+ if set
1077
1105
  x-updatable: false
1078
1106
  created_by_name:
1079
1107
  type: string
@@ -1231,15 +1259,19 @@ components:
1231
1259
  example: My Savings Account
1232
1260
  institution_name:
1233
1261
  type: string
1262
+ nullable: true
1234
1263
  example: Bank of the West
1235
- description: Name of institution holding the manual account
1264
+ description: Name of the institution holding the manual account. If
1265
+ omitted or `null`, no institution name is set.
1236
1266
  minLength: 1
1237
1267
  maxLength: 50
1238
1268
  display_name:
1239
1269
  type: string
1240
- description: Display name of the manual account as set by user or
1241
- derived from the `institution_name` and `name` if not explicitly
1242
- set.<br> This must be unique for the budgeting account.
1270
+ nullable: true
1271
+ description: Display name of the manual account. If omitted or
1272
+ `null`, it is derived from `institution_name` and `name`. An
1273
+ explicitly set display name must be unique for the budgeting
1274
+ account.
1243
1275
  example: Savings
1244
1276
  type:
1245
1277
  description: The type of manual account
@@ -1247,8 +1279,10 @@ components:
1247
1279
  - $ref: "#/components/schemas/accountTypeEnum"
1248
1280
  subtype:
1249
1281
  type: string
1250
- description: An optional manual account subtype. Examples include<br>
1251
- - retirement - checking - savings - prepaid credit card
1282
+ nullable: true
1283
+ description: Manual account subtype. If omitted or `null`, no subtype
1284
+ is set. Examples include retirement, checking, savings, and prepaid
1285
+ credit card.
1252
1286
  minLength: 1
1253
1287
  maxLength: 100
1254
1288
  example: prepaid credit card
@@ -1353,10 +1387,13 @@ components:
1353
1387
  - $ref: "#/components/schemas/accountTypeEnum"
1354
1388
  subtype:
1355
1389
  type: string
1356
- description: If set, an optional account subtype. Examples include<br>
1390
+ nullable: true
1391
+ description: If set, an optional account subtype. Set to `null` to clear it.
1392
+ Examples include<br>
1357
1393
  - retirement - checking - savings - prepaid credit card
1358
1394
  minLength: 1
1359
1395
  maxLength: 100
1396
+ example: prepaid credit card
1360
1397
  x-updatable: true
1361
1398
  balance:
1362
1399
  oneOf:
@@ -1614,11 +1651,12 @@ components:
1614
1651
  type: object
1615
1652
  description: Source information for a manual account balance history entry.
1616
1653
  additionalProperties: false
1654
+ x-internal: true
1617
1655
  properties:
1618
1656
  type:
1619
1657
  type: string
1620
1658
  enum: [manual]
1621
- description: Identifies this entry as belonging to a manually-managed account.
1659
+ description: Identifies this entry as belonging to a manual account.
1622
1660
  manual_account_id:
1623
1661
  type: integer
1624
1662
  format: int32
@@ -1631,6 +1669,7 @@ components:
1631
1669
  type: object
1632
1670
  description: Source information for a Plaid-synced account balance history entry.
1633
1671
  additionalProperties: false
1672
+ x-internal: true
1634
1673
  properties:
1635
1674
  type:
1636
1675
  type: string
@@ -1646,13 +1685,14 @@ components:
1646
1685
 
1647
1686
  balanceHistorySourceCryptoManual:
1648
1687
  type: object
1649
- description: Source information for a manually-tracked cryptocurrency balance history entry.
1688
+ description: Source information for a manual cryptocurrency balance history entry.
1650
1689
  additionalProperties: false
1690
+ x-internal: true
1651
1691
  properties:
1652
1692
  type:
1653
1693
  type: string
1654
1694
  enum: [crypto_manual]
1655
- description: Identifies this entry as belonging to a manually-tracked crypto account.
1695
+ description: Identifies this entry as belonging to a manual crypto account.
1656
1696
  crypto_manual_id:
1657
1697
  type: integer
1658
1698
  format: int32
@@ -1695,10 +1735,11 @@ components:
1695
1735
  type: object
1696
1736
  x-internal: true
1697
1737
  description: >
1698
- Source information for a balance history entry whose account has since been deleted.
1738
+ Source information for balance history whose account has since been deleted.
1699
1739
  Historical balances are preserved when a user chooses to keep history on account deletion.
1700
1740
  This object contains details that can be used to display the deleted account in the UI.
1701
- The `deleted_account_id` can be passed to `PUT /v2/balance_history/deleted/{account_id}/details`
1741
+ The `deleted_account_id` can be passed to
1742
+ [PUT /balance_history/deleted/{account_id}/details](#tag/balance-history/PUT/balance_history/deleted/{account_id}/details)
1702
1743
  to update the archived source metadata.
1703
1744
  additionalProperties: false
1704
1745
  properties:
@@ -1729,11 +1770,11 @@ components:
1729
1770
  subtype:
1730
1771
  type: string
1731
1772
  nullable: true
1732
- description: Archived `subtype`` of the deleted account source
1773
+ description: Archived `subtype` of the deleted account source
1733
1774
  mask:
1734
1775
  type: string
1735
1776
  nullable: true
1736
- description: Archived account `mask` for a deleted plaid account source
1777
+ description: Archived account `mask` for a deleted Plaid account source
1737
1778
  symbol:
1738
1779
  type: string
1739
1780
  nullable: true
@@ -1750,16 +1791,19 @@ components:
1750
1791
  - subtype
1751
1792
  - mask
1752
1793
  - symbol
1794
+
1753
1795
  balanceHistoryAccountObject:
1754
1796
  type: object
1755
- title: balance history account object
1797
+ title: balance history for an account object
1756
1798
  additionalProperties: false
1757
- description: Historical balance entries grouped under a single account source.
1799
+ description: Monthly balance entries grouped under a single account source.
1758
1800
  properties:
1759
1801
  source:
1760
1802
  description: >
1761
- Identifies the account this balance entry belongs to. The shape varies by
1762
- `source.type`. Use `source.type` to determine which account id field is present.
1803
+ Identifies the account these balance entries belong to. The shape varies by
1804
+ `source.type`. Each source type exposes a type-specific account id field
1805
+ (`manual_account_id`, `plaid_account_id`, `crypto_manual_id`,
1806
+ `crypto_synced_id`, or `deleted_account_id`).
1763
1807
  oneOf:
1764
1808
  - $ref: "#/components/schemas/balanceHistorySourceManual"
1765
1809
  - $ref: "#/components/schemas/balanceHistorySourcePlaid"
@@ -1776,35 +1820,49 @@ components:
1776
1820
  deleted: "#/components/schemas/balanceHistorySourceDeleted"
1777
1821
  balances:
1778
1822
  type: array
1779
- description: One or more monthly balance history entries for the source account.
1823
+ description: >
1824
+ Monthly balance entries for this account source. A `historical` entry is
1825
+ a stored snapshot of a past month and includes an `id`. A `current` entry
1826
+ is an ephemeral snapshot based on the account's current balances and has
1827
+ no balance-entry `id`. On PUT upsert responses, this array includes only
1828
+ the `type: historical` entries modified by that request.
1780
1829
  items:
1781
- $ref: "#/components/schemas/balanceHistoryObject"
1830
+ $ref: "#/components/schemas/balanceHistoryEntry"
1782
1831
  required:
1783
1832
  - source
1784
1833
  - balances
1785
1834
 
1786
- balanceHistoryObject:
1835
+ historicalBalanceHistoryEntry:
1787
1836
  type: object
1788
- title: balance history entry object
1837
+ title: historical balance history entry
1789
1838
  additionalProperties: false
1790
- description: A historical balance entry for a single account on a single date.
1839
+ x-internal: true
1840
+ description: >
1841
+ A stored monthly balance for a past month. The `id` may be used with
1842
+ balance history entry endpoints. The balance represents the account
1843
+ balance at or around the end of `month`.
1791
1844
  properties:
1845
+ type:
1846
+ type: string
1847
+ enum: [historical]
1848
+ description: Identifies this entry as a stored snapshot of a past month.
1792
1849
  id:
1793
1850
  type: integer
1794
1851
  format: int32
1795
- description: Unique identifier of this historical balance entry.
1796
- date:
1852
+ description: Unique identifier for this historical balance entry.
1853
+ month:
1797
1854
  type: string
1798
- format: date
1799
- description: Date of this historical balance entry in YYYY-MM-DD format. This is always the first day of a month.
1855
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
1856
+ description: Calendar month for this entry in YYYY-MM format.
1857
+ example: "2026-06"
1800
1858
  balance:
1801
1859
  type: string
1802
1860
  pattern: ^-?\d+(\.\d{1,4})?$
1803
- description: Historical balance stored for this entry. For manual and Plaid accounts this is in the account currency. For crypto accounts this is in the user's primary currency.
1861
+ 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.
1804
1862
  currency:
1805
1863
  allOf:
1806
1864
  - $ref: "#/components/schemas/currencyEnum"
1807
- description: Currency of the stored `balance`. For crypto entries this is the user's primary currency.
1865
+ description: Currency of `balance`. For crypto entries this is the user's primary currency.
1808
1866
  to_base:
1809
1867
  type: number
1810
1868
  format: double
@@ -1813,19 +1871,82 @@ components:
1813
1871
  type: string
1814
1872
  nullable: true
1815
1873
  pattern: ^-?\d+(\.\d{1,18})?$
1816
- description: Crypto quantity stored for this balance entry, when available. This may be present for crypto or deleted-account entries and is `null` otherwise.
1874
+ description: Crypto quantity for this balance entry, when available. This may be present for crypto or deleted-account entries and is `null` otherwise.
1817
1875
  required:
1876
+ - type
1818
1877
  - id
1819
- - date
1878
+ - month
1820
1879
  - balance
1821
1880
  - currency
1822
1881
  - to_base
1823
1882
  - crypto_balance
1824
1883
 
1884
+ currentBalanceHistoryEntry:
1885
+ type: object
1886
+ title: current balance history entry
1887
+ additionalProperties: false
1888
+ x-internal: true
1889
+ description: >
1890
+ An ephemeral snapshot based on the account's current balances. It may
1891
+ change between requests.
1892
+ properties:
1893
+ type:
1894
+ type: string
1895
+ enum: [current]
1896
+ description: Identifies this entry as an ephemeral current-month snapshot.
1897
+ month:
1898
+ type: string
1899
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
1900
+ description: Calendar month for this entry in YYYY-MM format. For current entries this is the current month.
1901
+ example: "2026-07"
1902
+ balance:
1903
+ type: string
1904
+ pattern: ^-?\d+(\.\d{1,4})?$
1905
+ 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.
1906
+ currency:
1907
+ allOf:
1908
+ - $ref: "#/components/schemas/currencyEnum"
1909
+ description: Currency of the calculated `balance`. For crypto entries this is the user's primary currency.
1910
+ to_base:
1911
+ type: number
1912
+ format: double
1913
+ 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`.
1914
+ crypto_balance:
1915
+ type: string
1916
+ nullable: true
1917
+ pattern: ^-?\d+(\.\d{1,18})?$
1918
+ description: Crypto quantity for this calculated entry, when available. This may be present for crypto entries and is `null` otherwise.
1919
+ required:
1920
+ - type
1921
+ - month
1922
+ - balance
1923
+ - currency
1924
+ - to_base
1925
+ - crypto_balance
1926
+
1927
+ balanceHistoryEntry:
1928
+ title: balance history entry
1929
+ x-internal: true
1930
+ description: >
1931
+ A monthly balance history entry. Discriminated by `type`. `historical`
1932
+ entries are stored snapshots of past months with an `id`. `current`
1933
+ entries are ephemeral snapshots with no balance-entry `id`.
1934
+ oneOf:
1935
+ - $ref: "#/components/schemas/historicalBalanceHistoryEntry"
1936
+ - $ref: "#/components/schemas/currentBalanceHistoryEntry"
1937
+ discriminator:
1938
+ propertyName: type
1939
+ mapping:
1940
+ historical: "#/components/schemas/historicalBalanceHistoryEntry"
1941
+ current: "#/components/schemas/currentBalanceHistoryEntry"
1942
+
1825
1943
  balanceHistoryListResponseObject:
1826
1944
  type: object
1827
1945
  additionalProperties: false
1828
1946
  x-internal: true
1947
+ description: >
1948
+ List response for balance history GET endpoints. Entries are grouped by
1949
+ account source under `balance_history`.
1829
1950
  properties:
1830
1951
  balance_history:
1831
1952
  type: array
@@ -1838,31 +1959,39 @@ components:
1838
1959
  type: object
1839
1960
  x-internal: true
1840
1961
  additionalProperties: false
1962
+ description: >
1963
+ A single monthly balance entry to upsert. Request bodies use this shape.
1964
+ Responses return `type: historical` entries instead.
1841
1965
  properties:
1842
1966
  id:
1843
1967
  type: integer
1844
1968
  format: int32
1845
1969
  description: System-defined balance history entry id. Ignored if set.
1846
1970
  x-updatable: false
1847
- date:
1971
+ month:
1848
1972
  type: string
1849
- format: date
1850
- description: Month to update, in YYYY-MM-DD format. This must be the first day of a month and must not be in the future.
1973
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
1974
+ description: >
1975
+ Calendar month to upsert, in YYYY-MM format. Must be a past month.
1976
+ The current month cannot be written through PUT endpoints.
1977
+ example: "2026-06"
1851
1978
  balance:
1852
1979
  oneOf:
1853
1980
  - type: number
1854
1981
  format: double
1855
1982
  - type: string
1856
1983
  pattern: ^-?\d+(\.\d{1,4})?$
1857
- 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.
1984
+ 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.
1858
1985
  symbol:
1859
1986
  type: string
1860
1987
  nullable: true
1861
1988
  minLength: 1
1862
1989
  maxLength: 25
1863
- description: Optional for crypto balances, but if set it must match the account's symbol.
1864
- Tolerated for deleted-account balances. Do not provide this for manual or Plaid balances.
1865
- If provided when using the synced crypto path-based endpoint, this must match the symbol in the path.
1990
+ description: >
1991
+ Optional for crypto balances. If set, it must match the account's
1992
+ symbol. Tolerated for deleted-account balances. Do not provide this
1993
+ for manual or Plaid balances. On the synced crypto path endpoint, if
1994
+ provided it must match the `symbol` path parameter.
1866
1995
  x-updatable: true
1867
1996
  crypto_balance:
1868
1997
  type: string
@@ -1878,10 +2007,10 @@ components:
1878
2007
  to_base:
1879
2008
  type: number
1880
2009
  format: double
1881
- description: System-defined historical balance converted to the user's primary currency. Ignored if set. Use `balance` to update the stored historical balance.
2010
+ description: System-defined historical balance converted to the user's primary currency. Ignored if set. Use `balance` to update the historical balance.
1882
2011
  x-updatable: false
1883
2012
  required:
1884
- - date
2013
+ - month
1885
2014
  - balance
1886
2015
 
1887
2016
  upsertBalanceHistoryRequestObject:
@@ -1892,43 +2021,16 @@ components:
1892
2021
  balances:
1893
2022
  type: array
1894
2023
  minItems: 1
1895
- description: One or more monthly balance history entries to upsert
2024
+ description: >
2025
+ One or more monthly balance history entries to upsert. Each entry uses
2026
+ `month` (YYYY-MM) and `balance`. Do not include response-only fields such
2027
+ as `type`. PUT responses return only the `type: historical` entries
2028
+ modified by the request.
1896
2029
  items:
1897
2030
  $ref: "#/components/schemas/balanceHistoryUpdateItemObject"
1898
2031
  required:
1899
2032
  - balances
1900
2033
 
1901
- balanceHistoryUpdateErrorObject:
1902
- type: object
1903
- x-internal: true
1904
- additionalProperties: true
1905
- properties:
1906
- request_balances_index:
1907
- type: integer
1908
- format: int32
1909
- description: Zero-based index into the `balances` request array
1910
- message:
1911
- type: string
1912
- description: Error message describing why the row could not be updated
1913
- required:
1914
- - request_balances_index
1915
- - message
1916
-
1917
- upsertBalanceHistoryResponseObject:
1918
- type: object
1919
- x-internal: true
1920
- additionalProperties: false
1921
- properties:
1922
- updated_balance_history:
1923
- $ref: "#/components/schemas/balanceHistoryAccountObject"
1924
- errors:
1925
- type: array
1926
- items:
1927
- $ref: "#/components/schemas/balanceHistoryUpdateErrorObject"
1928
- required:
1929
- - updated_balance_history
1930
- - errors
1931
-
1932
2034
  updateBalanceHistoryDetailsRequestObject:
1933
2035
  type: object
1934
2036
  x-internal: true
@@ -1938,51 +2040,58 @@ components:
1938
2040
  name:
1939
2041
  type: string
1940
2042
  nullable: true
1941
- description: New archived account name for the deleted account source.
2043
+ description: New archived account name for the deleted account source
1942
2044
  institution_name:
1943
2045
  type: string
1944
2046
  nullable: true
1945
- description: New archived institution name for the deleted account source.
2047
+ description: New archived institution name for the deleted account source
1946
2048
  display_name:
1947
2049
  type: string
1948
2050
  nullable: true
1949
- description: New display name for the deleted account source.
2051
+ description: New display name for the deleted account source
1950
2052
  account_type:
1951
2053
  type: string
1952
2054
  nullable: true
1953
- description: New archived account type for the deleted account source.
2055
+ description: New archived account type for the deleted account source
1954
2056
  subtype:
1955
2057
  type: string
1956
2058
  nullable: true
1957
- description: New archived subtype for the deleted account source.
2059
+ description: New archived subtype for the deleted account source
1958
2060
  mask:
1959
2061
  type: string
1960
2062
  nullable: true
1961
- description: New archived account mask for the deleted account source.
2063
+ description: New archived account mask for the deleted account source
1962
2064
 
1963
2065
  updateBalanceHistoryDetailsResponseObject:
1964
2066
  type: object
1965
2067
  x-internal: true
1966
2068
  additionalProperties: false
2069
+ description: Updated archived metadata for a deleted balance history source
1967
2070
  properties:
1968
2071
  name:
1969
2072
  type: string
1970
2073
  nullable: true
2074
+ description: Archived account name for the deleted account source
1971
2075
  institution_name:
1972
2076
  type: string
1973
2077
  nullable: true
2078
+ description: Archived institution name for the deleted account source
1974
2079
  display_name:
1975
2080
  type: string
1976
2081
  nullable: true
2082
+ description: Archived display name for the deleted account source
1977
2083
  account_type:
1978
2084
  type: string
1979
2085
  nullable: true
2086
+ description: Archived account type for the deleted account source
1980
2087
  subtype:
1981
2088
  type: string
1982
2089
  nullable: true
2090
+ description: Archived subtype for the deleted account source
1983
2091
  mask:
1984
2092
  type: string
1985
2093
  nullable: true
2094
+ description: Archived account mask for the deleted account source
1986
2095
  required:
1987
2096
  - name
1988
2097
  - institution_name
@@ -2467,14 +2576,9 @@ components:
2467
2576
  external_id:
2468
2577
  type: string
2469
2578
  nullable: true
2470
- description: A user-defined external ID for any transaction that was
2471
- added via csv import, `POST /transactions` API call, or manually
2472
- added via the Lunch Money app. No external ID exists for
2473
- transactions associated with synced accounts, and they cannot be
2474
- added. For transactions associated with manual accounts, the
2475
- external ID must be unique as attempts to add a subsequent
2476
- transaction with the same external_id and manual_account_id will be
2477
- flagged as duplicates and fail.
2579
+ description: A user-defined external ID associated with the transaction.
2580
+ For transactions belonging to manual accounts, the
2581
+ external ID must be unique for each transaction associated with the account.
2478
2582
  minLength: 0
2479
2583
  maxLength: 75
2480
2584
  tag_ids:
@@ -2495,8 +2599,6 @@ components:
2495
2599
  Any transaction notes set by the user or by
2496
2600
  a matched recurring item. This will match the value
2497
2601
  displayed in notes field on the transactions page in the Lunch Money app.
2498
- minLength: 0
2499
- maxLength: 350
2500
2602
  status:
2501
2603
  type: string
2502
2604
  # description: >
@@ -2732,8 +2834,6 @@ components:
2732
2834
  Any transaction notes set by the user or by
2733
2835
  a matched recurring item. This will match the value
2734
2836
  displayed in notes field on the transactions page in the Lunch Money app.
2735
- minLength: 0
2736
- maxLength: 350
2737
2837
  status:
2738
2838
  type: string
2739
2839
  description: >
@@ -2875,14 +2975,9 @@ components:
2875
2975
  external_id:
2876
2976
  type: string
2877
2977
  nullable: true
2878
- description: A user-defined external ID for any transaction that was
2879
- added via csv import, `POST /transactions` API call, or manually
2880
- added via the Lunch Money app. No external ID exists for
2881
- transactions associated with synced accounts, and they cannot be
2882
- added. For transactions associated with manual accounts, the
2883
- external ID must be unique as attempts to add a subsequent
2884
- transaction with the same external_id and manual_account_id will be
2885
- flagged as duplicates and fail.
2978
+ description: A user-defined external ID associated with the transaction.
2979
+ For transactions belonging to manual accounts, the
2980
+ external ID must be unique for each transaction associated with the account.
2886
2981
  minLength: 0
2887
2982
  maxLength: 75
2888
2983
  plaid_metadata:
@@ -2952,7 +3047,7 @@ components:
2952
3047
  currency:
2953
3048
  description: Three-letter lowercase currency code of the transaction
2954
3049
  in ISO 4217 format. Must match one of the [supported
2955
- currencies](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/currencies). If not set
3050
+ currencies](https://lunchmoney.dev/v2/currencies). If not set
2956
3051
  defaults to the user account's primary currency.
2957
3052
  allOf:
2958
3053
  - $ref: "#/components/schemas/currencyEnum"
@@ -2978,8 +3073,6 @@ components:
2978
3073
  Any transaction notes set by the user or by
2979
3074
  a matched recurring item. This will match the value
2980
3075
  displayed in notes field on the transactions page in the Lunch Money app.
2981
- minLength: 0
2982
- maxLength: 350
2983
3076
  manual_account_id:
2984
3077
  type: integer
2985
3078
  format: int32
@@ -3099,6 +3192,7 @@ components:
3099
3192
  description: |
3100
3193
  The new payee for the transaction.
3101
3194
  minLength: 0
3195
+ x-updatable: true
3102
3196
  original_name:
3103
3197
  type: string
3104
3198
  nullable: true
@@ -3117,8 +3211,6 @@ components:
3117
3211
  description: >
3118
3212
  New notes for the transaction. Set this to an empty string to clear
3119
3213
  the existing notes.
3120
- minLength: 0
3121
- maxLength: 350
3122
3214
  x-updatable: true
3123
3215
  manual_account_id:
3124
3216
  type: integer
@@ -3301,6 +3393,7 @@ components:
3301
3393
  amount.
3302
3394
  payee:
3303
3395
  type: string
3396
+ minLength: 0
3304
3397
  description: The payee for the child transaction. Will inherit the
3305
3398
  original payee from the parent if not defined.
3306
3399
  date:
@@ -3311,9 +3404,10 @@ components:
3311
3404
  category_id:
3312
3405
  type: integer
3313
3406
  format: int32
3314
- description: Unique identifier for associated category_id. Category
3315
- must already exist for the account. Will inherit category from the
3316
- parent if not defined.
3407
+ nullable: true
3408
+ description: Category ID for the child transaction. The category must
3409
+ already exist for the account. If omitted, the child inherits the
3410
+ parent category. If `null`, the child has no category.
3317
3411
  tag_ids:
3318
3412
  type: array
3319
3413
  description: The IDs of any tags to apply to this split child
@@ -3323,8 +3417,10 @@ components:
3323
3417
  format: int32
3324
3418
  notes:
3325
3419
  type: string
3326
- maxLength: 350
3327
- description: Will inherit notes from parent if not defined.
3420
+ nullable: true
3421
+ description: Notes for the child transaction. If omitted, the child
3422
+ inherits the parent notes. If `null` or an empty string, the child
3423
+ has no notes.
3328
3424
  required:
3329
3425
  - amount
3330
3426
 
@@ -3633,10 +3729,11 @@ components:
3633
3729
 
3634
3730
  # Response body for GET /budgets/settings (200)
3635
3731
  budgetSettingsResponseObject:
3636
- x-internal: true
3637
3732
  type: object
3733
+ title: budget settings object
3638
3734
  additionalProperties: false
3639
- description: Budget period and display settings
3735
+ description: Budget period and display settings for the current budgeting
3736
+ account.
3640
3737
  properties:
3641
3738
  budget_period_granularity:
3642
3739
  type: string
@@ -3648,8 +3745,8 @@ components:
3648
3745
  - twice a month
3649
3746
  description: Budget period granularity
3650
3747
  budget_period_quantity:
3651
- type: number
3652
- format: double
3748
+ type: integer
3749
+ format: int32
3653
3750
  description: The number of `granularity` units that make up a single
3654
3751
  budgeting period.
3655
3752
  budget_period_anchor_date:
@@ -4005,7 +4102,9 @@ components:
4005
4102
  while processing the request.<br> If multiple errors were
4006
4103
  encountered, the list will contain multiple objects.<br> Each
4007
4104
  `error` object is guaranteed to have an `errMsg`, but it may also
4008
- contain other error specific properties.
4105
+ contain other error-specific properties such as `code` (for example
4106
+ `VALIDATION_ERROR`), or other properties that are useful to map
4107
+ the error to the relevant part of the request.
4009
4108
  type: array
4010
4109
  items:
4011
4110
  type: object
@@ -4114,6 +4213,7 @@ components:
4114
4213
  # - `cad`: Canadian Dollar
4115
4214
  # - `cdf`: Congolese Franc
4116
4215
  # - `chf`: Swiss Franc
4216
+ # - `clf`: Chilean Unit of Account (UF)
4117
4217
  # - `clp`: Chilean Peso
4118
4218
  # - `cny`: Chinese Yuan
4119
4219
  # - `cop`: Colombian Peso
@@ -4129,6 +4229,7 @@ components:
4129
4229
  # - `egp`: Egyptian Pound
4130
4230
  # - `ern`: Eritrean Nakfa
4131
4231
  # - `etb`: Ethiopian Birr
4232
+ # - `eth`: Ethereum
4132
4233
  # - `eur`: Euro
4133
4234
  # - `fjd`: Fijian Dollar
4134
4235
  # - `fkp`: Falkland Islands Pound
@@ -4236,6 +4337,7 @@ components:
4236
4337
  # - `uyu`: Uruguayan Peso
4237
4338
  # - `uzs`: Uzbekistan Som
4238
4339
  # - `vef`: Venezuelan Bolívar
4340
+ # - `ves`: Venezuelan Bolívar Sotiemas
4239
4341
  # - `vnd`: Vietnamese Dong
4240
4342
  # - `vuv`: Vanuatu Vatu
4241
4343
  # - `wst`: Samoan Tala
@@ -4279,6 +4381,7 @@ components:
4279
4381
  - cad
4280
4382
  - cdf
4281
4383
  - chf
4384
+ - clf
4282
4385
  - clp
4283
4386
  - cny
4284
4387
  - cop
@@ -4294,6 +4397,7 @@ components:
4294
4397
  - egp
4295
4398
  - ern
4296
4399
  - etb
4400
+ - eth
4297
4401
  - eur
4298
4402
  - fjd
4299
4403
  - fkp
@@ -4401,6 +4505,7 @@ components:
4401
4505
  - uyu
4402
4506
  - uzs
4403
4507
  - vef
4508
+ - ves
4404
4509
  - vnd
4405
4510
  - vuv
4406
4511
  - wst
@@ -4458,22 +4563,10 @@ components:
4458
4563
  securitySchemes:
4459
4564
  bearerSecurity:
4460
4565
  type: http
4461
- # TODO Make this shorter?
4462
- # description: The Lunch Money API uses API keys to authenticate requests. To use
4463
- # the v1 API you can view and manage your API keys on the [developers page
4464
- # in the Lunch Money app](https://my.lunchmoney.app/developers). <p> To
4465
- # interact with the Static Mock Server simply enter an API key of 11
4466
- # characters or more. <p> To interact with the v2 service implemented on
4467
- # top of the v1 API paste in a real API token associated with a Lunch
4468
- # Money Budget.
4469
- description: To interact with the Static Mock Server simply enter an API
4470
- key of 11 characters or more.
4566
+ description: >-
4567
+ Required for the LIVE server. Optional for MOCK.
4471
4568
  scheme: bearer
4472
4569
  bearerFormat: JWT
4473
- cookieAuth:
4474
- type: apiKey
4475
- in: cookie
4476
- name: _lm_access_token
4477
4570
 
4478
4571
  paths:
4479
4572
  /me:
@@ -5753,12 +5846,9 @@ paths:
5753
5846
  tags:
5754
5847
  - crypto-manual
5755
5848
  summary: Get all supported cryptocurrencies
5756
- description: >
5849
+ description: |-
5757
5850
  Retrieve the list of cryptocurrencies currently supported for manual tracking.<p>
5758
-
5759
- When creating a new manual crypto balance via `POST /crypto/manual`, the
5760
- `symbol` you specify must match the `symbol` of one of the entries
5761
- returned by this endpoint.
5851
+ 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.
5762
5852
  operationId: getAllCryptocurrencies
5763
5853
  responses:
5764
5854
  "200":
@@ -5796,16 +5886,9 @@ paths:
5796
5886
  - crypto-manual
5797
5887
  summary: Add a new supported cryptocurrency
5798
5888
  operationId: createCryptocurrency
5799
- description: >-
5889
+ description: |-
5800
5890
  Adds a new cryptocurrency to the supported manual-crypto list.<br><br>
5801
-
5802
- Lunch Money uses [CoinGecko](https://www.coingecko.com/us/coins/ethereum)
5803
- to convert crypto balances to the user's primary currency. Users add a
5804
- new supported cryptocurrency by submitting a CoinGecko coin-page URL.
5805
- The server validates the URL, extracts the id from `/coins/{id}`,
5806
- checks for an existing supported `coingecko_id`, validates the id
5807
- against CoinGecko, then confirms the resolved symbol is not already
5808
- supported before creating the new entry.
5891
+ 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.
5809
5892
  requestBody:
5810
5893
  required: true
5811
5894
  content:
@@ -5884,8 +5967,8 @@ paths:
5884
5967
  tags:
5885
5968
  - crypto-manual
5886
5969
  summary: Get all manual crypto balances
5887
- description: Retrieve all manually managed crypto balances associated with
5888
- the user's account.
5970
+ description: |-
5971
+ Retrieve all manually managed crypto balances associated with the user's account.
5889
5972
  operationId: getAllCryptoManual
5890
5973
  responses:
5891
5974
  "200":
@@ -5905,6 +5988,7 @@ paths:
5905
5988
  coingecko_id: bitcoin
5906
5989
  to_base: 53124.72
5907
5990
  balance_as_of: "2026-02-25T14:22:10.000Z"
5991
+ exchange_rate_as_of: "2026-02-25T14:10:00.000Z"
5908
5992
  created_by_name: User 1
5909
5993
  created_at: "2025-11-12T20:14:32.000Z"
5910
5994
  updated_at: "2026-02-25T14:22:10.000Z"
@@ -5918,11 +6002,9 @@ paths:
5918
6002
  tags:
5919
6003
  - crypto-manual
5920
6004
  summary: Create a manual crypto balance
5921
- description: >-
6005
+ description: |-
5922
6006
  Create a manually managed crypto asset.<br><br>
5923
-
5924
- If `display_name` is `null`, clients may derive one from
5925
- `institution_name` + `name`.
6007
+ If `display_name` is `null`, clients may derive one from `institution_name` + `name`.
5926
6008
  operationId: createCryptoManual
5927
6009
  requestBody:
5928
6010
  required: true
@@ -5962,6 +6044,7 @@ paths:
5962
6044
  coingecko_id: ethereum
5963
6045
  to_base: 28998.44
5964
6046
  balance_as_of: "2026-03-01T09:20:41.000Z"
6047
+ exchange_rate_as_of: "2026-03-01T09:15:00.000Z"
5965
6048
  created_by_name: User 1
5966
6049
  created_at: "2026-03-01T09:20:41.000Z"
5967
6050
  updated_at: "2026-03-01T09:20:41.000Z"
@@ -5974,11 +6057,22 @@ paths:
5974
6057
  examples:
5975
6058
  missing required properties:
5976
6059
  value:
5977
- message: Request Validation Failure
6060
+ message: Invalid Request Body
5978
6061
  errors:
5979
6062
  - errMsg: "Missing required property 'name' in request body."
5980
6063
  - errMsg: "Missing required property 'balance' in request body."
5981
6064
  - errMsg: "Missing required property 'symbol' in request body."
6065
+ invalid balance:
6066
+ value:
6067
+ message: Invalid Request Body
6068
+ errors:
6069
+ - errMsg: "Invalid value for property 'balance'. 'abc' cannot be converted to a number"
6070
+ - errMsg: "Invalid value for property 'balance'. Invalid input"
6071
+ invalid property:
6072
+ value:
6073
+ message: Invalid Request Body
6074
+ errors:
6075
+ - errMsg: "Invalid property 'coingecko_id' in request body."
5982
6076
  unsupported symbol:
5983
6077
  value:
5984
6078
  message: Request Validation Failure
@@ -5995,7 +6089,8 @@ paths:
5995
6089
  tags:
5996
6090
  - crypto-manual
5997
6091
  summary: Get a single manual crypto balance
5998
- description: Retrieve a single manually managed crypto balance by ID.
6092
+ description: |-
6093
+ Retrieve a single manually managed crypto balance by ID.
5999
6094
  operationId: getCryptoManualById
6000
6095
  parameters:
6001
6096
  - name: id
@@ -6029,6 +6124,7 @@ paths:
6029
6124
  coingecko_id: bitcoin
6030
6125
  to_base: 53124.72
6031
6126
  balance_as_of: "2026-02-25T14:22:10.000Z"
6127
+ exchange_rate_as_of: "2026-02-25T14:10:00.000Z"
6032
6128
  created_by_name: User 1
6033
6129
  created_at: "2025-11-12T20:14:32.000Z"
6034
6130
  updated_at: "2026-02-25T14:22:10.000Z"
@@ -6062,11 +6158,9 @@ paths:
6062
6158
  tags:
6063
6159
  - crypto-manual
6064
6160
  summary: Update a manual crypto balance
6065
- description: >-
6161
+ description: |-
6066
6162
  Modify a manually managed crypto balance.<br><br>
6067
-
6068
- You may submit the response from `GET /crypto/manual/{id}` as the request body. System-defined properties
6069
- are accepted according to the `x-updatable` metadata in the update schema.
6163
+ 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.
6070
6164
  operationId: updateCryptoManual
6071
6165
  parameters:
6072
6166
  - name: id
@@ -6106,6 +6200,7 @@ paths:
6106
6200
  coingecko_id: bitcoin
6107
6201
  to_base: 56011.12
6108
6202
  balance_as_of: "2026-03-01T09:41:18.000Z"
6203
+ exchange_rate_as_of: "2026-03-01T09:35:00.000Z"
6109
6204
  created_by_name: User 1
6110
6205
  created_at: "2025-11-12T20:14:32.000Z"
6111
6206
  updated_at: "2026-02-25T14:22:10.000Z"
@@ -6126,6 +6221,7 @@ paths:
6126
6221
  coingecko_id: bitcoin
6127
6222
  to_base: 56011.12
6128
6223
  balance_as_of: "2026-03-01T09:41:18.000Z"
6224
+ exchange_rate_as_of: "2026-03-01T09:35:00.000Z"
6129
6225
  created_by_name: User 1
6130
6226
  created_at: "2025-11-12T20:14:32.000Z"
6131
6227
  updated_at: "2026-03-01T09:41:18.000Z"
@@ -6161,10 +6257,8 @@ paths:
6161
6257
  tags:
6162
6258
  - crypto-manual
6163
6259
  summary: Delete a manual crypto balance
6164
- description: Delete a single manually managed crypto asset by ID.<p> If
6165
- this crypto asset has a balance history, and you do not explicitly set
6166
- the query parameter`keep_history`, a 422 response will be returned
6167
- requesting you to explicitly set `keep_history` to `true` or `false`.
6260
+ description: |-
6261
+ 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`.
6168
6262
  operationId: deleteCryptoManual
6169
6263
  parameters:
6170
6264
  - name: id
@@ -6229,8 +6323,8 @@ paths:
6229
6323
  tags:
6230
6324
  - crypto-synced
6231
6325
  summary: Get all synced crypto accounts
6232
- description: Retrieves all synced crypto accounts
6233
- associated with the user's account.
6326
+ description: |-
6327
+ Retrieves all synced crypto accounts associated with the user's account.
6234
6328
  operationId: getAllCryptoSynced
6235
6329
  responses:
6236
6330
  "200":
@@ -6255,6 +6349,7 @@ paths:
6255
6349
  coingecko_id: ethereum
6256
6350
  to_base: 28998.44
6257
6351
  balance_as_of: "2026-02-25T14:25:00.000Z"
6352
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6258
6353
  updated_at: "2026-02-25T14:25:01.000Z"
6259
6354
  - name: BTC
6260
6355
  balance: "0.100020003000400050"
@@ -6262,6 +6357,7 @@ paths:
6262
6357
  coingecko_id: bitcoin
6263
6358
  to_base: 6231.28
6264
6359
  balance_as_of: "2026-02-25T14:25:00.000Z"
6360
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6265
6361
  updated_at: "2026-02-25T14:25:01.000Z"
6266
6362
  - id: 33005
6267
6363
  provider: kraken
@@ -6277,6 +6373,7 @@ paths:
6277
6373
  coingecko_id: ripple
6278
6374
  to_base: 1287.50
6279
6375
  balance_as_of: "2026-02-26T07:22:30.000Z"
6376
+ exchange_rate_as_of: "2026-02-26T07:10:00.000Z"
6280
6377
  updated_at: "2026-02-26T07:22:30.000Z"
6281
6378
  "401":
6282
6379
  $ref: "#/components/responses/unauthorizedToken"
@@ -6289,8 +6386,8 @@ paths:
6289
6386
  tags:
6290
6387
  - crypto-synced
6291
6388
  summary: Get a single synced crypto account
6292
- description: Retrieves the synced crypto account and all nested balances
6293
- for the specified synced crypto account ID.
6389
+ description: |-
6390
+ Retrieves the synced crypto account and all nested balances for the specified synced crypto account ID.
6294
6391
  operationId: getCryptoSyncedById
6295
6392
  parameters:
6296
6393
  - name: id
@@ -6329,6 +6426,7 @@ paths:
6329
6426
  coingecko_id: ethereum
6330
6427
  to_base: 28998.44
6331
6428
  balance_as_of: "2026-02-25T14:25:00.000Z"
6429
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6332
6430
  updated_at: "2026-02-25T14:25:01.000Z"
6333
6431
  - name: BTC
6334
6432
  balance: "0.100020003000400050"
@@ -6336,6 +6434,7 @@ paths:
6336
6434
  coingecko_id: bitcoin
6337
6435
  to_base: 6231.28
6338
6436
  balance_as_of: "2026-02-25T14:25:00.000Z"
6437
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6339
6438
  updated_at: "2026-02-25T14:25:01.000Z"
6340
6439
  "400":
6341
6440
  description: Bad Request
@@ -6368,8 +6467,8 @@ paths:
6368
6467
  tags:
6369
6468
  - crypto-synced
6370
6469
  summary: Get a synced crypto balance by symbol
6371
- description: Retrieves a single balance from the specified synced crypto
6372
- account using the crypto symbol.
6470
+ description: |-
6471
+ Retrieves a single balance from the specified synced crypto account using the crypto symbol.
6373
6472
  operationId: getCryptoSyncedBalanceBySymbol
6374
6473
  parameters:
6375
6474
  - name: id
@@ -6401,6 +6500,7 @@ paths:
6401
6500
  coingecko_id: ethereum
6402
6501
  to_base: 28998.44
6403
6502
  balance_as_of: "2026-02-25T14:25:00.000Z"
6503
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6404
6504
  updated_at: "2026-02-25T14:25:01.000Z"
6405
6505
  "400":
6406
6506
  description: Bad Request
@@ -6447,8 +6547,8 @@ paths:
6447
6547
  tags:
6448
6548
  - crypto-synced
6449
6549
  summary: Refresh balances for a synced crypto account
6450
- description: Trigger a balance refresh for the specified synced crypto
6451
- account. Returns the refreshed synced crypto account.
6550
+ description: |-
6551
+ Trigger a balance refresh for the specified synced crypto account. Returns the refreshed synced crypto account.
6452
6552
  operationId: refreshCryptoSynced
6453
6553
  parameters:
6454
6554
  - name: id
@@ -6486,6 +6586,7 @@ paths:
6486
6586
  coingecko_id: ethereum
6487
6587
  to_base: 28998.44
6488
6588
  balance_as_of: "2026-02-25T14:25:00.000Z"
6589
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6489
6590
  updated_at: "2026-02-25T14:25:01.000Z"
6490
6591
  - name: BTC
6491
6592
  balance: "0.100020003000400050"
@@ -6493,6 +6594,7 @@ paths:
6493
6594
  coingecko_id: bitcoin
6494
6595
  to_base: 6231.28
6495
6596
  balance_as_of: "2026-02-25T14:25:00.000Z"
6597
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6496
6598
  updated_at: "2026-02-25T14:25:01.000Z"
6497
6599
  "401":
6498
6600
  $ref: "#/components/responses/unauthorizedToken"
@@ -6515,51 +6617,55 @@ paths:
6515
6617
  tags:
6516
6618
  - balance_history
6517
6619
  summary: Get balance history
6518
- description: >-
6519
- Retrieve historical balance entries.<br><br>
6520
-
6521
- Balance history is monthly. When `start_date` and `end_date` are both provided,
6522
- they must be first-of-month dates. `start_date` must not be in the future,
6523
- while `end_date` may be in the future. If one of `start_date` or `end_date`
6524
- is provided, the other is required. If neither is provided, all available
6525
- balance history is returned.<br><br>
6526
-
6527
- The response groups entries by source account. Each item in
6528
- `balance_history` contains a `source` object plus a `balances` array
6529
- containing one balance entry per month in the requested range, or all
6530
- stored entries when no range is provided.<br><br>
6531
-
6532
- Historical entries for accounts that have been deleted may still
6533
- be returned. These entries use `source.type: deleted` and include
6534
- `deleted_account_id`, archived display fields, and account metadata on the
6535
- `source` object.
6620
+ description: |-
6621
+ Retrieve monthly balance history for all account sources.<br><br>
6622
+ 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>
6623
+ 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>
6624
+ 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>
6625
+ Each balance entry has a `type`:<br>
6626
+ - `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>
6627
+ - `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>
6628
+ &nbsp;&nbsp;&nbsp;&nbsp;- `manual`: `source.manual_account_id` with [GET /manual_accounts/{id}](#tag/manual-accounts/GET/manual_accounts/{id})<br>
6629
+ &nbsp;&nbsp;&nbsp;&nbsp;- `plaid`: `source.plaid_account_id` with [GET /plaid_accounts/{id}](#tag/plaid-accounts/GET/plaid_accounts/{id})<br>
6630
+ &nbsp;&nbsp;&nbsp;&nbsp;- `crypto_manual`: `source.crypto_manual_id` with [GET /crypto/manual/{id}](#tag/crypto-manual/GET/crypto/manual/{id})<br>
6631
+ &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})
6536
6632
  operationId: getBalanceHistory
6537
6633
  parameters:
6538
- - name: start_date
6634
+ - name: start_month
6539
6635
  in: query
6540
- 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.
6636
+ description: >-
6637
+ Optional start of the requested history range as a calendar month in
6638
+ YYYY-MM format (for example `2026-06`). If set, `end_month` is also
6639
+ required. The range is inclusive. `start_month` must not be in the
6640
+ future. A full date such as `2026-06-01` is invalid.
6541
6641
  required: false
6542
6642
  schema:
6543
6643
  type: string
6544
- format: date
6644
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
6545
6645
  examples:
6546
6646
  range start:
6547
- summary: Start date
6548
- value: "2026-01-01"
6549
- - name: end_date
6647
+ summary: Start month
6648
+ value: "2026-01"
6649
+ - name: end_month
6550
6650
  in: query
6551
- 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`.
6651
+ description: >-
6652
+ Optional end of the requested history range as a calendar month in
6653
+ YYYY-MM format (for example `2026-06`). If set, `start_month` is also
6654
+ required. The range is inclusive. `end_month` may not be earlier than
6655
+ `start_month` and must not be in the future. A full date such as
6656
+ `2026-06-01` is invalid. For a single month, set this to the same
6657
+ value as `start_month`.
6552
6658
  required: false
6553
6659
  schema:
6554
6660
  type: string
6555
- format: date
6661
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
6556
6662
  examples:
6557
6663
  range end:
6558
- summary: End date
6559
- value: "2026-03-01"
6664
+ summary: End month
6665
+ value: "2026-03"
6560
6666
  responses:
6561
6667
  "200":
6562
- description: Historical balance entries for the requested date range
6668
+ description: Monthly balance history for the requested month range
6563
6669
  content:
6564
6670
  application/json:
6565
6671
  schema:
@@ -6572,14 +6678,16 @@ paths:
6572
6678
  type: manual
6573
6679
  manual_account_id: 119807
6574
6680
  balances:
6575
- - id: 101
6576
- date: "2026-01-01"
6681
+ - type: historical
6682
+ id: 101
6683
+ month: "2026-01"
6577
6684
  balance: "41000.0000"
6578
6685
  currency: usd
6579
6686
  to_base: 41000
6580
6687
  crypto_balance: null
6581
- - id: 102
6582
- date: "2026-02-01"
6688
+ - type: historical
6689
+ id: 102
6690
+ month: "2026-02"
6583
6691
  balance: "41211.8000"
6584
6692
  currency: usd
6585
6693
  to_base: 41211.8
@@ -6588,8 +6696,9 @@ paths:
6588
6696
  type: plaid
6589
6697
  plaid_account_id: 119808
6590
6698
  balances:
6591
- - id: 103
6592
- date: "2026-01-01"
6699
+ - type: historical
6700
+ id: 103
6701
+ month: "2026-01"
6593
6702
  balance: "5498.2800"
6594
6703
  currency: usd
6595
6704
  to_base: 5498.28
@@ -6599,8 +6708,9 @@ paths:
6599
6708
  crypto_manual_id: 22001
6600
6709
  symbol: btc
6601
6710
  balances:
6602
- - id: 104
6603
- date: "2026-01-01"
6711
+ - type: historical
6712
+ id: 104
6713
+ month: "2026-01"
6604
6714
  balance: "53124.7200"
6605
6715
  currency: usd
6606
6716
  to_base: 53124.72
@@ -6610,8 +6720,9 @@ paths:
6610
6720
  crypto_synced_id: 33004
6611
6721
  symbol: btc
6612
6722
  balances:
6613
- - id: 105
6614
- date: "2026-01-01"
6723
+ - type: historical
6724
+ id: 105
6725
+ month: "2026-01"
6615
6726
  balance: "6231.2800"
6616
6727
  currency: usd
6617
6728
  to_base: 6231.28
@@ -6627,12 +6738,34 @@ paths:
6627
6738
  mask: "1234"
6628
6739
  symbol: null
6629
6740
  balances:
6630
- - id: 106
6631
- date: "2026-01-01"
6741
+ - type: historical
6742
+ id: 106
6743
+ month: "2026-01"
6632
6744
  balance: "1250.0000"
6633
6745
  currency: usd
6634
6746
  to_base: 1250
6635
6747
  crypto_balance: null
6748
+ historical and current:
6749
+ summary: Historical month plus ephemeral current month
6750
+ value:
6751
+ balance_history:
6752
+ - source:
6753
+ type: manual
6754
+ manual_account_id: 162003
6755
+ balances:
6756
+ - type: historical
6757
+ id: 7437356
6758
+ month: "2026-06"
6759
+ balance: "62.8"
6760
+ currency: usd
6761
+ to_base: 62.8
6762
+ crypto_balance: null
6763
+ - type: current
6764
+ month: "2026-07"
6765
+ balance: "71.2"
6766
+ currency: usd
6767
+ to_base: 71.2
6768
+ crypto_balance: null
6636
6769
  manual account history:
6637
6770
  value:
6638
6771
  balance_history:
@@ -6640,14 +6773,16 @@ paths:
6640
6773
  type: manual
6641
6774
  manual_account_id: 119807
6642
6775
  balances:
6643
- - id: 201
6644
- date: "2026-01-01"
6776
+ - type: historical
6777
+ id: 201
6778
+ month: "2026-01"
6645
6779
  balance: "41000.0000"
6646
6780
  currency: usd
6647
6781
  to_base: 41000
6648
6782
  crypto_balance: null
6649
- - id: 202
6650
- date: "2026-02-01"
6783
+ - type: historical
6784
+ id: 202
6785
+ month: "2026-02"
6651
6786
  balance: "41211.8000"
6652
6787
  currency: usd
6653
6788
  to_base: 41211.8
@@ -6659,8 +6794,9 @@ paths:
6659
6794
  type: plaid
6660
6795
  plaid_account_id: 119808
6661
6796
  balances:
6662
- - id: 301
6663
- date: "2026-02-01"
6797
+ - type: historical
6798
+ id: 301
6799
+ month: "2026-02"
6664
6800
  balance: "5498.2800"
6665
6801
  currency: usd
6666
6802
  to_base: 5498.28
@@ -6673,8 +6809,9 @@ paths:
6673
6809
  crypto_synced_id: 33004
6674
6810
  symbol: btc
6675
6811
  balances:
6676
- - id: 401
6677
- date: "2026-02-01"
6812
+ - type: historical
6813
+ id: 401
6814
+ month: "2026-02"
6678
6815
  balance: "6231.2800"
6679
6816
  currency: usd
6680
6817
  to_base: 6231.28
@@ -6693,8 +6830,9 @@ paths:
6693
6830
  mask: "1234"
6694
6831
  symbol: null
6695
6832
  balances:
6696
- - id: 501
6697
- date: "2026-01-01"
6833
+ - type: historical
6834
+ id: 501
6835
+ month: "2026-01"
6698
6836
  balance: "1250.0000"
6699
6837
  currency: usd
6700
6838
  to_base: 1250
@@ -6706,26 +6844,31 @@ paths:
6706
6844
  schema:
6707
6845
  $ref: "#/components/schemas/errorResponseObject"
6708
6846
  examples:
6709
- missing paired date:
6847
+ missing paired month:
6710
6848
  value:
6711
6849
  message: Request Validation Failure
6712
6850
  errors:
6713
- - errMsg: "`start_date` and `end_date` must either both be provided or both be omitted."
6851
+ - errMsg: "`start_month` and `end_month` must either both be provided or both be omitted."
6714
6852
  invalid range:
6715
6853
  value:
6716
6854
  message: Request Validation Failure
6717
6855
  errors:
6718
- - errMsg: "`start_date` must be less than or equal to `end_date`."
6719
- not first of month:
6856
+ - errMsg: "`end_month` may not be earlier than `start_month`."
6857
+ invalid month format:
6858
+ value:
6859
+ message: Invalid Request Parameters
6860
+ errors:
6861
+ - errMsg: "Invalid value for parameter: 'start_month'. '2026-06-01' is not a valid month in YYYY-MM format."
6862
+ future start month:
6720
6863
  value:
6721
6864
  message: Request Validation Failure
6722
6865
  errors:
6723
- - errMsg: "`start_date` and `end_date` must both be the first day of a month."
6724
- future start date:
6866
+ - errMsg: "`start_month` must not be in the future."
6867
+ future end month:
6725
6868
  value:
6726
6869
  message: Request Validation Failure
6727
6870
  errors:
6728
- - errMsg: "`start_date` must not be in the future."
6871
+ - errMsg: "`end_month` must not be in the future."
6729
6872
  "401":
6730
6873
  $ref: "#/components/responses/unauthorizedToken"
6731
6874
  "429":
@@ -6737,23 +6880,16 @@ paths:
6737
6880
  tags:
6738
6881
  - balance_history
6739
6882
  summary: Get balance history for an account
6740
- description: >-
6741
- Retrieve historical balance entries for one manual, Plaid, manual crypto,
6742
- or deleted account. Crypto synced accounts require an additional `symbol` path parameter.<br><br>
6743
-
6744
- The `account_type` path parameter identifies the type of account and the
6745
- `account_id` path parameter identifies the specific id for that account type.<br><br>
6746
-
6747
- When `start_date` and `end_date` are both provided, they must be first-of-month
6748
- dates. `start_date` must not be in the future, while `end_date` may be in the future.
6749
- If one of `start_date` or `end_date` is provided, the other is required. If neither is
6750
- provided, all available history for the source is returned.
6883
+ description: |-
6884
+ 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>
6885
+ 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>
6886
+ `start_month`, `end_month`, and current-month entries behave as described in [GET /balance_history](#tag/balance-history/GET/balance_history).
6751
6887
  operationId: getBalanceHistoryForAccount
6752
6888
  parameters:
6753
6889
  - name: account_type
6754
6890
  in: path
6755
6891
  required: true
6756
- description: Source family to retrieve. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
6892
+ description: Account family to retrieve. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
6757
6893
  schema:
6758
6894
  type: string
6759
6895
  enum: [manual, plaid, crypto_manual, deleted]
@@ -6764,23 +6900,27 @@ paths:
6764
6900
  schema:
6765
6901
  type: integer
6766
6902
  format: int32
6767
- - name: start_date
6903
+ - name: start_month
6768
6904
  in: query
6769
- 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.
6905
+ description: >-
6906
+ Optional. Same format and constraints as `start_month` on
6907
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
6770
6908
  required: false
6771
6909
  schema:
6772
6910
  type: string
6773
- format: date
6774
- - name: end_date
6911
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
6912
+ - name: end_month
6775
6913
  in: query
6776
- 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.
6914
+ description: >-
6915
+ Optional. Same format and constraints as `end_month` on
6916
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
6777
6917
  required: false
6778
6918
  schema:
6779
6919
  type: string
6780
- format: date
6920
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
6781
6921
  responses:
6782
6922
  "200":
6783
- description: Historical balance entries for the requested source
6923
+ description: Monthly balance history for the requested source
6784
6924
  content:
6785
6925
  application/json:
6786
6926
  schema:
@@ -6793,14 +6933,16 @@ paths:
6793
6933
  type: manual
6794
6934
  manual_account_id: 119807
6795
6935
  balances:
6796
- - id: 201
6797
- date: "2026-01-01"
6936
+ - type: historical
6937
+ id: 201
6938
+ month: "2026-01"
6798
6939
  balance: "41000.0000"
6799
6940
  currency: usd
6800
6941
  to_base: 41000
6801
6942
  crypto_balance: null
6802
- - id: 202
6803
- date: "2026-02-01"
6943
+ - type: historical
6944
+ id: 202
6945
+ month: "2026-02"
6804
6946
  balance: "41211.8000"
6805
6947
  currency: usd
6806
6948
  to_base: 41211.8
@@ -6819,8 +6961,9 @@ paths:
6819
6961
  mask: "1234"
6820
6962
  symbol: null
6821
6963
  balances:
6822
- - id: 501
6823
- date: "2026-01-01"
6964
+ - type: historical
6965
+ id: 501
6966
+ month: "2026-01"
6824
6967
  balance: "1250.0000"
6825
6968
  currency: usd
6826
6969
  to_base: 1250
@@ -6832,16 +6975,16 @@ paths:
6832
6975
  schema:
6833
6976
  $ref: "#/components/schemas/errorResponseObject"
6834
6977
  examples:
6835
- missing paired date:
6978
+ missing paired month:
6836
6979
  value:
6837
6980
  message: Request Validation Failure
6838
6981
  errors:
6839
- - errMsg: "`start_date` and `end_date` must either both be provided or both be omitted."
6840
- invalid range:
6982
+ - errMsg: "`start_month` and `end_month` must either both be provided or both be omitted."
6983
+ invalid month format:
6841
6984
  value:
6842
- message: Request Validation Failure
6985
+ message: Invalid Request Parameters
6843
6986
  errors:
6844
- - errMsg: "`start_date` must be less than or equal to `end_date`."
6987
+ - errMsg: "Invalid value for parameter: 'start_month'. '2026-06-01' is not a valid month in YYYY-MM format."
6845
6988
  "401":
6846
6989
  $ref: "#/components/responses/unauthorizedToken"
6847
6990
  "404":
@@ -6860,7 +7003,7 @@ paths:
6860
7003
  value:
6861
7004
  message: Not Found
6862
7005
  errors:
6863
- - errMsg: "There is no deleted balance history source with the id: 99999999."
7006
+ - errMsg: "Deleted balance history source 99999999 was not found."
6864
7007
  "429":
6865
7008
  $ref: "#/components/responses/rateLimited"
6866
7009
  "500":
@@ -6869,37 +7012,20 @@ paths:
6869
7012
  tags:
6870
7013
  - balance_history
6871
7014
  summary: Upsert balance history for an account
6872
- description: >-
6873
- Upsert one or more historical balance entries for a single manual, Plaid,
6874
- manual crypto, or deleted acount. Crypto synced accounts require an additional `symbol` path parameter.<br><br>
6875
-
6876
- The `account_type` path parameter identifies the the type of account and the
6877
- `account_id` path parameter identifies the specific id for that account type.<br><br>
6878
-
6879
- Submit one or more entries in the `balances` array. Each entry must specify
6880
- a `date` and `balance` value.<br><br>
6881
-
6882
- Balance history is monthly. Each entry's `date` must be the first day of
6883
- a month and must not be in the future.<br><br>
6884
-
6885
- `currency` may be provided for any balance entry. If omitted, it defaults
6886
- to the account currency for manual/Plaid accounts, or the user's primary
6887
- currency for crypto/deleted accounts.<br><br>
6888
-
6889
- `symbol` is optional for `crypto_manual` accounts, tolerated for `deleted`
6890
- accounts, and invalid for `manual` or `plaid` accounts.<br><br>
6891
-
6892
- `crypto_balance` may be provided for `crypto_manual` and `deleted` accounts,
6893
- and is invalid for `manual` or `plaid` accounts.<br><br>
6894
-
6895
- Use `PUT /v2/balance_history/deleted/{account_id}/details` to update
6896
- deleted-source metadata.
7015
+ description: |-
7016
+ 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>
7017
+ 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>
7018
+ 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>
7019
+ `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>
7020
+ `symbol` may be set for `crypto_manual` (optional) and `deleted` (tolerated) accounts. Do not provide it for `manual` or `plaid` accounts.<br><br>
7021
+ `crypto_balance` may be provided for `crypto_manual` and `deleted` accounts. It is invalid for `manual` or `plaid` accounts.<br><br>
7022
+ The response contains only the `type: historical` balance entries that were submitted in this request.
6897
7023
  operationId: upsertBalanceHistoryForAccount
6898
7024
  parameters:
6899
7025
  - name: account_type
6900
7026
  in: path
6901
7027
  required: true
6902
- description: Source family to update. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
7028
+ description: Account family to update. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
6903
7029
  schema:
6904
7030
  type: string
6905
7031
  enum: [manual, plaid, crypto_manual, deleted]
@@ -6920,88 +7046,105 @@ paths:
6920
7046
  manual account bulk upsert:
6921
7047
  value:
6922
7048
  balances:
6923
- - date: "2026-03-01"
7049
+ - month: "2026-03"
6924
7050
  balance: "41500.0000"
6925
- - date: "2026-04-01"
7051
+ - month: "2026-04"
6926
7052
  balance: "41625.5000"
6927
7053
  crypto manual balance with symbol:
6928
7054
  value:
6929
7055
  balances:
6930
- - date: "2026-03-01"
7056
+ - month: "2026-03"
6931
7057
  balance: "56011.1200"
6932
7058
  symbol: btc
6933
7059
  crypto_balance: "0.852341920145782301"
6934
7060
  deleted account bulk upsert:
6935
7061
  value:
6936
7062
  balances:
6937
- - date: "2026-03-01"
7063
+ - month: "2026-03"
6938
7064
  symbol: btc
6939
7065
  crypto_balance: "0.020000000000000000"
6940
7066
  currency: usd
6941
- balance: "1255.0000"
7067
+ balance: "1255"
6942
7068
  get-shaped balance entry input:
6943
7069
  value:
6944
7070
  balances:
6945
7071
  - id: 601
6946
- date: "2026-03-01"
7072
+ month: "2026-03"
6947
7073
  balance: "41500.0000"
6948
7074
  currency: usd
6949
7075
  to_base: 41500
6950
7076
  crypto_balance: null
6951
- partial success request:
6952
- value:
6953
- balances:
6954
- - date: "2026-03-01"
6955
- balance: "41500.0000"
6956
- - date: "2026-04-01"
6957
- balance: "41625.5000"
6958
- symbol: btc
6959
7077
  responses:
6960
7078
  "200":
6961
- description: One or more balance history entries were processed
7079
+ description: >-
7080
+ Returns only the `type: historical` entries modified by this request.
7081
+ Other historical entries for the account are omitted from `balances`.
6962
7082
  content:
6963
7083
  application/json:
6964
7084
  schema:
6965
- $ref: "#/components/schemas/upsertBalanceHistoryResponseObject"
7085
+ $ref: "#/components/schemas/balanceHistoryAccountObject"
6966
7086
  examples:
6967
- balances updated:
7087
+ manual account bulk upsert:
7088
+ summary: Two upserted entries returned (not full account history)
6968
7089
  value:
6969
- updated_balance_history:
6970
- source:
6971
- type: manual
6972
- manual_account_id: 119807
6973
- balances:
6974
- - id: 601
6975
- date: "2026-03-01"
6976
- balance: "41500.0000"
6977
- currency: usd
6978
- to_base: 41500
6979
- crypto_balance: null
6980
- - id: 602
6981
- date: "2026-04-01"
6982
- balance: "41625.5000"
6983
- currency: usd
6984
- to_base: 41625.5
6985
- crypto_balance: null
6986
- errors: []
6987
- partial success:
6988
- value:
6989
- updated_balance_history:
6990
- source:
6991
- type: manual
6992
- manual_account_id: 119807
6993
- balances:
6994
- - id: 601
6995
- date: "2026-03-01"
6996
- balance: "41500.0000"
6997
- currency: usd
6998
- to_base: 41500
6999
- crypto_balance: null
7000
- errors:
7001
- - request_balances_index: 1
7002
- message: "`symbol` may not be set when `account_type` is `manual` or `plaid`."
7090
+ source:
7091
+ type: manual
7092
+ manual_account_id: 119807
7093
+ balances:
7094
+ - type: historical
7095
+ id: 601
7096
+ month: "2026-03"
7097
+ balance: "41500.0000"
7098
+ currency: usd
7099
+ to_base: 41500
7100
+ crypto_balance: null
7101
+ - type: historical
7102
+ id: 602
7103
+ month: "2026-04"
7104
+ balance: "41625.5000"
7105
+ currency: usd
7106
+ to_base: 41625.5
7107
+ crypto_balance: null
7108
+ crypto manual balance with symbol:
7109
+ summary: Single upserted entry returned
7110
+ value:
7111
+ source:
7112
+ type: crypto_manual
7113
+ crypto_manual_id: 22001
7114
+ symbol: btc
7115
+ balances:
7116
+ - type: historical
7117
+ id: 603
7118
+ month: "2026-03"
7119
+ balance: "56011.1200"
7120
+ currency: usd
7121
+ to_base: 56011.12
7122
+ crypto_balance: "0.852341920145782301"
7123
+ deleted account bulk upsert:
7124
+ summary: Single upserted entry returned
7125
+ value:
7126
+ source:
7127
+ type: deleted
7128
+ deleted_account_id: 91
7129
+ name: Savings
7130
+ institution_name: Old Bank
7131
+ display_name: Closed Savings
7132
+ account_type: savings
7133
+ subtype: savings
7134
+ mask: "1234"
7135
+ symbol: btc
7136
+ balances:
7137
+ - type: historical
7138
+ id: 504
7139
+ month: "2026-03"
7140
+ balance: "1255"
7141
+ currency: usd
7142
+ to_base: 1255
7143
+ crypto_balance: "0.020000000000000000"
7003
7144
  "400":
7004
- description: Bad Request
7145
+ description: >-
7146
+ Bad Request. If any entry in `balances` fails validation, the entire
7147
+ request is rejected and no entries are updated.
7005
7148
  content:
7006
7149
  application/json:
7007
7150
  schema:
@@ -7012,26 +7155,45 @@ paths:
7012
7155
  message: Invalid Request Body
7013
7156
  errors:
7014
7157
  - errMsg: "Missing required property 'balances' in request body."
7158
+ empty balances array:
7159
+ value:
7160
+ message: Invalid Request Body
7161
+ errors:
7162
+ - errMsg: "Invalid value for property 'balances'. Array must contain at least 1 element(s)"
7015
7163
  invalid property:
7016
7164
  value:
7017
7165
  message: Invalid Request Body
7018
7166
  errors:
7019
7167
  - errMsg: "Invalid property 'foo' in request body."
7020
- invalid date:
7168
+ invalid month format:
7169
+ value:
7170
+ message: Invalid Request Body
7171
+ errors:
7172
+ - errMsg: "Invalid value for property 'balances.0.month'. '2026-06-01' is not a valid month in YYYY-MM format."
7173
+ current month:
7021
7174
  value:
7022
7175
  message: Request Validation Failure
7023
7176
  errors:
7024
- - errMsg: "`date` must be the first day of a month."
7025
- future date:
7177
+ - errMsg: "`month` must not be the current month."
7178
+ request_balances_index: 0
7179
+ future month:
7026
7180
  value:
7027
7181
  message: Request Validation Failure
7028
7182
  errors:
7029
- - errMsg: "`date` must not be in the future."
7183
+ - errMsg: "`month` must not be in the future."
7184
+ request_balances_index: 1
7030
7185
  crypto balance not allowed:
7031
7186
  value:
7032
7187
  message: Request Validation Failure
7033
7188
  errors:
7034
7189
  - errMsg: "`crypto_balance` may only be set when `account_type` is `crypto_manual` or `deleted`."
7190
+ request_balances_index: 0
7191
+ invalid entry in bulk request:
7192
+ value:
7193
+ message: Request Validation Failure
7194
+ errors:
7195
+ - errMsg: "`symbol` may only be set when `account_type` is `crypto_manual` or `deleted`."
7196
+ request_balances_index: 1
7035
7197
  "401":
7036
7198
  $ref: "#/components/responses/unauthorizedToken"
7037
7199
  "404":
@@ -7052,15 +7214,14 @@ paths:
7052
7214
  tags:
7053
7215
  - balance_history
7054
7216
  summary: Delete all balance history for an account
7055
- description: >-
7056
- Delete all historical balance entries for a single manual, Plaid,
7057
- manual crypto, or deleted account. Crypto synced accounts require an additional `symbol` path parameter.
7217
+ description: |-
7218
+ 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}).
7058
7219
  operationId: deleteBalanceHistoryForAccount
7059
7220
  parameters:
7060
7221
  - name: account_type
7061
7222
  in: path
7062
7223
  required: true
7063
- description: Source family to delete. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
7224
+ description: Account family to delete. Use `manual`, `plaid`, `crypto_manual`, or `deleted`.
7064
7225
  schema:
7065
7226
  type: string
7066
7227
  enum: [manual, plaid, crypto_manual, deleted]
@@ -7097,16 +7258,10 @@ paths:
7097
7258
  tags:
7098
7259
  - balance_history
7099
7260
  summary: Get balance history for a synced crypto symbol
7100
- description: >-
7101
- Retrieve historical balance entries for a single synced crypto symbol stream.<br><br>
7102
-
7103
- Use the `crypto_synced` account id together with a `symbol` path parameter
7104
- to select one balance stream within that synced crypto account.<br><br>
7105
-
7106
- When `start_date` and `end_date` are both provided, they must be first-of-month
7107
- dates. `start_date` must not be in the future, while `end_date` may be in the future.
7108
- If one of `start_date` or `end_date` is provided, the other is required. If neither is
7109
- provided, all available history for the symbol stream is returned.
7261
+ description: |-
7262
+ Retrieve monthly balance history for a single synced crypto symbol stream.<br><br>
7263
+ The path selects one balance stream with a synced crypto account id and `symbol`.<br><br>
7264
+ `start_month`, `end_month`, and current-month entries behave as described in [GET /balance_history](#tag/balance-history/GET/balance_history).
7110
7265
  operationId: getBalanceHistoryForCryptoSynced
7111
7266
  parameters:
7112
7267
  - name: account_id
@@ -7124,23 +7279,27 @@ paths:
7124
7279
  type: string
7125
7280
  minLength: 1
7126
7281
  maxLength: 25
7127
- - name: start_date
7282
+ - name: start_month
7128
7283
  in: query
7129
- 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.
7284
+ description: >-
7285
+ Optional. Same format and constraints as `start_month` on
7286
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
7130
7287
  required: false
7131
7288
  schema:
7132
7289
  type: string
7133
- format: date
7134
- - name: end_date
7290
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7291
+ - name: end_month
7135
7292
  in: query
7136
- 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.
7293
+ description: >-
7294
+ Optional. Same format and constraints as `end_month` on
7295
+ [GET /balance_history](#tag/balance-history/GET/balance_history).
7137
7296
  required: false
7138
7297
  schema:
7139
7298
  type: string
7140
- format: date
7299
+ pattern: '^\d{4}-(0[1-9]|1[0-2])$'
7141
7300
  responses:
7142
7301
  "200":
7143
- description: Historical balance entries for the synced crypto symbol stream
7302
+ description: Monthly balance history for the synced crypto symbol stream
7144
7303
  content:
7145
7304
  application/json:
7146
7305
  schema:
@@ -7152,8 +7311,9 @@ paths:
7152
7311
  crypto_synced_id: 33004
7153
7312
  symbol: btc
7154
7313
  balances:
7155
- - id: 401
7156
- date: "2026-02-01"
7314
+ - type: historical
7315
+ id: 401
7316
+ month: "2026-02"
7157
7317
  balance: "6231.2800"
7158
7318
  currency: usd
7159
7319
  to_base: 6231.28
@@ -7165,16 +7325,16 @@ paths:
7165
7325
  schema:
7166
7326
  $ref: "#/components/schemas/errorResponseObject"
7167
7327
  examples:
7168
- missing paired date:
7328
+ missing paired month:
7169
7329
  value:
7170
7330
  message: Request Validation Failure
7171
7331
  errors:
7172
- - errMsg: "`start_date` and `end_date` must either both be provided or both be omitted."
7173
- invalid range:
7332
+ - errMsg: "`start_month` and `end_month` must either both be provided or both be omitted."
7333
+ invalid month format:
7174
7334
  value:
7175
- message: Request Validation Failure
7335
+ message: Invalid Request Parameters
7176
7336
  errors:
7177
- - errMsg: "`start_date` must be less than or equal to `end_date`."
7337
+ - errMsg: "Invalid value for parameter: 'start_month'. '2026-06-01' is not a valid month in YYYY-MM format."
7178
7338
  "401":
7179
7339
  $ref: "#/components/responses/unauthorizedToken"
7180
7340
  "404":
@@ -7193,7 +7353,7 @@ paths:
7193
7353
  value:
7194
7354
  message: Not Found
7195
7355
  errors:
7196
- - errMsg: "There is no synced crypto balance history stream for symbol 'doge' on account id: 33004."
7356
+ - errMsg: "There is no balance history for symbol 'doge' on this account."
7197
7357
  "429":
7198
7358
  $ref: "#/components/responses/rateLimited"
7199
7359
  "500":
@@ -7202,24 +7362,14 @@ paths:
7202
7362
  tags:
7203
7363
  - balance_history
7204
7364
  summary: Upsert balance history for a synced crypto symbol
7205
- description: >-
7206
- Upsert one or more historical balance entries for a single synced crypto
7207
- symbol stream.<br><br>
7208
-
7365
+ description: |-
7366
+ Upsert one or more historical balance entries for a single synced crypto symbol stream.<br><br>
7209
7367
  The path identifies both the synced crypto account and the symbol being updated.<br><br>
7210
-
7211
- Submit one or more entries in the `balances` array. Each entry must specify
7212
- a `date` and `balance` value.<br><br>
7213
-
7214
- Balance history is monthly. Each entry's `date` must be the first day of
7215
- a month and must not be in the future.<br><br>
7216
-
7217
- The request body must not include `symbol`; the symbol is supplied by the path.<br><br>
7218
-
7219
- `currency` may be provided for any balance entry. If omitted, it defaults
7220
- to the user's primary currency for synced crypto balances.<br><br>
7221
-
7222
- `crypto_balance` may be provided for synced crypto balances.
7368
+ 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>
7369
+ 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>
7370
+ `currency` may be provided for any balance entry. If omitted, it defaults to the user's primary currency for synced crypto balances.<br><br>
7371
+ `crypto_balance` may be provided for synced crypto balances.<br><br>
7372
+ The response contains only the `type: historical` balance entries that were submitted in this request.
7223
7373
  operationId: upsertBalanceHistoryForCryptoSynced
7224
7374
  parameters:
7225
7375
  - name: account_id
@@ -7247,68 +7397,49 @@ paths:
7247
7397
  synced crypto bulk upsert:
7248
7398
  value:
7249
7399
  balances:
7250
- - date: "2026-03-01"
7400
+ - month: "2026-03"
7251
7401
  balance: "6400.0000"
7252
7402
  crypto_balance: "0.100020003000400050"
7253
- - date: "2026-04-01"
7403
+ - month: "2026-04"
7254
7404
  balance: "6500.0000"
7255
7405
  crypto_balance: "0.100020003000400050"
7256
- partial success request:
7257
- value:
7258
- balances:
7259
- - date: "2026-03-01"
7260
- balance: "6400.0000"
7261
- crypto_balance: "0.100020003000400050"
7262
- - date: "2026-04-01"
7263
- balance: "not-a-number"
7264
7406
  responses:
7265
7407
  "200":
7266
- description: One or more balance history entries were processed
7408
+ description: >-
7409
+ Returns only the `type: historical` entries modified by this request.
7410
+ Other historical entries for the symbol stream are omitted from
7411
+ `balances`.
7267
7412
  content:
7268
7413
  application/json:
7269
7414
  schema:
7270
- $ref: "#/components/schemas/upsertBalanceHistoryResponseObject"
7415
+ $ref: "#/components/schemas/balanceHistoryAccountObject"
7271
7416
  examples:
7272
- balances updated:
7417
+ synced crypto bulk upsert:
7418
+ summary: Two upserted entries returned (not full symbol history)
7273
7419
  value:
7274
- updated_balance_history:
7275
- source:
7276
- type: crypto_synced
7277
- crypto_synced_id: 33004
7278
- symbol: btc
7279
- balances:
7280
- - id: 604
7281
- date: "2026-03-01"
7282
- balance: "6400.0000"
7283
- currency: usd
7284
- to_base: 6400
7285
- crypto_balance: "0.100020003000400050"
7286
- - id: 605
7287
- date: "2026-04-01"
7288
- balance: "6500.0000"
7289
- currency: usd
7290
- to_base: 6500
7291
- crypto_balance: "0.100020003000400050"
7292
- errors: []
7293
- partial success:
7294
- value:
7295
- updated_balance_history:
7296
- source:
7297
- type: crypto_synced
7298
- crypto_synced_id: 33004
7299
- symbol: btc
7300
- balances:
7301
- - id: 604
7302
- date: "2026-03-01"
7303
- balance: "6400.0000"
7304
- currency: usd
7305
- to_base: 6400
7306
- crypto_balance: "0.100020003000400050"
7307
- errors:
7308
- - request_balances_index: 1
7309
- message: "`balance` must be a valid numeric string or number."
7420
+ source:
7421
+ type: crypto_synced
7422
+ crypto_synced_id: 33004
7423
+ symbol: btc
7424
+ balances:
7425
+ - type: historical
7426
+ id: 604
7427
+ month: "2026-03"
7428
+ balance: "6400.0000"
7429
+ currency: usd
7430
+ to_base: 6400
7431
+ crypto_balance: "0.100020003000400050"
7432
+ - type: historical
7433
+ id: 605
7434
+ month: "2026-04"
7435
+ balance: "6500.0000"
7436
+ currency: usd
7437
+ to_base: 6500
7438
+ crypto_balance: "0.100020003000400050"
7310
7439
  "400":
7311
- description: Bad Request
7440
+ description: >-
7441
+ Bad Request. If any entry in `balances` fails validation, the entire
7442
+ request is rejected and no entries are updated.
7312
7443
  content:
7313
7444
  application/json:
7314
7445
  schema:
@@ -7319,16 +7450,40 @@ paths:
7319
7450
  message: Invalid Request Body
7320
7451
  errors:
7321
7452
  - errMsg: "Missing required property 'balances' in request body."
7322
- invalid date:
7453
+ empty balances array:
7454
+ value:
7455
+ message: Invalid Request Body
7456
+ errors:
7457
+ - errMsg: "Invalid value for property 'balances'. Array must contain at least 1 element(s)"
7458
+ invalid month format:
7459
+ value:
7460
+ message: Invalid Request Body
7461
+ errors:
7462
+ - errMsg: "Invalid value for property 'balances.0.month'. '2026-06-01' is not a valid month in YYYY-MM format."
7463
+ current month:
7323
7464
  value:
7324
7465
  message: Request Validation Failure
7325
7466
  errors:
7326
- - errMsg: "`date` must be the first day of a month."
7327
- future date:
7467
+ - errMsg: "`month` must not be the current month."
7468
+ request_balances_index: 0
7469
+ future month:
7328
7470
  value:
7329
7471
  message: Request Validation Failure
7330
7472
  errors:
7331
- - errMsg: "`date` must not be in the future."
7473
+ - errMsg: "`month` must not be in the future."
7474
+ request_balances_index: 1
7475
+ symbol mismatch:
7476
+ value:
7477
+ message: Request Validation Failure
7478
+ errors:
7479
+ - errMsg: "`symbol` in request body (doge) does not match the path symbol (eth)."
7480
+ request_balances_index: 0
7481
+ invalid entry in bulk request:
7482
+ value:
7483
+ message: Invalid Request Body
7484
+ errors:
7485
+ - errMsg: "`balance` must be a valid numeric string or number."
7486
+ request_balances_index: 1
7332
7487
  "401":
7333
7488
  $ref: "#/components/responses/unauthorizedToken"
7334
7489
  "404":
@@ -7347,7 +7502,7 @@ paths:
7347
7502
  value:
7348
7503
  message: Not Found
7349
7504
  errors:
7350
- - errMsg: "There is no synced crypto balance history stream for symbol 'doge' on account id: 33004."
7505
+ - errMsg: "There is no balance history for symbol 'doge' on this account."
7351
7506
  "429":
7352
7507
  $ref: "#/components/responses/rateLimited"
7353
7508
  "500":
@@ -7356,11 +7511,9 @@ paths:
7356
7511
  tags:
7357
7512
  - balance_history
7358
7513
  summary: Delete all balance history for a synced crypto symbol
7359
- description: >-
7514
+ description: |-
7360
7515
  Delete all historical balance entries for a single synced crypto symbol stream.<br><br>
7361
-
7362
- The path identifies both the synced crypto account and the symbol whose
7363
- history should be deleted.
7516
+ The path identifies both the synced crypto account and the symbol whose history should be deleted.
7364
7517
  operationId: deleteBalanceHistoryForCryptoSynced
7365
7518
  parameters:
7366
7519
  - name: account_id
@@ -7392,7 +7545,7 @@ paths:
7392
7545
  example:
7393
7546
  message: Not Found
7394
7547
  errors:
7395
- - errMsg: "There is no synced crypto balance history stream for symbol 'doge' on account id: 33004."
7548
+ - errMsg: "There is no balance history for symbol 'doge' on this account."
7396
7549
  "429":
7397
7550
  $ref: "#/components/responses/rateLimited"
7398
7551
  "500":
@@ -7402,20 +7555,30 @@ paths:
7402
7555
  tags:
7403
7556
  - balance_history
7404
7557
  summary: Delete a balance history entry
7405
- description: >-
7406
- Delete a single monthly balance history entry by its id.
7558
+ description: |-
7559
+ Delete a single stored (`type: historical`) monthly balance history entry by its id. Ephemeral `current` entries cannot be deleted this way.
7407
7560
  operationId: deleteBalanceHistoryEntry
7408
7561
  parameters:
7409
7562
  - name: id
7410
7563
  in: path
7411
7564
  required: true
7412
- description: Balance history row identifier to delete.
7565
+ description: Historical balance entry identifier to delete.
7413
7566
  schema:
7414
7567
  type: integer
7415
7568
  format: int32
7416
7569
  responses:
7417
7570
  "204":
7418
7571
  description: The balance history entry was deleted
7572
+ "400":
7573
+ description: Bad Request
7574
+ content:
7575
+ application/json:
7576
+ schema:
7577
+ $ref: "#/components/schemas/errorResponseObject"
7578
+ example:
7579
+ message: Invalid Path Parameters
7580
+ errors:
7581
+ - errMsg: "Invalid value type for path parameter: 'id'. Expected 'number', received 'string'."
7419
7582
  "401":
7420
7583
  $ref: "#/components/responses/unauthorizedToken"
7421
7584
  "404":
@@ -7437,12 +7600,9 @@ paths:
7437
7600
  tags:
7438
7601
  - balance_history
7439
7602
  summary: Update details for a deleted account
7440
- description: >-
7603
+ description: |-
7441
7604
  Update archived metadata for a deleted balance history source.<br><br>
7442
-
7443
- Pass the `deleted` source id returned on `source.deleted_account_id`.
7444
- This endpoint updates the stored deleted-source metadata used for all
7445
- historical entries associated with that deleted source.
7605
+ Pass the `deleted_account_id` from a `source.type: deleted` entry. The update applies to all historical entries associated with that deleted source.
7446
7606
  operationId: updateBalanceHistoryDetails
7447
7607
  parameters:
7448
7608
  - name: account_id
@@ -7490,7 +7650,7 @@ paths:
7490
7650
  example:
7491
7651
  message: Invalid Request Body
7492
7652
  errors:
7493
- - errMsg: "Request body must include at least one of: name, institution_name, display_name, account_type, subtype, mask."
7653
+ - errMsg: "At least one property must be provided: name, institution_name, display_name, account_type, subtype, mask."
7494
7654
  "401":
7495
7655
  $ref: "#/components/responses/unauthorizedToken"
7496
7656
  "404":
@@ -7502,7 +7662,7 @@ paths:
7502
7662
  example:
7503
7663
  message: Not Found
7504
7664
  errors:
7505
- - errMsg: "There is no deleted balance history source with the id: 99999999."
7665
+ - errMsg: "Deleted balance history source 99999999 was not found."
7506
7666
  "429":
7507
7667
  $ref: "#/components/responses/rateLimited"
7508
7668
  "500":
@@ -8516,19 +8676,19 @@ paths:
8516
8676
  description: Sets the maximum number of transactions to return. If
8517
8677
  more match the filter criteria, the response will include a
8518
8678
  `has_more` attribute set to `true`. See
8519
- [Pagination](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/pagination)
8679
+ [Pagination](https://lunchmoney.dev/v2/pagination)
8520
8680
  - name: offset
8521
8681
  in: query
8522
8682
  schema:
8523
8683
  type: integer
8524
8684
  description: Sets the offset for the records returned. This is
8525
8685
  typically set automatically in the header. See
8526
- [Pagination](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/pagination)
8686
+ [Pagination](https://lunchmoney.dev/v2/pagination)
8527
8687
  responses:
8528
8688
  "200":
8529
8689
  description: Returns an array of transactions. <br><br>The `has_more`
8530
8690
  property is set to `true` if more transactions are available. See
8531
- [Pagination](https://lm-v2-api-next-a7fabcab8e9a.herokuapp.com/v2/pagination)
8691
+ [Pagination](https://lunchmoney.dev/v2/pagination)
8532
8692
  content:
8533
8693
  application/json:
8534
8694
  schema:
@@ -10194,7 +10354,7 @@ paths:
10194
10354
  description: |
10195
10355
  The payee for the new grouped transaction.
10196
10356
  minLength: 0
10197
- maxLength: 1000
10357
+
10198
10358
  category_id:
10199
10359
  type: integer
10200
10360
  format: int64
@@ -10209,8 +10369,6 @@ paths:
10209
10369
  nullable: true
10210
10370
  description: |
10211
10371
  Notes for the grouped transaction.
10212
- minLength: 0
10213
- maxLength: 350
10214
10372
  status:
10215
10373
  type: string
10216
10374
  description: If set, must be either `reviewed` or
@@ -10754,9 +10912,8 @@ paths:
10754
10912
  - transactions (files)
10755
10913
  summary: Attach a file to a transaction
10756
10914
  operationId: attachFileToTransaction
10757
- description: >-
10758
- Attaches a file to a transaction. The file must be less than 10MB in size.<br><br>
10759
- The file will be attached to the transaction and can be downloaded from the link returned by a `GET /transactions/attachments/{file_id}` request.
10915
+ description: |-
10916
+ 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.
10760
10917
  parameters:
10761
10918
  - name: transaction_id
10762
10919
  in: path
@@ -10839,8 +10996,8 @@ paths:
10839
10996
  /transactions/attachments/{file_id}:
10840
10997
  get:
10841
10998
  summary: Get a url to download a file attachment
10842
- description: Returns a signed url that can be used to download the file
10843
- attachment.
10999
+ description: |-
11000
+ Returns a signed url that can be used to download the file attachment.
10844
11001
  operationId: getTransactionAttachmentUrl
10845
11002
  tags:
10846
11003
  - transactions (files)
@@ -11573,12 +11730,15 @@ paths:
11573
11730
  get:
11574
11731
  tags:
11575
11732
  - budgets
11576
- summary: Get budget settings
11577
- description: Returns the budget-related settings for the user's account.
11733
+ summary: Get budget period settings
11734
+ description: |-
11735
+ Returns budget period and display settings for the budget
11736
+ associated with this API token.<p> These control how budget **periods** are calculated
11737
+ (granularity, anchor date, rollover, and related options).
11578
11738
  operationId: getBudgetSettings
11579
11739
  responses:
11580
11740
  "200":
11581
- description: Budget settings for the account
11741
+ description: Budget period settings for the current budget
11582
11742
  content:
11583
11743
  application/json:
11584
11744
  schema:
@@ -11601,7 +11761,7 @@ paths:
11601
11761
  Note that `start_date` **must** be a valid budget period start for the account (based on the account's
11602
11762
  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>
11603
11763
 
11604
- Use the [budgets/settings](#tag/budgets/GET/budgets/settings) endpoint to view the account's budget settings.<br>
11764
+ Use the [/budgets/settings](#tag/budgets/GET/budgets/settings) endpoint to view the budget period settings for the account.<br>
11605
11765
  To view details for existing budgets, use the [summary](#tag/summary) endpoint.
11606
11766
  operationId: upsertBudget
11607
11767
  requestBody:
@@ -11672,7 +11832,7 @@ paths:
11672
11832
  period settings). If an invalid `start_date` is provided, the request
11673
11833
  will fail with an error that indicates what the previous and next valid
11674
11834
  start dates are.<p> Use the
11675
- [budgets/settings](#tag/budgets/GET/budgets/settings) endpoint to view
11835
+ [/budgets/settings](#tag/budgets/GET/budgets/settings) endpoint to view
11676
11836
  the account's budget settings.<br> To view details for existing budgets,
11677
11837
  use the [summary](#tag/summary) endpoint.
11678
11838
  operationId: deleteBudget
@@ -11730,4 +11890,3 @@ paths:
11730
11890
 
11731
11891
  security:
11732
11892
  - bearerSecurity: []
11733
- - cookieAuth: []