@lunch-money/developer-docs 2.11.1-preview.9 → 2.11.2-preview.1

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.
@@ -45,7 +45,7 @@ A few common, low-friction ways to brand an integration:
45
45
 
46
46
  1. **README or docs** — a short "Built with Lunch Money" line plus the Powered by badge linking to <a href="https://lunchmoney.app/" target="_blank" rel="noopener noreferrer">lunchmoney.app</a>
47
47
  2. **App footer or about screen** — the Powered by badge next to your own branding
48
- 3. **Onboarding or connect flow** — official logo when prompting users to authorize or paste an access token
48
+ 3. **Onboarding or connect flow** — official logo when asking users to connect their Lunch Money account through OAuth. Applications intended for other users should not ask them to paste a personal access token; see the [OAuth overview](/oauth)
49
49
  4. **Community listings** — consistent naming ("My Tool for Lunch Money") so users can find and trust your project
50
50
 
51
51
  Keep your own product name primary. Lunch Money branding should signal the connection, not compete with your identity.
@@ -27,9 +27,11 @@ Choose the option to "Set up Demo". This will add categories, accounts, tags and
27
27
  ![Add Demo Data](/images/DemoData.png)
28
28
  :::
29
29
 
30
- ## Getting an access token
30
+ ## Getting a personal access token
31
31
 
32
- Lunch Money API requests are authenticated using the Bearer Token authentication method. In plain English, this means that you will pass a token associated with your budgeting account to Lunch Money. This is so we know which account to operate on and that the request came from someone who can access that account.
32
+ Lunch Money API requests are authenticated using the Bearer Token authentication method. In plain English, this means that you will pass a personal access token associated with your budgeting account to Lunch Money. This is so we know which account to operate on and that the request came from someone who can access that account.
33
+
34
+ This guide uses a personal access token so you can explore the API with your own budgeting account. If you are building an application that other people will connect to Lunch Money, start with the [OAuth overview](/oauth) instead.
33
35
 
34
36
  :::tabs
35
37
 
@@ -39,25 +41,25 @@ Navigate to <a href="https://my.lunchmoney.app/developers" target="_blank" rel="
39
41
  ![Green Budgets Icon](/images/green_budget.png)
40
42
 
41
43
  @tab 2. Request Access Token
42
- In the upper right hand corner of the page, give your access token a label and specify what you are using it for. When you're done, hit the "Request Access Token" button.
44
+ In the upper right hand corner of the page, give your personal access token a label and specify what you are using it for. When you're done, hit the "Request Access Token" button.
43
45
  ![Request Token](/images/RequestAccessToken.png)
44
46
 
45
47
  @tab 3. Save Access Token
46
- After you do this, the web page will show you a long alphanumeric string. This is your access token. Hit the copy button and save this token somewhere safe. It is only shown to you when you create it.
48
+ After you do this, the web page will show you a long alphanumeric string. This is your personal access token. Hit the copy button and save this token somewhere safe. It is only shown to you when you create it.
47
49
  :::
48
50
 
49
- Congratulations! You've got an access token and are ready to make an API request! Later, when you are more comfortable with the API, you can repeat this process to create a new access token associated with your real budget.
51
+ Congratulations! You've got a personal access token and are ready to make an API request! Later, when you are more comfortable with the API, you can repeat this process to create a new personal access token associated with your real budget.
50
52
 
51
53
  > [!WARNING]
52
- > Treat your access tokens like passwords. Don't share them with anyone you don't trust.
54
+ > Treat your personal access tokens like passwords. Don't share them with anyone you don't trust.
53
55
 
54
- If you ever worry that your access token has been compromised, you can always come back to the Developers page and hit the Revoke button.
56
+ If you ever worry that your personal access token has been compromised, you can always come back to the Developers page and hit the Revoke button.
55
57
 
56
58
  > [!NOTE]
57
- > Give your access tokens descriptive names so you can easily identify and revoke them later if needed.
59
+ > Give your personal access tokens descriptive names so you can easily identify and revoke them later if needed.
58
60
 
59
61
 
60
- ## Using your access token
62
+ ## Using your personal access token
61
63
 
62
64
  When you start to write code that makes API calls, you will need to include this token in each request using an Authorization header. Here is an example curl request:
63
65
 
@@ -68,7 +70,7 @@ curl --location 'https://api.lunchmoney.dev/v2/me' \
68
70
 
69
71
  If this doesn't make sense yet, that's OK!
70
72
 
71
- There is an easier way to use your access token to make requests. Head over to the [API Reference Documentation](/v2/docs).
73
+ There is an easier way to use your personal access token to make requests. Head over to the [API Reference Documentation](/v2/docs).
72
74
 
73
75
  :::tabs
74
76
 
@@ -85,6 +87,8 @@ This will pop up a dialog box that you can use to send an API request. This is a
85
87
 
86
88
  From here, you can explore the rest of the Lunch Money API and start thinking about what you might do with it.
87
89
 
90
+ When you are ready to build an application that other Lunch Money users can connect to, [learn how OAuth grants access without asking users to share personal access tokens](/oauth).
91
+
88
92
  ## What can you build?
89
93
 
90
94
  The Lunch Money community has already built a wide variety of tools — automations, importers, dashboards, and more. Check out the <a href="https://lunchmoney.app/developers#community-projects" target="_blank" rel="noopener noreferrer">Developer Tools & Community Projects</a> list for inspiration, or drop by the <a href="https://discord.com/channels/842337014556262411/1134597088504729780" target="_blank" rel="noopener noreferrer">Show and Tell channel</a> on Discord to see what others are sharing.
@@ -10,7 +10,7 @@ The v2 API is available at:
10
10
  https://api.lunchmoney.dev/v2
11
11
  ```
12
12
 
13
- Get your access token from the <a href="https://my.lunchmoney.app/developers" target="_blank" rel="noopener noreferrer">Lunch Money app developers page</a> and include it as a Bearer token in every request:
13
+ To explore the API or work with your own budgeting account, create a personal access token on the <a href="https://my.lunchmoney.app/developers" target="_blank" rel="noopener noreferrer">Developers page</a>. If you are building an application for other Lunch Money users, [use OAuth](/oauth) instead. Both kinds of access token are sent as a Bearer token with each request:
14
14
 
15
15
  ```http
16
16
  Authorization: Bearer YOUR_ACCESS_TOKEN
@@ -59,5 +59,6 @@ Join the conversation in the <a href="https://lunchmoney.app/discord" target="_b
59
59
  **Useful links:**
60
60
  - <a href="/v2/docs">Interactive API Reference</a>
61
61
  - [Getting started guide](/getting-started)
62
+ - [OAuth overview](/oauth)
62
63
  - <a href="https://github.com/lunch-money/awesome-lunchmoney" target="_blank" rel="noopener noreferrer">Awesome Lunch Money Projects</a>
63
64
  - [Contact: devsupport@lunchmoney.app](mailto:devsupport@lunchmoney.app)
@@ -6,23 +6,23 @@ OAuth lets your application access Lunch Money on behalf of a user without askin
6
6
 
7
7
  ## Choose OAuth or a personal access token
8
8
 
9
- | Question | Personal access token | OAuth application and client |
9
+ | Question | Personal access token | OAuth client |
10
10
  | --- | --- | --- |
11
11
  | Whose data can it access? | One budgeting account belonging to the user who created the token | One budgeting account selected by each user who authorizes the application |
12
12
  | Best fit | API exploration, one-off scripts, and short-lived work on your own account | Persistent integrations and applications intended for other users |
13
13
  | How is access granted? | The user creates a token on the [Developers page](https://my.lunchmoney.app/developers) in the Lunch Money web app | The user signs in and approves the permissions requested by the application |
14
14
  | Credential handling | The user keeps the token and sends it with their own API requests; third-party applications should use OAuth instead of asking users to share one | The authorization flow delivers application-specific tokens without asking for a personal token |
15
- | Permissions | Full access to the Lunch Money APIs available for that budgeting account, with no fine-grained permission controls | Only the permissions selected when the application was created |
15
+ | Permissions | Full access to the Lunch Money APIs available for that budgeting account, with no fine-grained permission controls | Only the permissions selected when the OAuth client was registered |
16
16
  | Lifecycle | Created and revoked by the user | Short-lived access tokens and optional finite refresh access; the user can revoke the application's access |
17
17
 
18
18
  Personal access tokens remain useful for quick work on your own account. OAuth is the recommended model for applications and integrations that other Lunch Money users will connect to, as well as automations that need to run over time.
19
19
 
20
20
  ## What limits access
21
21
 
22
- When a developer creates an OAuth application, they select the scopes—the specific permissions—the application needs. Later, when a Lunch Money user authorizes the application, Lunch Money shows them that complete permission set before they approve access. Choose only the permissions the application's features require. A focused permission request is easier for users to understand and trust, and reduces the risk of the application reading or changing data it does not need.
22
+ An OAuth client is an application's registration with Lunch Money. When a developer registers the client, they select the scopes—the specific permissions—the application needs. Later, when a Lunch Money user authorizes the application, Lunch Money shows them that complete permission set before they approve access. Choose only the permissions the application's features require. A focused permission request is easier for users to understand and trust, and reduces the risk of the application reading or changing data it does not need.
23
23
 
24
24
  ## Before you start
25
25
 
26
- You need an active Lunch Money account to [register and manage an OAuth application](/oauth/applications). During development, only the application owner can authorize it. Approval is required before other Lunch Money users can authorize it.
26
+ You need an active Lunch Money account to [register and manage an OAuth client](/oauth/applications) for your application. During development, only the client owner can authorize the application. Approval is required before other Lunch Money users can authorize it.
27
27
 
28
28
  Start with [OAuth concepts](/oauth/concepts), [register a client](/oauth/register-client), and then [implement the authorization-code flow](/oauth/authorization-code). Use the [scope catalog](/oauth/scopes) to plan permissions and [troubleshooting](/oauth/troubleshooting) when a flow fails.
@@ -13,9 +13,9 @@ Use Lunch Money's authorization-server discovery document and configure `token_e
13
13
 
14
14
  ## Redirects
15
15
 
16
- Use a redirect mechanism that returns control to your app and that your platform can bind to it. Claimed Universal Links or Android App Links provide stronger app ownership than a custom URI scheme when correctly configured. Custom schemes must be distinctive and protected against interception.
16
+ Use a redirect mechanism that returns control to your app and that your platform can bind to it. Claimed Universal Links or Android App Links provide stronger app ownership than a custom URI scheme when correctly configured. A private-use scheme must contain a dot, such as `app.example.demo:/oauth/callback`, and must be protected against interception.
17
17
 
18
- The loopback callbacks supported for confidential web development do not define native or desktop redirect support. Follow the native redirect choices accepted during client registration; do not assume the confidential web-client loopback rules apply.
18
+ Native clients may use an HTTP loopback redirect with `localhost`, `127.0.0.1`, or `[::1]`. The scheme, host, path, and query string must exactly match the registered URI, but the port may differ so the application can bind an ephemeral port at runtime. The exception applies only to loopback redirects for native clients; native HTTPS and private-use scheme redirects must match every component of the registered URI exactly.
19
19
 
20
20
  ## Store and renew tokens
21
21
 
@@ -45,9 +45,9 @@ This proposal makes these additional decisions:
45
45
  - Map non-CRUD mutations by effect: Plaid and synced-crypto refresh operations
46
46
  use `:update`; transaction split/group and their reversals use
47
47
  `transactions:update`; balance-history and budget upserts use `:update`.
48
- - Let `transactions:read` expose attachment IDs and metadata, while requiring
49
- explicit `transaction_attachments:*` scopes to download, attach, or delete
50
- files.
48
+ - Keep attachment metadata and download access behind
49
+ `transaction_attachments:read`. The other `transaction_attachments:*` scopes
50
+ separately authorize attaching or deleting files.
51
51
 
52
52
  ## Package direction
53
53
 
@@ -28,17 +28,18 @@ The client type cannot be changed after registration. See [OAuth concepts](/oaut
28
28
 
29
29
  A redirect URI tells Lunch Money where to return the user after authorization. Register every callback address your application will use. Confidential web clients must match every component of a registered URI, including its scheme, host, port, path, and query string. Native-client loopback redirects use the same exact matching except that the ephemeral port is ignored.
30
30
 
31
- Web applications normally use an HTTPS callback. If you need a callback for local development, review the [loopback guidance](/oauth/development#local-loopback-callbacks) before registering one. Mobile and desktop applications may use an app-specific URL scheme or verified HTTPS link accepted by the Developer Portal.
31
+ Web applications normally use an HTTPS callback. If you need a callback for local development, review the [loopback guidance](/oauth/development#local-loopback-callbacks) before registering one. Mobile and desktop applications may use a private-use scheme containing a dot, such as `app.example.demo:/oauth/callback`, or a verified HTTPS link accepted by the Developer Portal.
32
32
 
33
33
  ## Register the OAuth client
34
34
 
35
35
  Open the [new OAuth client form](/oauth/applications/new) in the Developer Portal. Then:
36
36
 
37
37
  1. Describe the application so Lunch Money users can understand who built it and what it does.
38
- 2. Choose its client type.
39
- 3. Add at least one redirect URI.
40
- 4. Select the planned scopes.
41
- 5. Accept the current Lunch Money API Terms of Use and select **Register OAuth client**.
38
+ 2. Provide a monitored support email where users can reach you if authorization fails.
39
+ 3. Choose its client type.
40
+ 4. Add at least one redirect URI.
41
+ 5. Select the planned scopes.
42
+ 6. Accept the current Lunch Money API Terms of Use and select **Register OAuth client**.
42
43
 
43
44
  After registration, record the client ID in your application configuration. A client ID identifies the registration but is not a secret.
44
45
 
@@ -18,23 +18,35 @@ Deleted clients disappear from the owner's Developer Portal.
18
18
 
19
19
  ## Prepare for review
20
20
 
21
- Submitting a client for review is how you make your application authorizable by Lunch Money users other than yourself. You can create and test a client with only basic information, but review requires a complete, user-facing application profile and production-ready configuration.
21
+ Submitting a client for review is how you make your application authorizable by Lunch Money users other than yourself. Registration already requires basic information, including a support email, but review requires a complete, user-facing application profile and production-ready configuration.
22
22
 
23
- Before requesting review, provide:
23
+ Before requesting review, make sure the client has:
24
24
 
25
25
  - an application description, developer name, and logo so users can identify the application and who created it;
26
26
  - a monitored support email where users and Lunch Money can reach you;
27
27
  - a publicly accessible homepage URL where users can learn about the application;
28
28
  - a publicly accessible privacy policy URL explaining how the application handles user data;
29
- - at least one eligible production HTTPS redirect URI;
29
+ - at least one eligible redirect URI—a confidential web client needs a non-loopback production HTTPS redirect, while a native client may use a private-use scheme or loopback redirect;
30
30
  - a recognized, supported scope set and an explanation of why the application needs each permission; and
31
31
  - acceptance of the current Lunch Money API Terms of Use.
32
32
 
33
+ The privacy policy must be available at a direct, stable public URL and explain how the application collects, uses, stores, shares, and deletes user data. A published privacy-policy page in a public source-code repository can satisfy this requirement. An in-app page that requires installation or sign-in, or a link to source code without a clear privacy policy, does not.
34
+
33
35
  Fully test the client before submission. A confidential web client also needs at least one active, non-expired secret; a native or public client does not.
34
36
 
35
37
  Explain which features use each requested permission, how that access benefits users, and why narrower scopes are insufficient. If the client includes `offline_access`, explain why the integration must operate while the user is absent. You may also provide documentation, source-code, and demonstration URLs or context about changes made after earlier feedback.
36
38
 
37
- A client may retain owner-only loopback callbacks alongside its production HTTPS callback, but a loopback-only client is not ready for review.
39
+ Open-source applications are welcome. If your source code is public, include the repository URL in the review request's additional context. It can help the reviewer understand how your application uses Lunch Money data and the permissions it requests. Publishing source code is optional and is not required for approval.
40
+
41
+ A confidential web client may retain owner-only loopback callbacks alongside its production HTTPS callback, but it still needs a non-loopback production HTTPS redirect before review.
42
+
43
+ ### Native applications
44
+
45
+ You do not need to create a standalone marketing website for a native application. Its public Apple App Store or Google Play listing can serve as the homepage if it clearly explains what the application does and identifies the developer. A public pre-release listing, project page, or README in a public source-code repository can also work.
46
+
47
+ If you provide a pre-release listing or beta-testing link, use the review request's additional context to explain how to access it. Include any required opt-in steps, supported platforms or devices, and other information the reviewer needs to evaluate the application. Do not include passwords, client secrets, tokens, or other credentials.
48
+
49
+ Native clients may be reviewed with loopback or private-use scheme redirects.
38
50
 
39
51
  ## Submit, cancel, or revise
40
52
 
@@ -71,11 +71,11 @@ View and manage all supported Lunch Money data
71
71
  | <a id="scope-manual-accounts-delete"></a>`manual_accounts:delete` | Delete manually managed accounts | `deleteManualAccount` |
72
72
  | <a id="scope-plaid-accounts-read"></a>`plaid_accounts:read` | View accounts connected through Plaid | `getAllPlaidAccounts`, `getPlaidAccountById` |
73
73
  | <a id="scope-plaid-accounts-update"></a>`plaid_accounts:update` | Request a Plaid account refresh, which may import new transactions | `triggerPlaidAccountFetch` |
74
- | <a id="scope-transactions-read"></a>`transactions:read` | View transactions, including split and group information and attachment metadata | `getAllTransactions`, `getTransactionById` |
74
+ | <a id="scope-transactions-read"></a>`transactions:read` | View transactions, including split and group information | `getAllTransactions`, `getTransactionById` |
75
75
  | <a id="scope-transactions-create"></a>`transactions:create` | Create transactions | `createNewTransactions` |
76
76
  | <a id="scope-transactions-update"></a>`transactions:update` | Update, split, unsplit, group, and ungroup transactions | `updateTransactions`, `updateTransaction`, `groupTransactions`, `ungroupTransactions`, `splitTransaction`, `unsplitTransaction` |
77
77
  | <a id="scope-transactions-delete"></a>`transactions:delete` | Delete transactions | `deleteTransactions`, `deleteTransactionById` |
78
- | <a id="scope-transaction-attachments-read"></a>`transaction_attachments:read` | Get download access to transaction attachments | `getTransactionAttachmentUrl` |
78
+ | <a id="scope-transaction-attachments-read"></a>`transaction_attachments:read` | View transaction attachment metadata and get download access to attachments | `getTransactionAttachmentUrl` |
79
79
  | <a id="scope-transaction-attachments-create"></a>`transaction_attachments:create` | Attach files to transactions | `attachFileToTransaction` |
80
80
  | <a id="scope-transaction-attachments-delete"></a>`transaction_attachments:delete` | Delete transaction attachments | `deleteTransactionAttachment` |
81
81
  | <a id="scope-tags-read"></a>`tags:read` | View tags | `getAllTags`, `getTagById` |
@@ -29,11 +29,24 @@ Match on `error` when it is returned, verify `state`, and treat `error_descripti
29
29
  | `invalid_scope` | The client does not have a usable registered scope set | Open the client in the [Developer Portal](/oauth/applications) and review its assigned scopes. Registered clients always use that complete set. |
30
30
  | `access_denied` | The user declined or the application is unavailable to that user | Treat denial normally. During development, only the owner may authorize; other users require an active approved application. |
31
31
 
32
- ### Redirect URI mismatch
32
+ ### Users cannot authorize an unapproved client
33
33
 
34
- If the redirect URI does not exactly match one registered for the client, Lunch Money cannot safely return the browser to it. Instead, Lunch Money shows an error page explaining that it could not return the user to the application. The page displays `REDIRECT_URI_MISMATCH`, a request or reference ID, a timestamp, and the application name and public client ID when they are available.
34
+ Until a client is approved, only its owner may authorize the application. Anyone else is stopped at the consent screen and is never returned to your application, so you will see no callback and no `error` parameter for these attempts.
35
35
 
36
- Ask the user to report those displayed details—not the complete attempted URL, credentials, authorization codes, tokens, cookies, or PKCE values. Open the client in the [Developer Portal](/oauth/applications), find its registered redirect URIs, and compare the complete URL with the value your application sent. The two values must be identical.
36
+ Those users are shown the support email registered with your client so they can reach you. If you did not expect authorization to be unavailable, check the client in the [Developer Portal](/oauth/applications). A client stays in development until it is submitted for review and approved. A rejected or disabled client also prevents other users from authorizing the application.
37
+
38
+ ### Redirect URI problems
39
+
40
+ If the callback address cannot be matched to one registered for the client, Lunch Money cannot safely return the browser to your application. It stops locally and shows the user a page explaining what happened, rather than redirecting with an `error`. Your application receives no callback for these attempts.
41
+
42
+ The page displays one of two codes, a UTC timestamp, and the application name and public client ID once the client has been resolved.
43
+
44
+ | Code | Likely cause | What to do |
45
+ | --- | --- | --- |
46
+ | `redirect_uri_mismatch` | The address your application sent is not registered for the client, or differs from a registered one | Open the client in the [Developer Portal](/oauth/applications) and compare the address with its registered redirect URIs. Web-client redirects and native HTTPS or private-use scheme redirects must match every component exactly. For a native HTTP loopback redirect, the scheme, host, path, and query string must match, but the ephemeral port may differ. See [local callback failures](#local-callback-failures). |
47
+ | `redirect_uri_missing` | No `redirect_uri` was sent, and the client has more than one registered, so Lunch Money cannot choose | Send the parameter explicitly. A client with exactly one registered address may omit it; Lunch Money then uses the registered value. |
48
+
49
+ The page offers the user a prefilled message addressed to the support email registered with your client. It contains the error code, the timestamp, the application name and client ID, and the callback address your application sent, reduced to its origin and path with any query string removed. Compare that sanitized callback address with the redirect URIs registered for the client, then correct either the registered URI or the address your application sends.
37
50
 
38
51
  ## Callback validation failures
39
52
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lunch-money/developer-docs",
3
- "version": "2.11.1-preview.9",
3
+ "version": "2.11.2-preview.1",
4
4
  "description": "Developer documentation content for Lunch Money APIs",
5
5
  "exports": {
6
6
  ".": "./package.json",
@@ -10,7 +10,7 @@ All API requests require a Bearer token in the `Authorization` header:
10
10
  Authorization: Bearer YOUR_ACCESS_TOKEN
11
11
  ```
12
12
 
13
- Get your access token from the <a href="https://my.lunchmoney.app/developers" target="_blank" rel="noopener noreferrer">Lunch Money Developers page</a>. See the [Getting started guide](/getting-started) for a step-by-step walkthrough including how to create a test budget.
13
+ Use a personal access token for API exploration or work with your own budgeting account. The [Getting started guide](/getting-started) walks through creating one on the <a href="https://my.lunchmoney.app/developers" target="_blank" rel="noopener noreferrer">Lunch Money Developers page</a> and making your first request. Applications built for other Lunch Money users should use an [OAuth access token issued after the user authorizes the application](/oauth).
14
14
 
15
15
  ## Base URL
16
16
 
@@ -5,9 +5,12 @@ The Lunch Money API spec uses a modified version of SEMVER for its versioning me
5
5
  - The minor version represents the number of main endpoints the current version of the spec supports. For example, a version of the API that supports the /me, /categories, and /transactions endpoints would have a minor version of 3.
6
6
  - The revision number represents the number of updates since the last endpoint was added. For example, each time changes are made to one of the existing three APIs as described above, the revision number will be bumped.
7
7
 
8
+ ## v2.11.2 - TBD
9
+ - Add OAuth 2.0 bearer-token authentication to the v2 API, allowing applications to access Lunch Money on behalf of users who authorize them
10
+ - Enforce required OAuth scopes for every v2 operation and publish the scope and scope-group catalog mapped to V2 `operationId` values
11
+ - Document the OAuth 2.0 authorization-code flow used to obtain access tokens
12
+
8
13
  ## v2.11.1 - TBD
9
- - Add the OAuth scope and scope-group catalog mapped to V2 `operationId` values
10
- - Document OAuth 2.0 authorization-code endpoints and required OAuth scopes for every V2 operation
11
14
  - Add `GET /me/account/settings` and `PUT /me/account/settings` for account-level settings
12
15
  - Add `GET /me/user/settings` and `PUT /me/user/settings` for user-level display and formatting preferences
13
16
  - Add `GET /me/user/account/settings` and `PUT /me/user/account/settings` for settings specific to a user and budgeting account
@@ -4,9 +4,9 @@ info:
4
4
  description: |-
5
5
  ### Introduction
6
6
 
7
- Welcome to the Lunch Money v2 API reference. This is the **v2.11.1** spec.
7
+ Welcome to the Lunch Money v2 API reference. This is the **v2.11.2** spec.
8
8
 
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).
9
+ The API is available at `https://api.lunchmoney.dev/v2`. Use a personal access token from the [Lunch Money Developers page](https://my.lunchmoney.app/developers) for API exploration or work with your own budgeting account. Applications built for other Lunch Money users should use an [OAuth access token issued after the user authorizes the application](https://lunchmoney.dev/oauth).
10
10
 
11
11
 
12
12
  **Try it from these docs**
@@ -2712,8 +2712,11 @@ components:
2712
2712
  type: array
2713
2713
  nullable: false
2714
2714
  description: A list of objects that describe any attachments to the
2715
- transaction. This is only present when the `include_files` query
2716
- parameter is set to true.
2715
+ transaction. For OAuth clients, this property is available only
2716
+ with the `transaction_attachments:read` scope. Without that scope,
2717
+ an absent `files` property does not mean the transaction has no
2718
+ attachments. See the operation description for its attachment
2719
+ behavior.
2717
2720
  items:
2718
2721
  $ref: "#/components/schemas/transactionAttachmentObject"
2719
2722
  source:
@@ -3008,7 +3011,10 @@ components:
3008
3011
  type: array
3009
3012
  nullable: false
3010
3013
  description: A list of objects that describe any attachments to the
3011
- transaction
3014
+ transaction. OAuth clients also need the
3015
+ `transaction_attachments:read` scope. Without it, this property is
3016
+ omitted rather than returned as an empty array, so an absent
3017
+ `files` property does not mean the transaction has no attachments.
3012
3018
  items:
3013
3019
  $ref: "#/components/schemas/transactionAttachmentObject"
3014
3020
  required:
@@ -5136,11 +5142,11 @@ components:
5136
5142
  manual_accounts:delete: "Delete manually managed accounts"
5137
5143
  plaid_accounts:read: "View accounts connected through Plaid"
5138
5144
  plaid_accounts:update: "Request a Plaid account refresh, which may import new transactions"
5139
- transactions:read: "View transactions, including split and group information and attachment metadata"
5145
+ transactions:read: "View transactions, including split and group information"
5140
5146
  transactions:create: "Create transactions"
5141
5147
  transactions:update: "Update, split, unsplit, group, and ungroup transactions"
5142
5148
  transactions:delete: "Delete transactions"
5143
- transaction_attachments:read: "Get download access to transaction attachments"
5149
+ transaction_attachments:read: "View transaction attachment metadata and get download access to attachments"
5144
5150
  transaction_attachments:create: "Attach files to transactions"
5145
5151
  transaction_attachments:delete: "Delete transaction attachments"
5146
5152
  tags:read: "View tags"
@@ -9667,6 +9673,9 @@ paths:
9667
9673
  description: By default, the `files` property is not included in the
9668
9674
  response. Set to true if you'd like the responses to include a list
9669
9675
  of objects that describe any files attached to the transactions.
9676
+ OAuth clients must have both `transactions:read` and
9677
+ `transaction_attachments:read`; otherwise the request returns a
9678
+ `403` `insufficient_scope` error.
9670
9679
  - name: limit
9671
9680
  in: query
9672
9681
  schema:
@@ -9950,7 +9959,10 @@ paths:
9950
9959
  successfully inserted.<br>
9951
9960
  - `skipped_duplicates`: A list of
9952
9961
  transactions that were duplicates of existing transactions and were not
9953
- inserted.
9962
+ inserted.<p>
9963
+
9964
+ For OAuth clients, returned transactions include the `files` property
9965
+ only when the client has the `transaction_attachments:read` scope.
9954
9966
  operationId: createNewTransactions
9955
9967
  security:
9956
9968
  - bearerSecurity: []
@@ -10394,7 +10406,10 @@ paths:
10394
10406
 
10395
10407
  Each transaction in the array **must** include an `id` property to identify which transaction to update, along with at least one other property to be updated. For example, a transaction object that contains only an `id` and `category_id` property is valid.<br><br>
10396
10408
 
10397
- The request can include between 1 and 500 transactions to update in a single call.
10409
+ The request can include between 1 and 500 transactions to update in a single call.<br><br>
10410
+
10411
+ For OAuth clients, returned transactions include the `files` property
10412
+ only when the client has the `transaction_attachments:read` scope.
10398
10413
  operationId: updateTransactions
10399
10414
  security:
10400
10415
  - bearerSecurity: []
@@ -10877,7 +10892,8 @@ paths:
10877
10892
  added to transactions that were inserted or updated via the API.
10878
10893
 
10879
10894
  - `files` will be a list of objects that describe any attachments to the
10880
- transaction.
10895
+ transaction. For OAuth clients, this property is included only when the
10896
+ client has the `transaction_attachments:read` scope.
10881
10897
 
10882
10898
 
10883
10899
  If `is_group_parent` is true in the returned transaction, the object will also
@@ -11132,7 +11148,11 @@ paths:
11132
11148
  It is also possible to provide only the properties to be updated in the
11133
11149
  request body, as long as the request includes at least one of the
11134
11150
  properties that is not listed above. For example a request body that contains only
11135
- an `category_id` attribute is valid.
11151
+ an `category_id` attribute is valid.<br><br>
11152
+
11153
+ For OAuth clients, the returned transaction includes the `files`
11154
+ property only when the client has the
11155
+ `transaction_attachments:read` scope.
11136
11156
 
11137
11157
  operationId: updateTransaction
11138
11158
  security:
@@ -11348,7 +11368,11 @@ paths:
11348
11368
  transaction. The grouped transactions will
11349
11369
 
11350
11370
  be included in the `children` property of the transaction returned in
11351
- the response
11371
+ the response.<br><br>
11372
+
11373
+ For OAuth clients, the returned group and its children include the
11374
+ `files` property only when the client has the
11375
+ `transaction_attachments:read` scope.
11352
11376
  operationId: groupTransactions
11353
11377
  security:
11354
11378
  - bearerSecurity: []
@@ -11701,7 +11725,11 @@ paths:
11701
11725
 
11702
11726
  To see the details of the original parent transaction after it has been
11703
11727
  split, use the `GET /transactions/{id}` endpoint and pass the value of
11704
- the `split_parent_id` of one of the children.
11728
+ the `split_parent_id` of one of the children.<br><br>
11729
+
11730
+ For OAuth clients, the returned parent and its children include the
11731
+ `files` property only when the client has the
11732
+ `transaction_attachments:read` scope.
11705
11733
  operationId: splitTransaction
11706
11734
  security:
11707
11735
  - bearerSecurity: []