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

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,37 @@ 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).
5
+ Welcome to the Lunch Money v2 API reference. This is the **v2.11.0** spec. It includes previews of the proposed `/crypto` and `/balance_history` endpoints. Only the mock service works with these endpoints.<br><br>
6
+ The most recent stable version of the API is v2.9.4 and is available at:
7
+ `https://api.lunchmoney.dev/v2`
13
8
 
14
9
  ------------------------------------------------------------------------------------------------
15
- Welcome to the Lunch Money v2 API.
16
10
 
17
- A working version of this API is now available through these docs, or directly at:
11
+ ### Introduction
18
12
 
19
- `https://api.lunchmoney.dev/v2`
13
+ 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
14
 
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>
15
+ <span class="red-text"><strong>The v2 API is in open alpha and is still subject to change. Use the mock server or a test budget when getting started.</strong></span>
24
16
 
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).
17
+ **Static Mock Server**
26
18
 
27
- ### Static Mock Server
19
+ Explore the API without an access token or risk to real data. Select **"Static Mock v2 Lunch Money API Server"** from the Server dropdown, then set your Bearer token to any string with 11 or more characters.
28
20
 
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.
21
+ **Client Libraries & SDKs**
33
22
 
34
- ### Migrating from V1
23
+ An official TypeScript SDK is available on [NPM](https://www.npmjs.com/package/@lunch-money/v2-api-spec) and [GitHub](https://github.com/lunch-money/lunch-money-js-v2). For Python or other languages, see [lunchmoney-clients](https://github.com/juftin/lunchmoney-clients) or generate a client from this OpenAPI spec.
35
24
 
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.
25
+ **Migrating from v1**
37
26
 
38
- ### Acknowledgments
27
+ The v2 API is not backwards compatible with v1. See the [Migration Guide](https://alpha.lunchmoney.dev/v2/migration-guide) for details.
39
28
 
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)
29
+ **Useful links**
30
+ - [Developer Portal](https://alpha.lunchmoney.dev/v2/introduction)
31
+ - [Getting Started Guide](https://alpha.lunchmoney.dev/v2/getting-started)
32
+ - [v2 API Overview](https://alpha.lunchmoney.dev/v2/overview)
33
+ - [Version History](https://alpha.lunchmoney.dev/v2/version-history)
34
+ - [Migration Guide](https://alpha.lunchmoney.dev/v2/migration-guide)
35
+ - [Rate Limits](https://alpha.lunchmoney.dev/v2/rate-limits)
49
36
  termsOfService: https://lunchmoney.dev/#current-status
50
37
  contact:
51
38
  email: devsupport@lunchmoney.app
@@ -679,7 +666,6 @@ components:
679
666
  cryptoManualObject:
680
667
  type: object
681
668
  title: manual crypto object
682
- x-internal: true
683
669
  additionalProperties: false
684
670
  properties:
685
671
  id:
@@ -719,13 +705,22 @@ components:
719
705
  description: CoinGecko identifier associated with this balance
720
706
  to_base:
721
707
  type: number
722
- description: Balance converted to the user's primary currency
708
+ nullable: true
709
+ description: Balance converted to the user's primary currency. May be null if no conversion was available.
723
710
  balance_as_of:
724
711
  type: string
725
712
  format: date-time
726
713
  nullable: true
727
- description: Date/time the balance was last updated in ISO 8601
728
- extended format
714
+ description: Date/time the manual balance record was last updated in
715
+ ISO 8601 extended format. This is currently based on the manual
716
+ crypto record's updated_at timestamp.
717
+ exchange_rate_as_of:
718
+ type: string
719
+ format: date-time
720
+ nullable: true
721
+ description: Date/time the exchange rate used to calculate to_base was
722
+ last updated in ISO 8601 extended format. Null when no exchange rate was
723
+ used or no conversion was available.
729
724
  created_by_name:
730
725
  type: string
731
726
  nullable: true
@@ -750,6 +745,7 @@ components:
750
745
  - coingecko_id
751
746
  - to_base
752
747
  - balance_as_of
748
+ - exchange_rate_as_of
753
749
  - created_by_name
754
750
  - created_at
755
751
  - updated_at
@@ -758,7 +754,6 @@ components:
758
754
  cryptoSyncedBalance:
759
755
  type: object
760
756
  title: synced crypto balance object
761
- x-internal: true
762
757
  additionalProperties: false
763
758
  properties:
764
759
  name:
@@ -783,13 +778,21 @@ components:
783
778
  description: CoinGecko identifier associated with this balance
784
779
  to_base:
785
780
  type: number
786
- description: Balance converted to the user's primary currency
781
+ nullable: true
782
+ description: Balance converted to the user's primary currency. May be null if no conversion was available.
787
783
  balance_as_of:
788
784
  type: string
789
785
  format: date-time
790
786
  nullable: true
791
787
  description: Date/time the balance was last updated in ISO 8601
792
- extended format
788
+ extended format.
789
+ exchange_rate_as_of:
790
+ type: string
791
+ format: date-time
792
+ nullable: true
793
+ description: Date/time the exchange rate used to calculate to_base was
794
+ last updated in ISO 8601 extended format. Null when no exchange rate was
795
+ used or no conversion was available.
793
796
  updated_at:
794
797
  type: string
795
798
  format: date-time
@@ -802,12 +805,12 @@ components:
802
805
  - coingecko_id
803
806
  - to_base
804
807
  - balance_as_of
808
+ - exchange_rate_as_of
805
809
  - updated_at
806
810
 
807
811
  syncedCryptoAccount:
808
812
  type: object
809
813
  title: synced crypto account
810
- x-internal: true
811
814
  additionalProperties: false
812
815
  properties:
813
816
  id:
@@ -1072,8 +1075,16 @@ components:
1072
1075
  type: string
1073
1076
  format: date-time
1074
1077
  nullable: true
1075
- description: System defined date/time the balance was last updated in
1076
- ISO 8601 extended format. Ignored if set
1078
+ description: System defined date/time the manual balance record was
1079
+ last updated in ISO 8601 extended format. Ignored if set
1080
+ x-updatable: false
1081
+ exchange_rate_as_of:
1082
+ type: string
1083
+ format: date-time
1084
+ nullable: true
1085
+ description: System defined date/time the exchange rate used to
1086
+ calculate to_base was observed in ISO 8601 extended format. Ignored
1087
+ if set
1077
1088
  x-updatable: false
1078
1089
  created_by_name:
1079
1090
  type: string
@@ -1614,6 +1625,7 @@ components:
1614
1625
  type: object
1615
1626
  description: Source information for a manual account balance history entry.
1616
1627
  additionalProperties: false
1628
+ x-internal: true
1617
1629
  properties:
1618
1630
  type:
1619
1631
  type: string
@@ -1631,6 +1643,7 @@ components:
1631
1643
  type: object
1632
1644
  description: Source information for a Plaid-synced account balance history entry.
1633
1645
  additionalProperties: false
1646
+ x-internal: true
1634
1647
  properties:
1635
1648
  type:
1636
1649
  type: string
@@ -1648,6 +1661,7 @@ components:
1648
1661
  type: object
1649
1662
  description: Source information for a manually-tracked cryptocurrency balance history entry.
1650
1663
  additionalProperties: false
1664
+ x-internal: true
1651
1665
  properties:
1652
1666
  type:
1653
1667
  type: string
@@ -1750,9 +1764,10 @@ components:
1750
1764
  - subtype
1751
1765
  - mask
1752
1766
  - symbol
1767
+
1753
1768
  balanceHistoryAccountObject:
1754
1769
  type: object
1755
- title: balance history account object
1770
+ title: balance history for an account object
1756
1771
  additionalProperties: false
1757
1772
  description: Historical balance entries grouped under a single account source.
1758
1773
  properties:
@@ -1787,6 +1802,7 @@ components:
1787
1802
  type: object
1788
1803
  title: balance history entry object
1789
1804
  additionalProperties: false
1805
+ x-internal: true
1790
1806
  description: A historical balance entry for a single account on a single date.
1791
1807
  properties:
1792
1808
  id:
@@ -1898,37 +1914,6 @@ components:
1898
1914
  required:
1899
1915
  - balances
1900
1916
 
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
1917
  updateBalanceHistoryDetailsRequestObject:
1933
1918
  type: object
1934
1919
  x-internal: true
@@ -2495,8 +2480,6 @@ components:
2495
2480
  Any transaction notes set by the user or by
2496
2481
  a matched recurring item. This will match the value
2497
2482
  displayed in notes field on the transactions page in the Lunch Money app.
2498
- minLength: 0
2499
- maxLength: 350
2500
2483
  status:
2501
2484
  type: string
2502
2485
  # description: >
@@ -2732,8 +2715,6 @@ components:
2732
2715
  Any transaction notes set by the user or by
2733
2716
  a matched recurring item. This will match the value
2734
2717
  displayed in notes field on the transactions page in the Lunch Money app.
2735
- minLength: 0
2736
- maxLength: 350
2737
2718
  status:
2738
2719
  type: string
2739
2720
  description: >
@@ -2978,8 +2959,6 @@ components:
2978
2959
  Any transaction notes set by the user or by
2979
2960
  a matched recurring item. This will match the value
2980
2961
  displayed in notes field on the transactions page in the Lunch Money app.
2981
- minLength: 0
2982
- maxLength: 350
2983
2962
  manual_account_id:
2984
2963
  type: integer
2985
2964
  format: int32
@@ -3117,8 +3096,6 @@ components:
3117
3096
  description: >
3118
3097
  New notes for the transaction. Set this to an empty string to clear
3119
3098
  the existing notes.
3120
- minLength: 0
3121
- maxLength: 350
3122
3099
  x-updatable: true
3123
3100
  manual_account_id:
3124
3101
  type: integer
@@ -3301,6 +3278,7 @@ components:
3301
3278
  amount.
3302
3279
  payee:
3303
3280
  type: string
3281
+ minLength: 0
3304
3282
  description: The payee for the child transaction. Will inherit the
3305
3283
  original payee from the parent if not defined.
3306
3284
  date:
@@ -3323,7 +3301,6 @@ components:
3323
3301
  format: int32
3324
3302
  notes:
3325
3303
  type: string
3326
- maxLength: 350
3327
3304
  description: Will inherit notes from parent if not defined.
3328
3305
  required:
3329
3306
  - amount
@@ -4114,6 +4091,7 @@ components:
4114
4091
  # - `cad`: Canadian Dollar
4115
4092
  # - `cdf`: Congolese Franc
4116
4093
  # - `chf`: Swiss Franc
4094
+ # - `clf`: Chilean Unit of Account (UF)
4117
4095
  # - `clp`: Chilean Peso
4118
4096
  # - `cny`: Chinese Yuan
4119
4097
  # - `cop`: Colombian Peso
@@ -4129,6 +4107,7 @@ components:
4129
4107
  # - `egp`: Egyptian Pound
4130
4108
  # - `ern`: Eritrean Nakfa
4131
4109
  # - `etb`: Ethiopian Birr
4110
+ # - `eth`: Ethereum
4132
4111
  # - `eur`: Euro
4133
4112
  # - `fjd`: Fijian Dollar
4134
4113
  # - `fkp`: Falkland Islands Pound
@@ -4236,6 +4215,7 @@ components:
4236
4215
  # - `uyu`: Uruguayan Peso
4237
4216
  # - `uzs`: Uzbekistan Som
4238
4217
  # - `vef`: Venezuelan Bolívar
4218
+ # - `ves`: Venezuelan Bolívar Sotiemas
4239
4219
  # - `vnd`: Vietnamese Dong
4240
4220
  # - `vuv`: Vanuatu Vatu
4241
4221
  # - `wst`: Samoan Tala
@@ -4279,6 +4259,7 @@ components:
4279
4259
  - cad
4280
4260
  - cdf
4281
4261
  - chf
4262
+ - clf
4282
4263
  - clp
4283
4264
  - cny
4284
4265
  - cop
@@ -4294,6 +4275,7 @@ components:
4294
4275
  - egp
4295
4276
  - ern
4296
4277
  - etb
4278
+ - eth
4297
4279
  - eur
4298
4280
  - fjd
4299
4281
  - fkp
@@ -4401,6 +4383,7 @@ components:
4401
4383
  - uyu
4402
4384
  - uzs
4403
4385
  - vef
4386
+ - ves
4404
4387
  - vnd
4405
4388
  - vuv
4406
4389
  - wst
@@ -5905,6 +5888,7 @@ paths:
5905
5888
  coingecko_id: bitcoin
5906
5889
  to_base: 53124.72
5907
5890
  balance_as_of: "2026-02-25T14:22:10.000Z"
5891
+ exchange_rate_as_of: "2026-02-25T14:10:00.000Z"
5908
5892
  created_by_name: User 1
5909
5893
  created_at: "2025-11-12T20:14:32.000Z"
5910
5894
  updated_at: "2026-02-25T14:22:10.000Z"
@@ -5962,6 +5946,7 @@ paths:
5962
5946
  coingecko_id: ethereum
5963
5947
  to_base: 28998.44
5964
5948
  balance_as_of: "2026-03-01T09:20:41.000Z"
5949
+ exchange_rate_as_of: "2026-03-01T09:15:00.000Z"
5965
5950
  created_by_name: User 1
5966
5951
  created_at: "2026-03-01T09:20:41.000Z"
5967
5952
  updated_at: "2026-03-01T09:20:41.000Z"
@@ -6029,6 +6014,7 @@ paths:
6029
6014
  coingecko_id: bitcoin
6030
6015
  to_base: 53124.72
6031
6016
  balance_as_of: "2026-02-25T14:22:10.000Z"
6017
+ exchange_rate_as_of: "2026-02-25T14:10:00.000Z"
6032
6018
  created_by_name: User 1
6033
6019
  created_at: "2025-11-12T20:14:32.000Z"
6034
6020
  updated_at: "2026-02-25T14:22:10.000Z"
@@ -6106,6 +6092,7 @@ paths:
6106
6092
  coingecko_id: bitcoin
6107
6093
  to_base: 56011.12
6108
6094
  balance_as_of: "2026-03-01T09:41:18.000Z"
6095
+ exchange_rate_as_of: "2026-03-01T09:35:00.000Z"
6109
6096
  created_by_name: User 1
6110
6097
  created_at: "2025-11-12T20:14:32.000Z"
6111
6098
  updated_at: "2026-02-25T14:22:10.000Z"
@@ -6126,6 +6113,7 @@ paths:
6126
6113
  coingecko_id: bitcoin
6127
6114
  to_base: 56011.12
6128
6115
  balance_as_of: "2026-03-01T09:41:18.000Z"
6116
+ exchange_rate_as_of: "2026-03-01T09:35:00.000Z"
6129
6117
  created_by_name: User 1
6130
6118
  created_at: "2025-11-12T20:14:32.000Z"
6131
6119
  updated_at: "2026-03-01T09:41:18.000Z"
@@ -6255,6 +6243,7 @@ paths:
6255
6243
  coingecko_id: ethereum
6256
6244
  to_base: 28998.44
6257
6245
  balance_as_of: "2026-02-25T14:25:00.000Z"
6246
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6258
6247
  updated_at: "2026-02-25T14:25:01.000Z"
6259
6248
  - name: BTC
6260
6249
  balance: "0.100020003000400050"
@@ -6262,6 +6251,7 @@ paths:
6262
6251
  coingecko_id: bitcoin
6263
6252
  to_base: 6231.28
6264
6253
  balance_as_of: "2026-02-25T14:25:00.000Z"
6254
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6265
6255
  updated_at: "2026-02-25T14:25:01.000Z"
6266
6256
  - id: 33005
6267
6257
  provider: kraken
@@ -6277,6 +6267,7 @@ paths:
6277
6267
  coingecko_id: ripple
6278
6268
  to_base: 1287.50
6279
6269
  balance_as_of: "2026-02-26T07:22:30.000Z"
6270
+ exchange_rate_as_of: "2026-02-26T07:10:00.000Z"
6280
6271
  updated_at: "2026-02-26T07:22:30.000Z"
6281
6272
  "401":
6282
6273
  $ref: "#/components/responses/unauthorizedToken"
@@ -6329,6 +6320,7 @@ paths:
6329
6320
  coingecko_id: ethereum
6330
6321
  to_base: 28998.44
6331
6322
  balance_as_of: "2026-02-25T14:25:00.000Z"
6323
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6332
6324
  updated_at: "2026-02-25T14:25:01.000Z"
6333
6325
  - name: BTC
6334
6326
  balance: "0.100020003000400050"
@@ -6336,6 +6328,7 @@ paths:
6336
6328
  coingecko_id: bitcoin
6337
6329
  to_base: 6231.28
6338
6330
  balance_as_of: "2026-02-25T14:25:00.000Z"
6331
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6339
6332
  updated_at: "2026-02-25T14:25:01.000Z"
6340
6333
  "400":
6341
6334
  description: Bad Request
@@ -6401,6 +6394,7 @@ paths:
6401
6394
  coingecko_id: ethereum
6402
6395
  to_base: 28998.44
6403
6396
  balance_as_of: "2026-02-25T14:25:00.000Z"
6397
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6404
6398
  updated_at: "2026-02-25T14:25:01.000Z"
6405
6399
  "400":
6406
6400
  description: Bad Request
@@ -6486,6 +6480,7 @@ paths:
6486
6480
  coingecko_id: ethereum
6487
6481
  to_base: 28998.44
6488
6482
  balance_as_of: "2026-02-25T14:25:00.000Z"
6483
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6489
6484
  updated_at: "2026-02-25T14:25:01.000Z"
6490
6485
  - name: BTC
6491
6486
  balance: "0.100020003000400050"
@@ -6493,6 +6488,7 @@ paths:
6493
6488
  coingecko_id: bitcoin
6494
6489
  to_base: 6231.28
6495
6490
  balance_as_of: "2026-02-25T14:25:00.000Z"
6491
+ exchange_rate_as_of: "2026-02-25T14:20:00.000Z"
6496
6492
  updated_at: "2026-02-25T14:25:01.000Z"
6497
6493
  "401":
6498
6494
  $ref: "#/components/responses/unauthorizedToken"
@@ -6948,60 +6944,35 @@ paths:
6948
6944
  currency: usd
6949
6945
  to_base: 41500
6950
6946
  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
6947
  responses:
6960
6948
  "200":
6961
- description: One or more balance history entries were processed
6949
+ description: All balance history entries were upserted successfully
6962
6950
  content:
6963
6951
  application/json:
6964
6952
  schema:
6965
- $ref: "#/components/schemas/upsertBalanceHistoryResponseObject"
6953
+ $ref: "#/components/schemas/balanceHistoryAccountObject"
6966
6954
  examples:
6967
6955
  balances updated:
6968
6956
  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`."
6957
+ source:
6958
+ type: manual
6959
+ manual_account_id: 119807
6960
+ balances:
6961
+ - id: 601
6962
+ date: "2026-03-01"
6963
+ balance: "41500.0000"
6964
+ currency: usd
6965
+ to_base: 41500
6966
+ crypto_balance: null
6967
+ - id: 602
6968
+ date: "2026-04-01"
6969
+ balance: "41625.5000"
6970
+ currency: usd
6971
+ to_base: 41625.5
6972
+ crypto_balance: null
7003
6973
  "400":
7004
- description: Bad Request
6974
+ description: Bad Request. The entire request is rejected if any row in
6975
+ `balances` fails validation; no rows are updated.
7005
6976
  content:
7006
6977
  application/json:
7007
6978
  schema:
@@ -7022,16 +6993,25 @@ paths:
7022
6993
  message: Request Validation Failure
7023
6994
  errors:
7024
6995
  - errMsg: "`date` must be the first day of a month."
6996
+ request_balances_index: 0
7025
6997
  future date:
7026
6998
  value:
7027
6999
  message: Request Validation Failure
7028
7000
  errors:
7029
7001
  - errMsg: "`date` must not be in the future."
7002
+ request_balances_index: 1
7030
7003
  crypto balance not allowed:
7031
7004
  value:
7032
7005
  message: Request Validation Failure
7033
7006
  errors:
7034
7007
  - errMsg: "`crypto_balance` may only be set when `account_type` is `crypto_manual` or `deleted`."
7008
+ request_balances_index: 0
7009
+ invalid row in bulk request:
7010
+ value:
7011
+ message: Request Validation Failure
7012
+ errors:
7013
+ - errMsg: "`symbol` may not be set when `account_type` is `manual` or `plaid`."
7014
+ request_balances_index: 1
7035
7015
  "401":
7036
7016
  $ref: "#/components/responses/unauthorizedToken"
7037
7017
  "404":
@@ -7253,62 +7233,36 @@ paths:
7253
7233
  - date: "2026-04-01"
7254
7234
  balance: "6500.0000"
7255
7235
  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
7236
  responses:
7265
7237
  "200":
7266
- description: One or more balance history entries were processed
7238
+ description: All balance history entries were upserted successfully
7267
7239
  content:
7268
7240
  application/json:
7269
7241
  schema:
7270
- $ref: "#/components/schemas/upsertBalanceHistoryResponseObject"
7242
+ $ref: "#/components/schemas/balanceHistoryAccountObject"
7271
7243
  examples:
7272
7244
  balances updated:
7273
7245
  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."
7246
+ source:
7247
+ type: crypto_synced
7248
+ crypto_synced_id: 33004
7249
+ symbol: btc
7250
+ balances:
7251
+ - id: 604
7252
+ date: "2026-03-01"
7253
+ balance: "6400.0000"
7254
+ currency: usd
7255
+ to_base: 6400
7256
+ crypto_balance: "0.100020003000400050"
7257
+ - id: 605
7258
+ date: "2026-04-01"
7259
+ balance: "6500.0000"
7260
+ currency: usd
7261
+ to_base: 6500
7262
+ crypto_balance: "0.100020003000400050"
7310
7263
  "400":
7311
- description: Bad Request
7264
+ description: Bad Request. The entire request is rejected if any row in
7265
+ `balances` fails validation; no rows are updated.
7312
7266
  content:
7313
7267
  application/json:
7314
7268
  schema:
@@ -7324,11 +7278,19 @@ paths:
7324
7278
  message: Request Validation Failure
7325
7279
  errors:
7326
7280
  - errMsg: "`date` must be the first day of a month."
7281
+ request_balances_index: 0
7327
7282
  future date:
7328
7283
  value:
7329
7284
  message: Request Validation Failure
7330
7285
  errors:
7331
7286
  - errMsg: "`date` must not be in the future."
7287
+ request_balances_index: 1
7288
+ invalid row in bulk request:
7289
+ value:
7290
+ message: Request Validation Failure
7291
+ errors:
7292
+ - errMsg: "`balance` must be a valid numeric string or number."
7293
+ request_balances_index: 1
7332
7294
  "401":
7333
7295
  $ref: "#/components/responses/unauthorizedToken"
7334
7296
  "404":
@@ -10194,7 +10156,7 @@ paths:
10194
10156
  description: |
10195
10157
  The payee for the new grouped transaction.
10196
10158
  minLength: 0
10197
- maxLength: 1000
10159
+
10198
10160
  category_id:
10199
10161
  type: integer
10200
10162
  format: int64
@@ -10209,8 +10171,6 @@ paths:
10209
10171
  nullable: true
10210
10172
  description: |
10211
10173
  Notes for the grouped transaction.
10212
- minLength: 0
10213
- maxLength: 350
10214
10174
  status:
10215
10175
  type: string
10216
10176
  description: If set, must be either `reviewed` or
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lunch-money/v2-api-spec",
3
- "version": "2.11.0-preview.2",
3
+ "version": "2.11.0-preview.4",
4
4
  "description": "OpenAPI specification and version history for the Lunch Money v2 API",
5
5
  "main": "lunch-money-api-v2.yaml",
6
6
  "files": [
@@ -24,11 +24,15 @@ The Lunch Money API spec uses a modified version of SEMVER for its versioning me
24
24
  - Viewing the balances for currencies associated with both manually managed crypto assets and those that are synced via a synced crypto account (ie: coinbase, kraken, ethereum wallet)
25
25
  - Refreshing synced crypto account balances
26
26
 
27
+ ## v2.9.4 - May 23, 2026
28
+ - Increase allowable length for transaction `notes`.
29
+ - Add `clf`, `eth`, and `ves` to the supported currency codes.
30
+
27
31
  ## v2.9.3 - Apr 27, 2026
28
32
  - Add `xag` and `xau` to the supported currency codes.
29
33
 
30
34
  ## v2.9.2 - Apr 22, 2026
31
- - Increase allowable length for a transaction `payee`
35
+ - Increase allowable length for a transaction `payee`.
32
36
 
33
37
  ## v2.9.1 - Apr 22, 2026
34
38
  - You may now set `archived_at` when modifying a category or tag via the `PUT /categories` or `PUT /tags` endpoints.